diff --git a/housewars/admin.py b/housewars/admin.py deleted file mode 100644 index dd42bd2..0000000 --- a/housewars/admin.py +++ /dev/null @@ -1,107 +0,0 @@ -from django.contrib import admin -from django.contrib import messages -from django.utils.translation import ngettext -from django.db.models import Sum, F -from django.db.models.functions import Coalesce - -from .models import Activity, House, Teacher, PointsEntry, UserEntry - - -@admin.register(Activity) -class ActivityAdmin(admin.ModelAdmin): - fieldsets = [ - (None, {'fields': ['name']}), - ('Activity Information', { - 'fields': ['quota', 'time']}), - ] - - list_display = ['name', 'time', 'quota', 'teacher', 'hawk_signups', - 'great_grey_signups', 'snowy_signups', 'eagle_signups'] - - @admin.display(description='Hawk Signups') - def hawk_signups(self, obj): - return str(UserEntry.hawk.filterActivity1(obj).count()) + " | " + str((UserEntry.hawk.filterActivity2(obj).count(), "-")[obj.time == 60]) - - @admin.display(description='Great Grey Signups') - def great_grey_signups(self, obj): - return str(UserEntry.great_grey.filterActivity1(obj).count()) + " | " + str((UserEntry.great_grey.filterActivity2(obj).count(), "-")[obj.time == 60]) - - @admin.display(description='Snowy Signups') - def snowy_signups(self, obj): - return str(UserEntry.snowy.filterActivity1(obj).count()) + " | " + str((UserEntry.snowy.filterActivity2(obj).count(), "-")[obj.time == 60]) - - @admin.display(description='Eagle Signups') - def eagle_signups(self, obj): - return str(UserEntry.eagle.filterActivity1(obj).count()) + " | " + str((UserEntry.eagle.filterActivity2(obj).count(), "-")[obj.time == 60]) - - -@admin.register(House) -class HouseAdmin(admin.ModelAdmin): - list_display = ('name', 'points', 'current_points', 'total_points') - actions = ['finalize_points'] - - @admin.display(description='Current Housewars Points') - def current_points(self, obj): - return obj.current_points - - @admin.display(description='Total Points') - def total_points(self, obj): - return obj.total_points - - @admin.action(description='Finalize selected house points') - def finalize_points(self, request, queryset): - updated = queryset.update( - points=queryset.aggregate(points__sum=Coalesce(Sum('pointsentry__points'), 0)).get('points__sum') + F('points')) - PointsEntry.objects.filter(pk__in=queryset).delete() - self.message_user(request, ngettext( - '%d story was successfully marked as published.', - '%d stories were successfully marked as published.', - 1, - ) % 1, messages.SUCCESS) - - -@ admin.register(Teacher) -class TeacherAdmin(admin.ModelAdmin): - fieldsets = [ - ('Personal Information', {'fields': [ - 'first_name', 'last_name']}), - ('House Wars Information', { - 'fields': ['grade', 'house', 'activity']}), - ] - - list_display = ('first_name', 'last_name', 'grade', 'activity') - - -@ admin.register(UserEntry) -class EntryAdmin(admin.ModelAdmin): - fieldsets = [ - ('Personal Information', {'fields': [ - 'first_name', 'last_name', 'email', 'grade']}), - ('House Wars Information', { - 'fields': ['house', 'activity1', 'activity2']}), - ] - - list_display = ('first_name', 'last_name', - 'house', 'activity1', 'activity1_teacher', 'activity2', 'activity2_teacher') - - list_filter = ['house', 'grade', 'activity1', - 'activity1__teacher', 'activity2', 'activity2__teacher'] - - @admin.display(description='Activity 1 Teacher') - def activity1_teacher(self, obj): - if (obj.activity1 == None): - return None - - return obj.activity1.teacher - - @admin.display(description='Activity 2 Teacher') - def activity2_teacher(self, obj): - if (obj.activity2 == None): - return None - - return obj.activity2.teacher - - -@admin.register(PointsEntry) -class PointsEntryAdmin(admin.ModelAdmin): - list_display = ('activity', 'name', 'house', 'points') diff --git a/housewars/admin/Activity.py b/housewars/admin/Activity.py new file mode 100644 index 0000000..fce4c49 --- /dev/null +++ b/housewars/admin/Activity.py @@ -0,0 +1,39 @@ +from django.contrib import admin + +from ..models import Activity, UserEntry + + +@admin.register(Activity) +class ActivityAdmin(admin.ModelAdmin): + fieldsets = [ + (None, {'fields': ['name']}), + ('Activity Information', { + 'fields': ['quota', 'time']}), + ] + + list_display = ['name', 'time', 'quota', 'teacher', 'password', 'hawk_signups', + 'great_grey_signups', 'snowy_signups', 'eagle_signups'] + + @admin.display(description='Hawk Signups') + def hawk_signups(self, obj): + if (obj.time == None): + return "- | -" + return str(UserEntry.hawk.filterActivity1(obj).count()) + " | " + str((UserEntry.hawk.filterActivity2(obj).count(), "-")[obj.time == 60]) + + @admin.display(description='Great Grey Signups') + def great_grey_signups(self, obj): + if (obj.time == None): + return "- | -" + return str(UserEntry.great_grey.filterActivity1(obj).count()) + " | " + str((UserEntry.great_grey.filterActivity2(obj).count(), "-")[obj.time == 60]) + + @admin.display(description='Snowy Signups') + def snowy_signups(self, obj): + if (obj.time == None): + return "- | -" + return str(UserEntry.snowy.filterActivity1(obj).count()) + " | " + str((UserEntry.snowy.filterActivity2(obj).count(), "-")[obj.time == 60]) + + @admin.display(description='Eagle Signups') + def eagle_signups(self, obj): + if (obj.time == None): + return "- | -" + return str(UserEntry.eagle.filterActivity1(obj).count()) + " | " + str((UserEntry.eagle.filterActivity2(obj).count(), "-")[obj.time == 60]) diff --git a/housewars/admin/House.py b/housewars/admin/House.py new file mode 100644 index 0000000..72a95bf --- /dev/null +++ b/housewars/admin/House.py @@ -0,0 +1,31 @@ +from django.contrib import admin, messages +from django.utils.translation import ngettext +from django.db.models import Sum, F +from django.db.models.functions import Coalesce + +from ..models import House, PointsEntry + + +@admin.register(House) +class HouseAdmin(admin.ModelAdmin): + list_display = ('name', 'points', 'current_points', 'total_points') + actions = ['finalize_points'] + + @admin.display(description='Current Housewars Points') + def current_points(self, obj): + return obj.current_points + + @admin.display(description='Total Points') + def total_points(self, obj): + return obj.total_points + + @admin.action(description='Finalize selected house points') + def finalize_points(self, request, queryset): + updated = queryset.update( + points=queryset.aggregate(points__sum=Coalesce(Sum('pointsentry__points'), 0)).get('points__sum') + F('points')) + PointsEntry.objects.filter(pk__in=queryset).delete() + self.message_user(request, ngettext( + 'Finalized house points for %d house.', + 'Finalized house points for %d houses.', + updated, + ) % updated, messages.SUCCESS) diff --git a/housewars/admin/PointsEntry.py b/housewars/admin/PointsEntry.py new file mode 100644 index 0000000..e89ce56 --- /dev/null +++ b/housewars/admin/PointsEntry.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from ..models import PointsEntry + + +@admin.register(PointsEntry) +class PointsEntryAdmin(admin.ModelAdmin): + list_display = ('activity', 'name', 'house', 'points') diff --git a/housewars/admin/Teacher.py b/housewars/admin/Teacher.py new file mode 100644 index 0000000..74fe9a1 --- /dev/null +++ b/housewars/admin/Teacher.py @@ -0,0 +1,15 @@ +from django.contrib import admin + +from ..models import Teacher + + +@admin.register(Teacher) +class TeacherAdmin(admin.ModelAdmin): + fieldsets = [ + ('Personal Information', {'fields': [ + 'first_name', 'last_name']}), + ('House Wars Information', { + 'fields': ['grade', 'house', 'activity']}), + ] + + list_display = ('first_name', 'last_name', 'house', 'grade', 'activity') diff --git a/housewars/admin/UserEntry.py b/housewars/admin/UserEntry.py new file mode 100644 index 0000000..e9d6a11 --- /dev/null +++ b/housewars/admin/UserEntry.py @@ -0,0 +1,65 @@ +from django.contrib import admin +from django.db.models import F, Value +from django.db.models.functions import Concat + +from ..models import UserEntry + + +class MentorListFilter(admin.SimpleListFilter): + title = 'mentor teacher' + + # Parameter for the filter that will be used in the URL query. + parameter_name = 'mentor' + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + qs = model_admin.get_queryset(request).annotate(full_name=Concat(F( + 'house__teacher__first_name'), Value(' '), F('house__teacher__last_name'))).values_list('house__teacher', 'full_name').distinct() + + return qs + + def queryset(self, request, queryset): + if (self.value() == None): + return queryset + + return queryset.filter(house__teacher=self.value(), grade=F('house__teacher__grade')) + + +@ admin.register(UserEntry) +class UserEntryAdmin(admin.ModelAdmin): + fieldsets = [ + ('Personal Information', {'fields': [ + 'first_name', 'last_name', 'email', 'grade']}), + ('House Wars Information', { + 'fields': ['house', 'activity1', 'activity2']}), + ] + + list_display = ('first_name', 'last_name', + 'house', 'mentor_teacher', 'activity1', 'activity1_teacher', 'activity2', 'activity2_teacher') + + list_filter = ['house', 'grade', MentorListFilter, 'activity1', + 'activity1__teacher', 'activity2', 'activity2__teacher'] + + @ admin.display(description='Activity 1 Teacher') + def activity1_teacher(self, obj): + if (obj.activity1 == None): + return None + + return obj.activity1.teacher + + @ admin.display(description='Mentor Teacher') + def mentor_teacher(self, obj): + return obj.mentor + + @ admin.display(description='Activity 2 Teacher') + def activity2_teacher(self, obj): + if (obj.activity2 == None): + return None + + return obj.activity2.teacher diff --git a/housewars/admin/__init__.py b/housewars/admin/__init__.py new file mode 100644 index 0000000..459d145 --- /dev/null +++ b/housewars/admin/__init__.py @@ -0,0 +1,5 @@ +from .Activity import ActivityAdmin +from .House import HouseAdmin +from .Teacher import TeacherAdmin +from .UserEntry import UserEntryAdmin +from .PointsEntry import PointsEntryAdmin