diff --git a/kfet/autocomplete.py b/kfet/autocomplete.py index 2a24a51e..896eff6e 100644 --- a/kfet/autocomplete.py +++ b/kfet/autocomplete.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import (absolute_import, division, - print_function, unicode_literals) -from builtins import * - from django.shortcuts import render from django.http import Http404 from django.db.models import Q @@ -11,6 +7,7 @@ from gestioncof.models import User, Clipper from kfet.decorators import teamkfet_required from kfet.models import Account + @teamkfet_required def account_create(request): if "q" not in request.GET: @@ -25,48 +22,48 @@ def account_create(request): queries = {} search_words = q.split() - queries['kfet'] = Account.objects - queries['users_cof'] = User.objects.filter(Q(profile__is_cof = True)) - queries['users_notcof'] = User.objects.filter(Q(profile__is_cof = False)) - queries['clippers'] = Clipper.objects + queries['kfet'] = Account.objects + queries['users_cof'] = User.objects.filter(Q(profile__is_cof=True)) + queries['users_notcof'] = User.objects.filter(Q(profile__is_cof=False)) + queries['clippers'] = Clipper.objects for word in search_words: queries['kfet'] = queries['kfet'].filter( - Q(cofprofile__user__username__icontains = word) - | Q(cofprofile__user__first_name__icontains = word) - | Q(cofprofile__user__last_name__icontains = word) + Q(cofprofile__user__username__icontains=word) | + Q(cofprofile__user__first_name__icontains=word) | + Q(cofprofile__user__last_name__icontains=word) ) queries['users_cof'] = queries['users_cof'].filter( - Q(username__icontains = word) - | Q(first_name__icontains = word) - | Q(last_name__icontains = word) + Q(username__icontains=word) | + Q(first_name__icontains=word) | + Q(last_name__icontains=word) ) queries['users_notcof'] = queries['users_notcof'].filter( - Q(username__icontains = word) - | Q(first_name__icontains = word) - | Q(last_name__icontains = word) + Q(username__icontains=word) | + Q(first_name__icontains=word) | + Q(last_name__icontains=word) ) - queries['clippers'] = queries['clippers'].filter( - Q(username__icontains = word) - | Q(fullname__icontains = word) + queries['clippers'] = queries['clippers'].filter( + Q(username__icontains=word) | + Q(fullname__icontains=word) ) queries['kfet'] = queries['kfet'].distinct() - usernames = list( \ + usernames = list( queries['kfet'].values_list('cofprofile__user__username', flat=True)) - queries['kfet'] = [ (account, account.cofprofile.user) \ - for account in queries['kfet'] ] + queries['kfet'] = [(account, account.cofprofile.user) + for account in queries['kfet']] - queries['users_cof'] = \ + queries['users_cof'] = \ queries['users_cof'].exclude(username__in=usernames).distinct() - queries['users_notcof'] = \ + queries['users_notcof'] = \ queries['users_notcof'].exclude(username__in=usernames).distinct() - usernames += list( \ + usernames += list( queries['users_cof'].values_list('username', flat=True)) - usernames += list( \ + usernames += list( queries['users_notcof'].values_list('username', flat=True)) queries['clippers'] = \ @@ -80,3 +77,25 @@ def account_create(request): data['options'] = options return render(request, "kfet/account_create_autocomplete.html", data) + + +def account_search(request): + if "q" not in request.GET: + raise Http404 + q = request.GET.get("q") + words = q.split() + + data = {'q': q} + + for word in words: + query = Account.objects.filter( + Q(cofprofile__user__username__icontains=word) | + Q(cofprofile__user__first_name__icontains=word) | + Q(cofprofile__user__last_name__icontains=word) + ).distinct() + + query = [(account.trigramme, account.cofprofile.user.get_full_name()) + for account in query] + + data['accounts'] = query + return render(request, 'kfet/account_search_autocomplete.html', data) diff --git a/kfet/static/kfet/css/jconfirm-kfet.css b/kfet/static/kfet/css/jconfirm-kfet.css index 4269fbcc..0bd53ab7 100644 --- a/kfet/static/kfet/css/jconfirm-kfet.css +++ b/kfet/static/kfet/css/jconfirm-kfet.css @@ -83,3 +83,24 @@ padding-right: 50px; padding-left: 50px; } + +/* Account autocomplete window */ + +#account_results ul { + list-style-type:none; + background:rgba(255,255,255,0.9); + padding:0; +} + +#account_results li { + display:block; + padding:5px 20px; + height:100%; + width:100%; +} + +#account_results .hilight { + background:rgba(200,16,46,0.9); + color:#fff; + text-decoration:none; +} diff --git a/kfet/templates/kfet/account_create_autocomplete.html b/kfet/templates/kfet/account_create_autocomplete.html index 1185c3a8..1a869c86 100644 --- a/kfet/templates/kfet/account_create_autocomplete.html +++ b/kfet/templates/kfet/account_create_autocomplete.html @@ -7,7 +7,7 @@ {% if kfet %} -
  • Comptes existant
  • +
  • Comptes existants
  • {% for account, user in kfet %}
  • {{ account }} [{{ user|highlight_user:q }}]
  • {% endfor %} diff --git a/kfet/templates/kfet/account_search_autocomplete.html b/kfet/templates/kfet/account_search_autocomplete.html new file mode 100644 index 00000000..e18eb1eb --- /dev/null +++ b/kfet/templates/kfet/account_search_autocomplete.html @@ -0,0 +1,14 @@ +{% load kfet_tags %} + + + diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 7c0437fa..70cf4ba9 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -4,6 +4,7 @@ {% block extra_head %} + @@ -260,12 +261,56 @@ $(document).ready(function() { buttons += ''; } else { var url_base = '{% url 'kfet.account' %}' - buttons += ''; + buttons += ''; } } account_container.find('.buttons').html(buttons); } + // Search for an account + function searchAccount() { + var content = '
    ' ; + $.dialog({ + title: 'Recherche de compte', + content: content, + backgroundDismiss: true, + animation: 'top', + closeAnimation: 'bottom', + keyboardEnabled: true, + onOpen: function() { + var that=this ; + $('input#search_autocomplete').yourlabsAutocomplete({ + url: '{% url "kfet.account.search.autocomplete" %}', + minimumCharacters: 2, + id: 'search_autocomplete', + choiceSelector: '.choice', + placeholder: "Chercher un utilisateur K-Fêt", + box: $("#account_results"), + }); + $('input#search_autocomplete').bind( + 'selectChoice', + function(e, choice, autocomplete) { + autocomplete.hide() ; + triInput.val(choice.find('.trigramme').text()) ; + triInput.trigger('input') ; + that.close() ; + }); + } + }); + } + + account_container.on('click', '.search', function () { + searchAccount() ; + }) ; + + account_container.on('keydown', function(e) { + if (e.which == 70 && e.ctrlKey) { + // Ctrl + F : universal search shortcut + searchAccount() ; + e.preventDefault() ; + } + }); + // Clear data function resetAccountData() { account_data = account_data_default; diff --git a/kfet/templatetags/kfet_tags.py b/kfet/templatetags/kfet_tags.py index 66152dfe..59840b27 100644 --- a/kfet/templatetags/kfet_tags.py +++ b/kfet/templatetags/kfet_tags.py @@ -1,23 +1,24 @@ # -*- coding: utf-8 -*- -from __future__ import (absolute_import, division, - print_function, unicode_literals) -from builtins import * - from django import template from django.utils.html import escape from django.utils.safestring import mark_safe -from django.core.cache import cache from kfet.models import Settings from math import floor import re register = template.Library() + +@register.filter() def highlight_text(text, q): q2 = "|".join(q.split()) pattern = re.compile(r"(?P%s)" % q2, re.IGNORECASE) - return mark_safe(re.sub(pattern, r"\g", text)) + return mark_safe( + re.sub(pattern, + r"\g", + escape(text))) + @register.filter(is_safe=True) def highlight_user(user, q): @@ -25,7 +26,8 @@ def highlight_user(user, q): text = "%s %s (%s)" % (user.first_name, user.last_name, user.username) else: text = user.username - return highlight_text(escape(text), q) + return highlight_text(text, q) + @register.filter(is_safe=True) def highlight_clipper(clipper, q): @@ -33,7 +35,8 @@ def highlight_clipper(clipper, q): text = "%s (%s)" % (clipper.fullname, clipper.username) else: text = clipper.username - return highlight_text(escape(text), q) + return highlight_text(text, q) + @register.filter() def ukf(balance, is_cof): diff --git a/kfet/tests.py b/kfet/tests.py index 862c0ef5..98558001 100644 --- a/kfet/tests.py +++ b/kfet/tests.py @@ -1,8 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import (absolute_import, division, - print_function, unicode_literals) -from builtins import * from django.test import TestCase from kfet.models import Account diff --git a/kfet/urls.py b/kfet/urls.py index 41e14acd..0a5c2128 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import (absolute_import, division, - print_function, unicode_literals) -from builtins import * - from django.conf.urls import url from django.contrib.auth.decorators import permission_required from kfet import views @@ -14,9 +10,9 @@ urlpatterns = [ url(r'^$', views.Home.as_view(), name = 'kfet.home'), url(r'^login/genericteam$', views.login_genericteam, - name = 'kfet.login.genericteam'), + name='kfet.login.genericteam'), url(r'^history$', views.history, - name = 'kfet.history'), + name='kfet.history'), # ----- # Account urls @@ -24,45 +20,53 @@ urlpatterns = [ # Account - General url(r'^accounts/$', views.account, - name = 'kfet.account'), + name='kfet.account'), url(r'^accounts/is_validandfree$', views.account_is_validandfree_ajax, - name = 'kfet.account.is_validandfree.ajax'), + name='kfet.account.is_validandfree.ajax'), # Account - Create url(r'^accounts/new$', views.account_create, - name = 'kfet.account.create'), + name='kfet.account.create'), url(r'^accounts/new_special$', views.account_create_special, - name = 'kfet.account.create_special'), + name='kfet.account.create_special'), url(r'^accounts/new/user/(?P.+)$', views.account_create_ajax, - name = 'kfet.account.create.fromuser'), - url(r'^accounts/new/clipper/(?P.+)$', views.account_create_ajax, - name = 'kfet.account.create.fromclipper'), + name='kfet.account.create.fromuser'), + url(r'^accounts/new/clipper/(?P.+)$', + views.account_create_ajax, + name='kfet.account.create.fromclipper'), url(r'^accounts/new/empty$', views.account_create_ajax, - name = 'kfet.account.create.empty'), + name='kfet.account.create.empty'), url(r'^autocomplete/account_new$', autocomplete.account_create, - name = 'kfet.account.create.autocomplete'), + name='kfet.account.create.autocomplete'), + + # Account - Search + url(r'^autocomplete/account_search$', autocomplete.account_search, + name='kfet.account.search.autocomplete'), # Account - Read url(r'^accounts/(?P.{3})$', views.account_read, - name = 'kfet.account.read'), + name='kfet.account.read'), # Account - Update url(r'^accounts/(?P.{3})/edit$', views.account_update, - name = 'kfet.account.update'), + name='kfet.account.update'), # Account - Groups url(r'^accounts/groups$', views.account_group, - name = 'kfet.account.group'), + name='kfet.account.group'), url(r'^accounts/groups/new$', - permission_required('kfet.manage_perms')(views.AccountGroupCreate.as_view()), - name = 'kfet.account.group.create'), + permission_required('kfet.manage_perms') + (views.AccountGroupCreate.as_view()), + name='kfet.account.group.create'), url(r'^accounts/groups/(?P\d+)/edit$', - permission_required('kfet.manage_perms')(views.AccountGroupUpdate.as_view()), - name = 'kfet.account.group.update'), + permission_required('kfet.manage_perms') + (views.AccountGroupUpdate.as_view()), + name='kfet.account.group.update'), url(r'^accounts/negatives$', - permission_required('kfet.view_negs')(views.AccountNegativeList.as_view()), - name = 'kfet.account.negative'), + permission_required('kfet.view_negs') + (views.AccountNegativeList.as_view()), + name='kfet.account.negative'), # Account - Statistics url('^accounts/(?P.{3})/stat/last/$', @@ -95,34 +99,36 @@ urlpatterns = [ # Checkout - General url('^checkouts/$', teamkfet_required(views.CheckoutList.as_view()), - name = 'kfet.checkout'), + name='kfet.checkout'), # Checkout - Create url('^checkouts/new$', teamkfet_required(views.CheckoutCreate.as_view()), - name = 'kfet.checkout.create'), + name='kfet.checkout.create'), # Checkout - Read url('^checkouts/(?P\d+)$', teamkfet_required(views.CheckoutRead.as_view()), - name = 'kfet.checkout.read'), + name='kfet.checkout.read'), # Checkout - Update url('^checkouts/(?P\d+)/edit$', teamkfet_required(views.CheckoutUpdate.as_view()), - name = 'kfet.checkout.update'), + name='kfet.checkout.update'), - ### Checkout Statements urls + # ----- + # Checkout Statement urls + # ----- # Checkout Statement - General url('^checkouts/statements/$', teamkfet_required(views.CheckoutStatementList.as_view()), - name = 'kfet.checkoutstatement'), + name='kfet.checkoutstatement'), # Checkout Statement - Create url('^checkouts/(?P\d+)/statements/add', teamkfet_required(views.CheckoutStatementCreate.as_view()), - name = 'kfet.checkoutstatement.create'), + name='kfet.checkoutstatement.create'), # Checkout Statement - Update url('^checkouts/(?P\d+)/statements/(?P\d+)/edit', teamkfet_required(views.CheckoutStatementUpdate.as_view()), - name = 'kfet.checkoutstatement.update'), + name='kfet.checkoutstatement.update'), # ----- # Article urls @@ -131,15 +137,15 @@ urlpatterns = [ # Article - General url('^articles/$', teamkfet_required(views.ArticleList.as_view()), - name = 'kfet.article'), + name='kfet.article'), # Article - Create url('^articles/new$', teamkfet_required(views.ArticleCreate.as_view()), - name = 'kfet.article.create'), + name='kfet.article.create'), # Article - Read url('^articles/(?P\d+)$', teamkfet_required(views.ArticleRead.as_view()), - name = 'kfet.article.read'), + name='kfet.article.read'), # Article - Update url('^articles/(?P\d+)/edit$', teamkfet_required(views.ArticleUpdate.as_view()), @@ -162,28 +168,28 @@ urlpatterns = [ # K-Psul urls # ----- - url('^k-psul/$', views.kpsul, name = 'kfet.kpsul'), + url('^k-psul/$', views.kpsul, name='kfet.kpsul'), url('^k-psul/checkout_data$', views.kpsul_checkout_data, - name = 'kfet.kpsul.checkout_data'), + name='kfet.kpsul.checkout_data'), url('^k-psul/perform_operations$', views.kpsul_perform_operations, - name = 'kfet.kpsul.perform_operations'), + name='kfet.kpsul.perform_operations'), url('^k-psul/cancel_operations$', views.kpsul_cancel_operations, - name = 'kfet.kpsul.cancel_operations'), + name='kfet.kpsul.cancel_operations'), url('^k-psul/articles_data', views.kpsul_articles_data, - name = 'kfet.kpsul.articles_data'), + name='kfet.kpsul.articles_data'), url('^k-psul/update_addcost$', views.kpsul_update_addcost, - name = 'kfet.kpsul.update_addcost'), + name='kfet.kpsul.update_addcost'), url('^k-psul/get_settings$', views.kpsul_get_settings, - name = 'kfet.kpsul.get_settings'), + name='kfet.kpsul.get_settings'), # ----- # JSON urls # ----- url(r'^history.json$', views.history_json, - name = 'kfet.history.json'), + name='kfet.history.json'), url(r'^accounts/read.json$', views.account_read_json, - name = 'kfet.account.read.json'), + name='kfet.account.read.json'), # ----- @@ -191,24 +197,26 @@ urlpatterns = [ # ----- url(r'^settings/$', - permission_required('kfet.change_settings')(views.SettingsList.as_view()), - name = 'kfet.settings'), + permission_required('kfet.change_settings') + (views.SettingsList.as_view()), + name='kfet.settings'), url(r'^settings/(?P\d+)/edit$', - permission_required('kfet.change_settings')(views.SettingsUpdate.as_view()), - name = 'kfet.settings.update'), + permission_required('kfet.change_settings') + (views.SettingsUpdate.as_view()), + name='kfet.settings.update'), # ----- # Transfers urls # ----- url(r'^transfers/$', views.transfers, - name = 'kfet.transfers'), + name='kfet.transfers'), url(r'^transfers/new$', views.transfers_create, - name = 'kfet.transfers.create'), + name='kfet.transfers.create'), url(r'^transfers/perform$', views.perform_transfers, - name = 'kfet.transfers.perform'), + name='kfet.transfers.perform'), url(r'^transfers/cancel$', views.cancel_transfers, - name = 'kfet.transfers.cancel'), + name='kfet.transfers.cancel'), # ----- # Inventories urls @@ -216,12 +224,12 @@ urlpatterns = [ url(r'^inventaires/$', teamkfet_required(views.InventoryList.as_view()), - name = 'kfet.inventory'), + name='kfet.inventory'), url(r'^inventaires/new$', views.inventory_create, - name = 'kfet.inventory.create'), + name='kfet.inventory.create'), url(r'^inventaires/(?P\d+)$', teamkfet_required(views.InventoryRead.as_view()), - name = 'kfet.inventory.read'), + name='kfet.inventory.read'), # ----- # Order urls @@ -229,15 +237,15 @@ urlpatterns = [ url(r'^orders/$', teamkfet_required(views.OrderList.as_view()), - name = 'kfet.order'), + name='kfet.order'), url(r'^orders/(?P\d+)$', teamkfet_required(views.OrderRead.as_view()), - name = 'kfet.order.read'), + name='kfet.order.read'), url(r'^orders/suppliers/(?P\d+)/edit$', teamkfet_required(views.SupplierUpdate.as_view()), - name = 'kfet.order.supplier.update'), + name='kfet.order.supplier.update'), url(r'^orders/suppliers/(?P\d+)/new-order$', views.order_create, - name = 'kfet.order.new'), + name='kfet.order.new'), url(r'^orders/(?P\d+)/to_inventory$', views.order_to_inventory, - name = 'kfet.order.to_inventory'), + name='kfet.order.to_inventory'), ] diff --git a/kfet/views.py b/kfet/views.py index cd4719ae..ac885675 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import (absolute_import, division, - print_function, unicode_literals) -from builtins import * - from django.shortcuts import render, get_object_or_404, redirect from django.core.exceptions import PermissionDenied, ValidationError from django.core.cache import cache @@ -983,7 +979,7 @@ def kpsul_perform_operations(request): if operationgroup.on_acc.is_cof: if is_addcost: operation.addcost_amount = operation.addcost_amount / cof_grant_divisor - operation.amount = Decimal(float(operation.amount) / cof_grant_divisor) + operation.amount = operation.amount / cof_grant_divisor to_articles_stocks[operation.article] -= operation.article_nb else: if operationgroup.on_acc.is_cash: @@ -2001,8 +1997,8 @@ class HybridDetailView(JSONResponseMixin, SingleObjectTemplateResponseMixin, BaseDetailView): """ - Returns a DetailView as an html page except if a JSON is requested - file by the GET method in which case it returns a JSON response. + Returns a DetailView as an html page except if a JSON file is requested + by the GET method in which case it returns a JSON response. """ def render_to_response(self, context): # Look for a 'format=json' GET argument @@ -2012,14 +2008,12 @@ class HybridDetailView(JSONResponseMixin, return super(HybridDetailView, self).render_to_response(context) -# Rend un ListView en html sauf si on lui précise dans -# l'appel à get que l'on veut un json auquel cas il en rend un class HybridListView(JSONResponseMixin, MultipleObjectTemplateResponseMixin, BaseListView): """ - Returns a ListView as an html page except if a JSON is requested - file by the GET method in which case it returns a JSON response. + Returns a ListView as an html page except if a JSON file is requested + by the GET method in which case it returns a JSON response. """ def render_to_response(self, context): # Look for a 'format=json' GET argument @@ -2035,7 +2029,7 @@ class ObjectResumeStat(DetailView): DOES NOT RETURN A JSON RESPONSE """ template_name = 'kfet/object_stat_resume.html' - context_object_name = 'lul' + context_object_name = '' id_prefix = 'id_a_definir' # nombre de vues à résumer nb_stat = 2 @@ -2054,24 +2048,24 @@ class ObjectResumeStat(DetailView): return [{}] * self.nb_stat def get_context_data(self, **kwargs): - # On hérite pas + # On n'hérite pas object_id = self.object.id url_kwargs = self.url_kwargs() context = {} stats = {} for i in range(self.nb_stat): stats[i] = { - 'label': self.stat_labels[i], - 'btn': "btn_%s_%d_%d" % (self.id_prefix, - object_id, - i), - 'url': reverse_lazy(self.stat_urls[i], - kwargs=dict( - self.get_object_url_kwargs(), - **url_kwargs[i] - ), + 'label': self.stat_labels[i], + 'btn': "btn_%s_%d_%d" % (self.id_prefix, + object_id, + i), + 'url': reverse_lazy(self.stat_urls[i], + kwargs=dict( + self.get_object_url_kwargs(), + **url_kwargs[i] ), - } + ), + } prefix = "%s_%d" % (self.id_prefix, object_id) context['id_prefix'] = prefix context['content_id'] = "content_%s" % prefix @@ -2085,11 +2079,6 @@ 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" # Un résumé de toutes les vues ArticleStatBalance @@ -2129,17 +2118,17 @@ class AccountStatBalanceAll(ObjectResumeStat): class AccountStatBalance(HybridDetailView): """ Returns a graph (or a JSON Response) of the evolution a the personnal - balance of a trigramm between timezone.now() and `nb_days` + balance of a trigramme 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 + takes into account the Operations and the Transfers + does not takes into 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' - id_prefix = "lol" + id_prefix = "" def get_object(self, **kwargs): trigramme = self.kwargs.get(self.trigramme_url_kwarg) @@ -2150,7 +2139,7 @@ class AccountStatBalance(HybridDetailView): 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) + begin_date = timezone.datetime(year=1980, month=1, day=1) anytime = True else: begin_date = this_morning() \ @@ -2296,14 +2285,14 @@ class AccountStatLastAll(ObjectResumeStat): class AccountStatLast(HybridDetailView): """ Returns a graph (or a JSON Response) of the evolution a the personnal - consommation of a trigramm at the diffent dates specified + consommation of a trigramme at the diffent dates specified """ model = Account trigramme_url_kwarg = 'trigramme' template_name = 'kfet/account_stat_last.html' context_object_name = 'account' end_date = timezone.now() - id_prefix = "lol" + id_prefix = "" # doit rendre un dictionnaire des dates # la première date correspond au début @@ -2344,9 +2333,6 @@ class AccountStatLast(HybridDetailView): return operations def get_context_data(self, **kwargs): - # On hérite - # en fait non, pas besoin et c'est chiant à dumper - # context = super(AccountStat, self).get_context_data(**kwargs) context = {} nb_ventes = {} # On récupère les labels des dates @@ -2444,7 +2430,7 @@ class ArticleStatLast(HybridDetailView): template_name = 'kfet/article_stat_last.html' context_object_name = 'article' end_date = timezone.now() - id_prefix = "lol" + id_prefix = "" def render_to_response(self, context): # Look for a 'format=json' GET argument @@ -2465,9 +2451,6 @@ class ArticleStatLast(HybridDetailView): pass def get_context_data(self, **kwargs): - # On hérite - # en fait non, pas besoin et c'est chiant à dumper - # context = super(ArticleStat, self).get_context_data(**kwargs) context = {} # On récupère les labels des dates context['labels'] = self.get_labels().copy()