feat: add community contribution ranks

This commit is contained in:
2026-09-29 22:18:57 +03:30
parent 0f6220f72c
commit 77567178ad
46 changed files with 2206 additions and 23 deletions

View File

@@ -1,10 +1,12 @@
from django.contrib import admin
from import_export.admin import ImportExportModelAdmin
from django.utils import timezone
from core.admin import BaseModelAdmin, SoftDeleteListFilter
from core.templatetags.jalali import jdate
from apps.events.models import Event, Registration
from apps.events.resources import EventResource, RegistrationResource
from apps.events.services import verify_registration_attendance
@admin.register(Event)
@@ -107,13 +109,17 @@ class RegistrationAdmin(BaseModelAdmin, ImportExportModelAdmin):
readonly_fields = (
'ticket_id', 'registered_at', 'confirmation_notification_sent_at',
'cancellation_notification_sent_at', 'discount_code', 'discount_amount',
'final_price', 'deleted_at',
'final_price', 'deleted_at', 'attendance_verified_at',
'attendance_verified_by', 'attendance_verification_source',
)
fieldsets = (
('Registration Details', {'fields': (
'user', 'event', 'status', 'registered_at', 'ticket_id',
'confirmation_notification_sent_at', 'cancellation_notification_sent_at',
)}),
('Attendance verification', {'fields': (
'attendance_verified_at', 'attendance_verified_by', 'attendance_verification_source',
)}),
('Pricing & Discount', {
'fields': ('discount_code', 'discount_amount', 'final_price'),
'classes': ('collapse',),
@@ -144,8 +150,28 @@ class RegistrationAdmin(BaseModelAdmin, ImportExportModelAdmin):
@admin.action(description='Mark selected registrations as attended')
def mark_attended(self, request, queryset):
queryset.update(status=Registration.StatusChoices.ATTENDED)
self.message_user(request, f'Marked {queryset.count()} registrations as attended.')
count = 0
for registration in queryset:
verify_registration_attendance(
registration,
verifier=request.user,
source=Registration.AttendanceVerificationSource.STAFF_ADMIN,
)
count += 1
self.message_user(request, f'Marked {count} registrations as attended.')
def save_model(self, request, obj, form, change):
previous_status = None
if change and obj.pk:
previous_status = Registration.all_objects.filter(pk=obj.pk).values_list("status", flat=True).first()
if (
obj.status == Registration.StatusChoices.ATTENDED
and (previous_status != Registration.StatusChoices.ATTENDED or not obj.attendance_verified_at)
):
obj.attendance_verified_by = request.user
obj.attendance_verified_at = timezone.now()
obj.attendance_verification_source = Registration.AttendanceVerificationSource.STAFF_ADMIN
super().save_model(request, obj, form, change)
@admin.action(description='Restore selected registrations')
def restore_registrations(self, request, queryset):