Changeset View
Changeset View
Standalone View
Standalone View
bid_main/admin.py
| import urllib.parse | import urllib.parse | ||||
| from django.contrib import admin | from django.contrib import admin | ||||
| from django.contrib import messages | from django.contrib import messages | ||||
| from django.contrib.admin.models import LogEntry, CHANGE | from django.contrib.admin.models import LogEntry, CHANGE | ||||
| from django.contrib.contenttypes.models import ContentType | |||||
| from django.contrib.auth.admin import UserAdmin as BaseUserAdmin | from django.contrib.auth.admin import UserAdmin as BaseUserAdmin | ||||
| from django.contrib.contenttypes.models import ContentType | |||||
| from django.utils import timezone | |||||
| from django.utils.html import format_html | from django.utils.html import format_html | ||||
| from django.utils.translation import ugettext_lazy as _ | from django.utils.translation import ugettext_lazy as _ | ||||
| from . import models | from . import models | ||||
| from .admin_decorators import short_description | from .admin_decorators import short_description | ||||
| # Configure the admin site. Easier than creating our own AdminSite subclass. | # Configure the admin site. Easier than creating our own AdminSite subclass. | ||||
| # Text to put at the end of each page's <title>. | # Text to put at the end of each page's <title>. | ||||
| ▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | |||||
| @short_description("Deactivate selected users") | @short_description("Deactivate selected users") | ||||
| def deactivate(modeladmin, request, queryset): | def deactivate(modeladmin, request, queryset): | ||||
| queryset.update(is_active=False) | queryset.update(is_active=False) | ||||
| _add_change_log(queryset, request, "Deactivated user") | _add_change_log(queryset, request, "Deactivated user") | ||||
| @short_description("Request deletion of selected users") | @short_description("Request deletion of selected users") | ||||
| def request_deletion(modeladmin, request, queryset): | def request_deletion(modeladmin, request, queryset): | ||||
| matched_count: int = queryset.update(deletion_requested=True) | # FIXME(anna): this should probably tie into the rest of the deletion logic | ||||
| _add_change_log(queryset, request, "Marked user as 'deletion requested'") | # instead of just setting the field and nothing else. | ||||
| modeladmin.message_user( | now = timezone.now() | ||||
| request, f"{matched_count} users marked for deletion", level=messages.WARNING | matched_count: int = queryset.filter( | ||||
| ) | # Do not modify any existing deletion request dates | ||||
| date_deletion_requested__isnull=True | |||||
| ).update(date_deletion_requested=now) | |||||
| msg = f"{matched_count} users marked for deletion" | |||||
| _add_change_log(queryset, request, msg) | |||||
| modeladmin.message_user(request, msg, level=messages.WARNING) | |||||
| @short_description("Send address confirmation mails to selected users") | @short_description("Send address confirmation mails to selected users") | ||||
| def send_confirm_mails(modeladmin, request, queryset): | def send_confirm_mails(modeladmin, request, queryset): | ||||
| from .email import send_verify_address | from .email import send_verify_address | ||||
| mailed = { | mailed = { | ||||
| True: set(), | True: set(), | ||||
| Show All 20 Lines | def send_confirm_mails(modeladmin, request, queryset): | ||||
| else: | else: | ||||
| level = messages.INFO | level = messages.INFO | ||||
| msg = f"Sent mail to {mailed_ok}." | msg = f"Sent mail to {mailed_ok}." | ||||
| modeladmin.message_user(request, msg, level=level) | modeladmin.message_user(request, msg, level=level) | ||||
| @admin.register(models.User) | @admin.register(models.User) | ||||
| class UserAdmin(BaseUserAdmin): | class UserAdmin(BaseUserAdmin): | ||||
| def deletion_requested(self, obj): | |||||
| return obj.date_deletion_requested is not None | |||||
| deletion_requested.boolean = True | |||||
sybren: I don't think you have to define this function above the regular attributes. If possible, move… | |||||
| inlines = (UserSettingInline, UserNotesInline) | inlines = (UserSettingInline, UserNotesInline) | ||||
| fieldsets = ( | fieldsets = ( | ||||
| ( | ( | ||||
| None, | None, | ||||
| { | { | ||||
| "fields": ( | "fields": ( | ||||
| "email", | "email", | ||||
| "nickname", | "nickname", | ||||
| "deletion_requested", | |||||
| "avatar", | "avatar", | ||||
| "email_change_preconfirm", | "email_change_preconfirm", | ||||
| "password", | "password", | ||||
| "full_name", | "full_name", | ||||
| "roles", | "roles", | ||||
| "private_badges", | "private_badges", | ||||
| ) | ) | ||||
| }, | }, | ||||
| Show All 14 Lines | fieldsets = ( | ||||
| ( | ( | ||||
| _("Important dates"), | _("Important dates"), | ||||
| { | { | ||||
| "fields": ( | "fields": ( | ||||
| "date_joined", | "date_joined", | ||||
| "last_update", | "last_update", | ||||
| "confirmed_email_at", | "confirmed_email_at", | ||||
| "privacy_policy_agreed", | "privacy_policy_agreed", | ||||
| "date_deletion_requested", | |||||
| ), | ), | ||||
| "classes": ("collapse",), | "classes": ("collapse",), | ||||
| }, | }, | ||||
| ), | ), | ||||
| ( | ( | ||||
| _("Login info"), | _("Login info"), | ||||
| { | { | ||||
| "fields": ( | "fields": ( | ||||
| Show All 26 Lines | list_display = ( | ||||
| "last_update", | "last_update", | ||||
| "confirmed_email_at", | "confirmed_email_at", | ||||
| "links", | "links", | ||||
| ) | ) | ||||
| list_display_links = ("email", "full_name") | list_display_links = ("email", "full_name") | ||||
| list_filter = ( | list_filter = ( | ||||
| "roles", | "roles", | ||||
| "is_active", | "is_active", | ||||
| "deletion_requested", | "date_deletion_requested", | ||||
| "groups", | "groups", | ||||
| "confirmed_email_at", | "confirmed_email_at", | ||||
| "is_staff", | "is_staff", | ||||
| "is_superuser", | "is_superuser", | ||||
| "date_joined", | "date_joined", | ||||
| "privacy_policy_agreed", | "privacy_policy_agreed", | ||||
| ) | ) | ||||
| list_per_page = 12 | list_per_page = 12 | ||||
| search_fields = ("email", "full_name", "email_change_preconfirm", "nickname") | search_fields = ("email", "full_name", "email_change_preconfirm", "nickname") | ||||
| ordering = ("-last_update",) | ordering = ("-last_update",) | ||||
| readonly_fields = ("deletion_requested",) | readonly_fields = ("date_deletion_requested",) | ||||
| actions = [ | actions = [ | ||||
| request_deletion, | request_deletion, | ||||
| activate, | activate, | ||||
| deactivate, | deactivate, | ||||
| make_staff, | make_staff, | ||||
| unmake_staff, | unmake_staff, | ||||
| send_confirm_mails, | send_confirm_mails, | ||||
| ▲ Show 20 Lines • Show All 125 Lines • Show Last 20 Lines | |||||
I don't think you have to define this function above the regular attributes. If possible, move it down to the other functions.