diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index d17c4e9..1cbe701 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -85,26 +85,69 @@ class MemberAdmin(admin.ModelAdmin): queryset = super().get_queryset(request) one_year_ago = datetime.now() - timedelta(days=365) queryset = queryset.annotate( - _jugendleiter_klettertreff_score=Sum(Case( - When( - klettertreff__date__gte=one_year_ago, - then=1), - default=0, + _jugendleiter_freizeit_score_calc=Subquery( + Freizeit.objects.filter(jugendleiter=OuterRef('pk'), + date__gte=one_year_ago) + .values('jugendleiter') + .annotate(cnt=Count('pk', distinct=True)) + .values('cnt'), output_field=IntegerField() - )), - _jugendleiter_freizeit_score=Sum(Case( - When( - freizeit__date__gte=one_year_ago, - then=1), - default=0, + ), + # better solution but does not work in production apparently + #_jugendleiter_freizeit_score=Sum(Case( + # When( + # freizeit__date__gte=one_year_ago, + # then=1), + # default=0, + # output_field=IntegerField() + # ), + # distinct=True), + _jugendleiter_klettertreff_score_calc=Subquery( + Klettertreff.objects.filter(jugendleiter=OuterRef('pk'), + date__gte=one_year_ago) + .values('jugendleiter') + .annotate(cnt=Count('pk', distinct=True)) + .values('cnt'), + output_field=IntegerField() + ), + # better solution but does not work in production apparently + #_jugendleiter_klettertreff_score=Sum(Case( + # When( + # klettertreff__date__gte=one_year_ago, + # then=1), + # default=0, + # output_field=IntegerField() + # ), + # distinct=True), + _freizeit_score_calc=Subquery( + Freizeit.objects.filter(membersonlist__member=OuterRef('pk'), + date__gte=one_year_ago) + .values('membersonlist__member') + .annotate(cnt=Count('pk', distinct=True)) + .values('cnt'), output_field=IntegerField() - )), + ), _klettertreff_score_calc=Subquery( KlettertreffAttendee.objects.filter(member=OuterRef('pk'), klettertreff__date__gte=one_year_ago) .values('member') .annotate(cnt=Count('pk', distinct=True)) .values('cnt'), + output_field=IntegerField())) + queryset = queryset.annotate( + _jugendleiter_freizeit_score=Case( + When( + _jugendleiter_freizeit_score_calc=None, + then=0 + ), + default=F('_jugendleiter_freizeit_score_calc'), + output_field=IntegerField()), + _jugendleiter_klettertreff_score=Case( + When( + _jugendleiter_klettertreff_score_calc=None, + then=0 + ), + default=F('_jugendleiter_klettertreff_score_calc'), output_field=IntegerField()), _klettertreff_score=Case( When( @@ -113,23 +156,17 @@ class MemberAdmin(admin.ModelAdmin): ), default=F('_klettertreff_score_calc'), output_field=IntegerField()), - _freizeit_score_calc=Subquery( - Freizeit.objects.filter(membersonlist__member=OuterRef('pk'), - date__gte=one_year_ago) - .values('membersonlist__member') - .annotate(cnt=Count('pk', distinct=True)) - .values('cnt'), - output_field=IntegerField() - ), _freizeit_score=Case( When( _freizeit_score_calc=None, then=0 ), default=F('_freizeit_score_calc'), - output_field=IntegerField()), + output_field=IntegerField())) + queryset = queryset.annotate( + #_activity_score=F('_jugendleiter_freizeit_score') _activity_score=(F('_klettertreff_score') + 3 * F('_freizeit_score') - + 2 * F('_jugendleiter_klettertreff_score') + 6 * F('_jugendleiter_freizeit_score')) + + F('_jugendleiter_klettertreff_score') + 3 * F('_jugendleiter_freizeit_score')) ) return queryset