From 99c1c53f12296c574eabcf18ba15a6a10603429a Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Sun, 17 May 2020 00:18:08 +0000 Subject: [PATCH] Calculate retained member counts for each month --- .../api/management/commands/run_daily.py | 3 +++ apiserver/apiserver/api/models.py | 2 ++ apiserver/apiserver/api/utils_stats.py | 22 +++++++++++++++++++ apiserver/apiserver/api/views.py | 5 ++++- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/apiserver/apiserver/api/management/commands/run_daily.py b/apiserver/apiserver/api/management/commands/run_daily.py index dc9b2fa..04b4f4b 100644 --- a/apiserver/apiserver/api/management/commands/run_daily.py +++ b/apiserver/apiserver/api/management/commands/run_daily.py @@ -24,6 +24,9 @@ class Command(BaseCommand): count = self.tally_active_members() self.stdout.write('Tallied {} active members'.format(count)) + count = utils_stats.calc_retain_counts() + self.stdout.write('Tallied {} retained members'.format(count)) + utils_stats.changed_card() self.stdout.write('Updated card change time') diff --git a/apiserver/apiserver/api/models.py b/apiserver/apiserver/api/models.py index 4837c72..983c8d9 100644 --- a/apiserver/apiserver/api/models.py +++ b/apiserver/apiserver/api/models.py @@ -138,6 +138,8 @@ class StatsMemberCount(models.Model): class StatsSignupCount(models.Model): month = models.DateField() signup_count = models.IntegerField() + retain_count = models.IntegerField(default=0) + vetted_count = models.IntegerField(default=0) class HistoryIndex(models.Model): content_type = models.ForeignKey(ContentType, null=True, on_delete=models.SET_NULL) diff --git a/apiserver/apiserver/api/utils_stats.py b/apiserver/apiserver/api/utils_stats.py index 6dc8265..14fe238 100644 --- a/apiserver/apiserver/api/utils_stats.py +++ b/apiserver/apiserver/api/utils_stats.py @@ -75,6 +75,28 @@ def calc_signup_counts(): return num_new_members +def calc_retain_counts(): + signup_counts = models.StatsSignupCount.objects.all() + + all_members = models.Member.objects + active_members = all_members.filter(paused_date__isnull=True) + vetted_members = all_members.filter(vetted_date__isnull=False) + + for entry in signup_counts: + date = entry.month + active_new_members = active_members.filter( + application_date__month=date.month, application_date__year=date.year + ) + vetted_new_members = vetted_members.filter( + application_date__month=date.month, application_date__year=date.year + ) + + entry.retain_count = active_new_members.count() + entry.vetted_count = vetted_new_members.count() + entry.save() + + return active_members.count() + def check_minecraft_server(): if secrets.MINECRAFT: url = 'https://api.minetools.eu/ping/' + secrets.MINECRAFT diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index e9b251f..d172ea0 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -393,9 +393,12 @@ class MemberCountViewSet(Base, List): class SignupCountViewSet(Base, List): pagination_class = None - queryset = models.StatsSignupCount.objects.order_by('-month')[:16][::-1] serializer_class = serializers.SignupCountSerializer + def get_queryset(self): + # have to use method as slicing breaks makemigrations + return models.StatsSignupCount.objects.order_by('-month')[:16][::-1] + class BackupView(views.APIView): def get(self, request):