kitsune/users/admin.py (107 lines of code) (raw):
from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.db.models import Q
from kitsune.products.models import Product
from kitsune.users import monkeypatch
from kitsune.users.models import AccountEvent, Profile
class SumoUserAdmin(UserAdmin):
list_display = UserAdmin.list_display + ("last_login",)
class ProfileAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# limit the subscriptions choices to the appropriate products
associated_products = [product.id for product in self.initial.get("products", [])]
products = Product.objects.filter(Q(pk__in=associated_products) | ~Q(codename__exact=""))
self.fields["products"].queryset = products
self.fields["products"].required = False
delete_avatar = forms.BooleanField(
required=False, help_text=("Check to remove the user's avatar.")
)
class Meta(object):
model = Profile
exclude = ()
class ProfileAdmin(admin.ModelAdmin):
actions = None
fieldsets = (
(
None,
{
"fields": [
"user",
"name",
"public_email",
"bio",
"is_fxa_migrated",
"fxa_uid",
"fxa_refresh_token",
"zendesk_id",
"fxa_avatar",
],
},
),
(
"Contact Info",
{
"fields": [
"website",
"twitter",
"community_mozilla_org",
"people_mozilla_org",
"matrix_handle",
],
"classes": ["collapse"],
},
),
(
"Location",
{
"fields": ["timezone", ("country", "city"), "locale"],
"classes": ["collapse"],
},
),
(
"Subscriptions",
{
"fields": ["products"],
"classes": ["collapse"],
},
),
)
form = ProfileAdminForm
list_display = ["full_user", "name", "get_products"]
list_select_related = True
list_filter = ["is_fxa_migrated", "country"]
search_fields = ["user__username", "user__email", "name", "fxa_uid"]
autocomplete_fields = ["user"]
readonly_fields = ["fxa_refresh_token", "zendesk_id"]
def get_products(self, obj):
"""Get a list of products that a user is subscribed to."""
return ",".join([product.title for product in obj.products.all()])
def has_delete_permission(self, request, obj=None):
return False
def full_user(self, obj):
if obj.name:
return "%s <%s>" % (obj.user.username, obj.name)
else:
return obj.user.username
full_user.short_description = "User" # type: ignore
def save_model(self, request, obj, form, change):
delete_avatar = form.cleaned_data.pop("delete_avatar", False)
if delete_avatar and obj.avatar:
obj.avatar.delete()
obj.save()
class AccountEventAdmin(admin.ModelAdmin):
"""Admin entry for SET tokens."""
list_display = ["status", "event_type", "fxa_uid"]
list_filter = (
"event_type",
"status",
)
search_fields = ["profile__user__username", "profile__name", "status", "fxa_uid"]
autocomplete_fields = ["profile"]
class Meta:
model = AccountEvent
admin.site.unregister(User)
admin.site.register(User, SumoUserAdmin)
admin.site.register(Profile, ProfileAdmin)
admin.site.register(AccountEvent, AccountEventAdmin)
monkeypatch.patch_all()