Skip to content

Commit

Permalink
Removed previous non-generic export and graph views
Browse files Browse the repository at this point in the history
  • Loading branch information
Theophile-Madet committed Jan 30, 2025
1 parent 8e51732 commit 56fbe81
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 139 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 5.1.5 on 2025-01-30 17:47

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("statistics", "0005_merge_20241209_2116"),
]

operations = [
migrations.RemoveField(
model_name="fancygraphcache",
name="view_name",
),
migrations.AddField(
model_name="fancygraphcache",
name="data_provider_name_name",
field=models.CharField(default="unused", max_length=500),
preserve_default=False,
),
]
2 changes: 1 addition & 1 deletion tapir/statistics/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class PurchaseBasket(models.Model):


class FancyGraphCache(models.Model):
view_name = models.CharField(max_length=255)
data_provider_name_name = models.CharField(max_length=500)
date = models.DateField()
value = models.IntegerField()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
class DataProviderAbcdMembers(BaseDataProvider):
@classmethod
def get_display_name(cls):
return _("Number of ABCD members")
return _("ABCD members")

@classmethod
def get_description(cls):
Expand Down
11 changes: 4 additions & 7 deletions tapir/statistics/urls.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
from django.urls import path

import tapir.statistics.views.fancy_graph.base_view
from tapir.statistics import views
from tapir.statistics.views import fancy_graph
from tapir.statistics.views.available_columns_view import AvailableColumnsView
from tapir.statistics.views.available_datasets_view import AvailableDatasetsView
from tapir.statistics.views.dataset_export_view import DatasetExportView
from tapir.statistics.views.fancy_export.base_view import (
AvailableColumnsView,
FancyExportView,
)
from tapir.statistics.views.fancy_export_view import FancyExportView
from tapir.statistics.views.fancy_graph_view import FancyGraphView

app_name = "statistics"
urlpatterns = [
Expand Down Expand Up @@ -54,7 +51,7 @@
),
path(
"fancy_graph",
fancy_graph.base_view.FancyGraphView.as_view(),
FancyGraphView.as_view(),
name="fancy_graph",
),
path(
Expand Down
26 changes: 26 additions & 0 deletions tapir/statistics/views/available_columns_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from drf_spectacular.utils import extend_schema
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from tapir.settings import PERMISSION_COOP_MANAGE
from tapir.statistics.serializers import ColumnSerializer, DatapointExportSerializer


class AvailableColumnsView(LoginRequiredMixin, PermissionRequiredMixin, APIView):
permission_required = PERMISSION_COOP_MANAGE

@extend_schema(
responses={200: ColumnSerializer(many=True)},
)
def get(self, request):
objects = [
{"column_name": column_name}
for column_name in DatapointExportSerializer().get_fields().keys()
]

return Response(
ColumnSerializer(objects, many=True).data,
status=status.HTTP_200_OK,
)
Original file line number Diff line number Diff line change
@@ -1,56 +1,51 @@
import datetime
from abc import ABC, abstractmethod
from abc import ABC
from typing import Type

from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.db.models import QuerySet
from django.utils import timezone
from django.views import generic
from drf_spectacular.utils import extend_schema, OpenApiParameter
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from tapir.coop.models import ShareOwner
from tapir.settings import PERMISSION_COOP_MANAGE
from tapir.statistics.models import FancyGraphCache
from tapir.statistics.services.data_providers.base_data_provider import (
data_providers,
BaseDataProvider,
)


class FancyGraphView(LoginRequiredMixin, PermissionRequiredMixin, generic.TemplateView):
class DatasetGraphPointView(LoginRequiredMixin, PermissionRequiredMixin, APIView, ABC):
permission_required = PERMISSION_COOP_MANAGE
template_name = "statistics/fancy_graph.html"

def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)

return context_data


class DatapointView(LoginRequiredMixin, PermissionRequiredMixin, APIView, ABC):
permission_required = PERMISSION_COOP_MANAGE

@abstractmethod
def get_queryset(self, reference_time: datetime.datetime) -> QuerySet[ShareOwner]:
pass

def calculate_datapoint(self, reference_time: datetime.datetime) -> int:
return self.get_queryset(reference_time).distinct().count()

def get_datapoint(self, reference_time: datetime.datetime):
@staticmethod
def calculate_datapoint(
data_provider: Type[BaseDataProvider], reference_time: datetime.datetime
) -> int:
return data_provider.get_queryset(reference_time).distinct().count()

def get_datapoint(
self, data_provider: Type[BaseDataProvider], reference_time: datetime.datetime
):
reference_date = reference_time.date()
view_name = f"{self.__class__.__module__}.{self.__class__.__name__}"
data_provider_name = (
f"{data_provider.__class__.__module__}.{data_provider.__class__.__name__}"
)

if reference_date < timezone.now().date():
# Only use the cache for dates in the past:
# someone may make changes and check the results on the graph on the same day.
cached_value = FancyGraphCache.objects.filter(
view_name=view_name, date=reference_date
data_provider_name=data_provider_name, date=reference_date
).first()
if cached_value:
return cached_value.value

value = self.calculate_datapoint(reference_time)
value = self.calculate_datapoint(data_provider, reference_time)
FancyGraphCache.objects.create(
view_name=view_name, date=reference_date, value=value
data_provider_name=data_provider_name, date=reference_date, value=value
)
return value

Expand All @@ -70,19 +65,24 @@ def transfer_attributes(source, target, attributes):
parameters=[
OpenApiParameter(name="at_date", required=True, type=datetime.date),
OpenApiParameter(name="relative", required=True, type=bool),
OpenApiParameter(name="dataset", required=True, type=str),
],
)
def get(self, request):
reference_time = self.get_reference_time(request)
relative = request.query_params.get("relative") == "true"

result = self.get_datapoint(reference_time)
data_provider = data_providers[request.query_params.get("dataset")]

result = self.get_datapoint(data_provider, reference_time)

if relative:
previous_datapoint_time = (
reference_time - datetime.timedelta(days=1)
).replace(day=1)
previous_datapoint = self.get_datapoint(previous_datapoint_time)
previous_datapoint = self.get_datapoint(
data_provider, previous_datapoint_time
)
result = result - previous_datapoint

return Response(
Expand Down
Empty file.
101 changes: 0 additions & 101 deletions tapir/statistics/views/fancy_export/base_view.py

This file was deleted.

16 changes: 16 additions & 0 deletions tapir/statistics/views/fancy_export_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views import generic

from tapir.settings import PERMISSION_COOP_MANAGE


class FancyExportView(
LoginRequiredMixin, PermissionRequiredMixin, generic.TemplateView
):
permission_required = PERMISSION_COOP_MANAGE
template_name = "statistics/fancy_export.html"

def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)

return context_data
Empty file.
14 changes: 14 additions & 0 deletions tapir/statistics/views/fancy_graph_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views import generic

from tapir.settings import PERMISSION_COOP_MANAGE


class FancyGraphView(LoginRequiredMixin, PermissionRequiredMixin, generic.TemplateView):
permission_required = PERMISSION_COOP_MANAGE
template_name = "statistics/fancy_graph.html"

def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)

return context_data

0 comments on commit 56fbe81

Please sign in to comment.