from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from program.models import ( Category, FundingCategory, Language, LicenseType, LinkType, MusicFocus, RRule, Topic, Type, UserProfile, ) class AdminWithNameSlugIsActive(admin.ModelAdmin): list_display = ("name", "slug", "is_active") class AdminWithNameType(admin.ModelAdmin): list_display = ("name", "type") class LanguageAdmin(admin.ModelAdmin): list_display = ("name", "is_active") class RRuleAdmin(admin.ModelAdmin): list_display = ("name", "freq", "interval", "by_set_pos", "by_weekdays", "count") class UserProfileInline(admin.StackedInline): model = UserProfile fields = ("cba_username", "cba_user_token") can_delete = False verbose_name_plural = "Profile" fk_name = "user" class UserProfileUserAdmin(UserAdmin): inlines = (UserProfileInline,) def get_queryset(self, request): """Let common users only edit their own profile""" if not request.user.is_superuser: return super(UserAdmin, self).get_queryset(request).filter(pk=request.user.id) return super(UserAdmin, self).get_queryset(request) def get_readonly_fields(self, request, obj=None): """Limit field access for common users""" if not request.user.is_superuser: return ( "username", "is_staff", "is_superuser", "is_active", "date_joined", "last_login", "groups", "user_permissions", ) return list() def get_inline_instances(self, request, obj=None): """Append profile fields to UserAdmin""" if not obj: return list() return super(UserProfileUserAdmin, self).get_inline_instances(request, obj) admin.site.unregister(User) admin.site.register(User, UserProfileUserAdmin) admin.site.register(Category, AdminWithNameSlugIsActive) admin.site.register(FundingCategory, AdminWithNameSlugIsActive) admin.site.register(Language, LanguageAdmin) admin.site.register(LinkType, AdminWithNameType) admin.site.register(LicenseType, AdminWithNameType) admin.site.register(MusicFocus, AdminWithNameSlugIsActive) admin.site.register(RRule, RRuleAdmin) admin.site.register(Topic, AdminWithNameSlugIsActive) admin.site.register(Type, AdminWithNameSlugIsActive)