From df2a9bb1b338d80e61cb0980efdcf3cb3e2869ed Mon Sep 17 00:00:00 2001 From: Qwann Date: Tue, 24 Jan 2017 16:54:02 +0100 Subject: [PATCH] factorising BalanceStat views --- kfet/urls.py | 17 ++------ kfet/views.py | 113 ++++++++++++++++++++++++-------------------------- 2 files changed, 59 insertions(+), 71 deletions(-) diff --git a/kfet/urls.py b/kfet/urls.py index 53f593c6..d0605548 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -81,20 +81,11 @@ urlpatterns = [ url('^accounts/(?P.{3})/stat/balance/$', views.AccountStatBalanceAll.as_view(), name = 'kfet.account.stat.balance'), - url('^accounts/(?P.{3})/stat/balance/month/$', - views.AccountStatBalanceMonth.as_view(), - name = 'kfet.account.stat.balance.month'), - url('^accounts/(?P.{3})/stat/balance/treemonths/$', - views.AccountStatBalanceThreeMonths.as_view(), - name = 'kfet.account.stat.balance.treemonths'), - url('^accounts/(?P.{3})/stat/balance/sixmonths/$', - views.AccountStatBalanceSixMonths.as_view(), - name = 'kfet.account.stat.balance.sixmonths'), - url('^accounts/(?P.{3})/stat/balance/year/$', - views.AccountStatBalanceYear.as_view(), - name = 'kfet.account.stat.balance.year'), + url('^accounts/(?P.{3})/stat/balance/d/(?P\d*)/$', + views.AccountStatBalance.as_view(), + name = 'kfet.account.stat.balance.days'), url('^accounts/(?P.{3})/stat/balance/anytime/$', - views.AccountStatBalanceAnytime.as_view(), + views.AccountStatBalance.as_view(), name = 'kfet.account.stat.balance.anytime'), # ----- diff --git a/kfet/views.py b/kfet/views.py index 740a75a4..cc396efe 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2039,9 +2039,13 @@ class ObjectResumeStat(DetailView): def get_object_url_kwargs(self, **kwargs): return {'pk': self.object.id} + def url_kwargs(self, **kwargs): + return [{}] * self.nb_stat + def get_context_data(self, **kwargs): # On hérite pas object_id = self.object.id + url_kwargs = self.url_kwargs() context = {} stats = {} for i in range(self.nb_stat): @@ -2051,7 +2055,11 @@ class ObjectResumeStat(DetailView): object_id, i), 'url': reverse_lazy(self.stat_urls[i], - kwargs=self.get_object_url_kwargs()), + kwargs=dict( + self.get_object_url_kwargs(), + **url_kwargs[i] + ), + ), } prefix = "%s_%d" % (self.id_prefix, object_id) context['id_prefix'] = prefix @@ -2066,11 +2074,11 @@ class ObjectResumeStat(DetailView): # Evolution Balance perso # ----------------------- ID_PREFIX_ACC_BALANCE = "balance_acc" -ID_PREFIX_ACC_BALANCE_MONTH = "balance_month_acc" -ID_PREFIX_ACC_BALANCE_THREE_MONTHS = "balance_three_months_acc" -ID_PREFIX_ACC_BALANCE_SIX_MONTHS = "balance_six_months_acc" -ID_PREFIX_ACC_BALANCE_YEAR = "balance_year_acc" -ID_PREFIX_ACC_BALANCE_ANYTIME = "balance_anytime_acc" +# ID_PREFIX_ACC_BALANCE_MONTH = "balance_month_acc" +# ID_PREFIX_ACC_BALANCE_THREE_MONTHS = "balance_three_months_acc" +# ID_PREFIX_ACC_BALANCE_SIX_MONTHS = "balance_six_months_acc" +# ID_PREFIX_ACC_BALANCE_YEAR = "balance_year_acc" +# ID_PREFIX_ACC_BALANCE_ANYTIME = "balance_anytime_acc" # Un résumé de toutes les vues ArticleStatBalance @@ -2081,13 +2089,10 @@ class AccountStatBalanceAll(ObjectResumeStat): trigramme_url_kwarg = 'trigramme' id_prefix = ID_PREFIX_ACC_BALANCE nb_stat = 5 - nb_default = 4 + nb_default = 0 stat_labels = ["Tout le temps", "1 an", "6 mois", "3 mois", "30 jours"] - stat_urls = ['kfet.account.stat.balance.anytime', - 'kfet.account.stat.balance.year', - 'kfet.account.stat.balance.sixmonths', - 'kfet.account.stat.balance.treemonths', - 'kfet.account.stat.balance.month'] + stat_urls = ['kfet.account.stat.balance.anytime'] \ + + ['kfet.account.stat.balance.days'] * 4 def get_object(self, **kwargs): trigramme = self.kwargs.get(self.trigramme_url_kwarg) @@ -2096,6 +2101,15 @@ class AccountStatBalanceAll(ObjectResumeStat): def get_object_url_kwargs(self, **kwargs): return {'trigramme': self.object.trigramme} + def url_kwargs(self, **kwargs): + context_list = (super(AccountStatBalanceAll, self) + .url_kwargs(**kwargs)) + context_list[1] = {'nb_date': 365} + context_list[2] = {'nb_date': 183} + context_list[3] = {'nb_date': 90} + context_list[4] = {'nb_date': 30} + return context_list + @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(AccountStatBalanceAll, self).dispatch(*args, **kwargs) @@ -2104,17 +2118,16 @@ class AccountStatBalanceAll(ObjectResumeStat): class AccountStatBalance(HybridDetailView): """ Returns a graph (or a JSON Response) of the evolution a the personnal - balance of a trigramm between begin_date and end_date + balance of a trigramm between timezone.now() and `nb_days` + ago (specified to the view as an argument) takes intto account the Operations and the Transfers does not takes intto account the balance offset """ model = Account trigramme_url_kwarg = 'trigramme' + nb_date_url_kwargs = 'nb_date' template_name = 'kfet/account_stat_balance.html' context_object_name = 'account' - begin_date = this_morning() - end_date = timezone.now() # ne gère pas encore autre chose que now - anytime = False # un cas particulier id_prefix = "lol" def get_object(self, **kwargs): @@ -2123,24 +2136,33 @@ class AccountStatBalance(HybridDetailView): def get_changes_list(self, **kwargs): account = self.object + nb_date = self.kwargs.get(self.nb_date_url_kwargs, None) + end_date = this_morning() + if nb_date is None: + begin_date = timezone.datetime(year=1980, month=1, day=1) + anytime = True + else: + begin_date = this_morning() \ + - timezone.timedelta(days=int(nb_date)) + anytime = False # On récupère les opérations # TODO: retirer les opgroup dont tous les op sont annulées opgroups = list(OperationGroup.objects .filter(on_acc=account) - .filter(at__gte=self.begin_date) - .filter(at__lte=self.end_date)) + .filter(at__gte=begin_date) + .filter(at__lte=end_date)) # On récupère les transferts reçus received_transfers = list(Transfer.objects .filter(to_acc=account) .filter(canceled_at=None) - .filter(group__at__gte=self.begin_date) - .filter(group__at__lte=self.end_date)) + .filter(group__at__gte=begin_date) + .filter(group__at__lte=end_date)) # On récupère les transferts émis emitted_transfers = list(Transfer.objects .filter(from_acc=account) .filter(canceled_at=None) - .filter(group__at__gte=self.begin_date) - .filter(group__at__lte=self.end_date)) + .filter(group__at__gte=begin_date) + .filter(group__at__lte=end_date)) # On transforme tout ça en une liste de dictionnaires sous la forme # {'at': date, # 'amount': changement de la balance (négatif si diminue la balance, @@ -2153,7 +2175,7 @@ class AccountStatBalance(HybridDetailView): actions = [ # Maintenant (à changer si on gère autre chose que now) { - 'at': self.end_date.isoformat(), + 'at': end_date.isoformat(), 'amout': 0, 'label': "actuel", 'balance': 0, @@ -2184,11 +2206,11 @@ class AccountStatBalance(HybridDetailView): 'balance': 0, } for tr in emitted_transfers ] - if not self.anytime: + if not anytime: actions += [ # Date de début : { - 'at': self.begin_date.isoformat(), + 'at': begin_date.isoformat(), 'amount': 0, 'label': "début", 'balance': 0, @@ -2206,9 +2228,15 @@ class AccountStatBalance(HybridDetailView): def get_context_data(self, **kwargs): context = {} changes = self.get_changes_list() + nb_days = self.kwargs.get(self.nb_date_url_kwargs, None) + if nb_days is None: + nb_days_string = 'anytime' + else: + nb_days_string = str(int(nb_days)) context['changes'] = changes - context['chart_id'] = "%s_%s" % (self.id_prefix, - self.object.id) + context['chart_id'] = "%s_%s_%s_days" % (self.id_prefix, + self.object.id, + nb_days_string) context['min_date'] = changes[len(changes)-1]['at'] context['max_date'] = changes[0]['at'] # TODO: offset @@ -2219,37 +2247,6 @@ class AccountStatBalance(HybridDetailView): return super(AccountStatBalance, self).dispatch(*args, **kwargs) -# Rend l'évolution de la balance perso de ces 30 derniers jours -class AccountStatBalanceMonth(AccountStatBalance): - begin_date = this_morning() - timezone.timedelta(days=30) - id_prefix = ID_PREFIX_ACC_BALANCE_MONTH - - -# Rend l'évolution de la balance perso de ces 3 derniers mois -class AccountStatBalanceThreeMonths(AccountStatBalance): - begin_date = this_morning() - timezone.timedelta(days=30*3) - id_prefix = ID_PREFIX_ACC_BALANCE_THREE_MONTHS - - -# Rend l'évolution de la balance perso de ces 6 derniers mois -class AccountStatBalanceSixMonths(AccountStatBalance): - begin_date = this_morning() - timezone.timedelta(days=30*6) - id_prefix = ID_PREFIX_ACC_BALANCE_SIX_MONTHS - - -# Rend l'évolution de la balance perso de la dernière annnée -class AccountStatBalanceYear(AccountStatBalance): - begin_date = this_morning() - timezone.timedelta(days=365) - id_prefix = ID_PREFIX_ACC_BALANCE_YEAR - - -# Rend l'évolution de la balance perso depuis toujours -class AccountStatBalanceAnytime(AccountStatBalance): - begin_date = timezone.datetime(year=1980, month=1, day=1) - id_prefix = ID_PREFIX_ACC_BALANCE_ANYTIME - anytime = True - - # ------------------------ # Consommation personnelle # ------------------------