From a5af70becbe1c00faba2e97f4aee05cc463a3429 Mon Sep 17 00:00:00 2001 From: Arthur Gerbaud Date: Sun, 7 Aug 2016 13:22:41 +0200 Subject: [PATCH] add PageInfo options on WebsiteTemplateMixin, rewrite website views --- maraudes/views.py | 44 +++++++++++++++++++++++++++++++++----------- suivi/views.py | 16 +++++++++++++--- sujets/views.py | 27 ++++++++++++++++++++++----- website/views.py | 36 +++++++++++++++++++++++++++--------- 4 files changed, 95 insertions(+), 28 deletions(-) diff --git a/maraudes/views.py b/maraudes/views.py index 0bb38ca..0987f06 100644 --- a/maraudes/views.py +++ b/maraudes/views.py @@ -24,8 +24,9 @@ from .forms import ( RencontreForm, RencontreInlineFormSet, class MaraudesView(views.WebsiteProtectedMixin): - title = "Maraudes" - header = "Maraudes" + + class PageInfo: + title = "Maraudes ALSA" permissions = ['maraudes.view_maraudes'] @@ -47,8 +48,11 @@ class DerniereMaraudeMixin(object): return context class IndexView(MaraudesView, DerniereMaraudeMixin, generic.TemplateView): - header = "La Maraude" - header_small = "Tableau de bord" + + class PageInfo: + title = "Maraude - Tableau de bord" + header = "La Maraude" + header_small = "Tableau de bord" template_name = "maraudes/index.html" @@ -61,8 +65,10 @@ class MaraudeDetailsView(MaraudesView, DerniereMaraudeMixin, generic.DetailView) template_name = "maraudes/details.html" # Template - header = "Maraude" - header_small = "Celle-ci" + class PageInfo: + title = "Maraude - {{maraude.date}}" + header = "{{maraude.date}}" + header_small = "détails" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -79,6 +85,10 @@ class MaraudeListView(MaraudesView, generic.ListView): template_name = "maraudes/list.html" paginate_by = 10 + class PageInfo: + title = "Maraude - Liste des maraudes" + header = "Liste des maraudes" + def get_queryset(self): today = datetime.date.today() return super().get_queryset().filter( @@ -93,11 +103,14 @@ class CompteRenduCreateView(MaraudesView, generic.DetailView): template_name = "compte_rendu/compterendu_create.html" context_object_name = "maraude" - header = "Compte-rendu" - header_small = "maraude" form = None inline_formset = None + class PageInfo: + title = "{{maraude}} - Compte-rendu" + header = "{{maraude.date}}" + header_small = "écriture du compte-rendu" + def get_forms(self, *args, initial=None): self.form = RencontreForm(*args, initial=initial) @@ -179,6 +192,11 @@ class CompteRenduUpdateView(MaraudesView, generic.DetailView): context_object_name = "maraude" template_name = "compte_rendu/compterendu_update.html" + class PageInfo: + title = "{{maraude}} - Compte-rendu" + header = "{{maraude.date}}" + header_small = "compte-rendu" + base_formset = None inline_formsets = [] rencontres_queryset = None @@ -241,9 +259,10 @@ class PlanningView(MaraudesView, generic.TemplateView): template_name = "planning/planning.html" - title = "Planning" - header = "Plannification des maraudes" - header_small = "Mois Année" + class PageInfo: + title = "Planning" + header = "Planning" + header_small = "{{month}} {{year}}" #TODO: does not parse extra context def _parse_request(self): self.current_date = datetime.date.today() @@ -310,6 +329,9 @@ class LieuCreateView(views.WebsiteProtectedWithAjaxMixin, generic.edit.CreateVie fields = "__all__" success_url = "/maraudes/" + class PageInfo: + pass + permissions = ['maraudes.add_lieu'] def post(self, request, *args, **kwargs): diff --git a/suivi/views.py b/suivi/views.py index 074c049..e9f17a8 100644 --- a/suivi/views.py +++ b/suivi/views.py @@ -10,15 +10,20 @@ from sujets.models import Sujet class SuivisView(views.WebsiteProtectedMixin): - title = "Suivi des bénéficiaires" - header = "Suivi" + + class PageInfo: + title = "Suivi des bénéficiaires" permissions = ['sujets.view_sujets'] class IndexView(SuivisView, generic.TemplateView): template_name = "suivi/index.html" - header_small = "Tableau de bord" + + class PageInfo: + title = "Suivi des bénéficiaires" + header = "Suivi" + header_small = "Tableau de bord" class SuiviSujetView(SuivisView, generic.DetailView): @@ -26,6 +31,11 @@ class SuiviSujetView(SuivisView, generic.DetailView): template_name = "suivi/details.html" context_object_name = "sujet" + class PageInfo: + title = "Sujet - {{sujet}}" + header = "{{sujet}}" + header_small = "suivi" + def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) context['notes'] = self.object.notes.by_date(reverse=True) diff --git a/sujets/views.py b/sujets/views.py index 559e685..17668b4 100644 --- a/sujets/views.py +++ b/sujets/views.py @@ -10,10 +10,12 @@ from django.forms import ModelForm # Create your views here. class SujetsView(views.WebsiteProtectedMixin): - title = "Sujets" + + class PageInfo: + title = "Sujets" def get_active_app(self): - return super().get_active_app(app_name='suivi') + return super(views.WebsiteProtectedMixin, self).get_active_app(app_name='suivi') @@ -21,12 +23,18 @@ class SujetDetailsView(SujetsView, generic.DetailView): template_name = "sujets/sujet_details.html" model = Sujet - + class PageInfo: + title = "Sujet - {{ sujet }}" + header = "{{ sujet }}" + header_small = "suivi" class SujetListView(SujetsView, generic.ListView): model = Sujet template_name = "sujets/sujet_liste.html" + class PageInfo: + title = "Sujet - Liste des sujets" + header = "Liste des sujets" class SujetUpdateView(SujetsView, generic.edit.UpdateView): @@ -34,6 +42,11 @@ class SujetUpdateView(SujetsView, generic.edit.UpdateView): model = Sujet fields = '__all__' + class PageInfo: + title = "Mise à jour - {{sujet}}" + header = "{{sujet}}" + header_small = "mise à jour" + class SujetCreateForm(ModelForm): @@ -47,8 +60,9 @@ class SujetCreateView(views.WebsiteProtectedWithAjaxMixin, generic.edit.CreateVi template_name = "sujets/sujet_create.html" form_class = SujetCreateForm - title = "Création : Sujet" - header = "Ajouter un sujet" + class PageInfo: + title = "Nouveau sujet" + header = "Nouveau sujet" permissions = ['sujets.view_sujets', 'sujets.add_sujet'] @@ -64,3 +78,6 @@ class SujetCreateView(views.WebsiteProtectedWithAjaxMixin, generic.edit.CreateVi except: context['next'] = None return context + + #Hack + get_active_app = SujetsView.get_active_app diff --git a/website/views.py b/website/views.py index d062312..2cab3a9 100644 --- a/website/views.py +++ b/website/views.py @@ -2,8 +2,11 @@ import datetime from django.utils import timezone from django.views.generic.base import ContextMixin, TemplateResponseMixin +from django.core.exceptions import ImproperlyConfigured + from django.apps import apps from django.contrib.auth.decorators import login_required, permission_required +from django.template import Template, Context ## Utils ## def get_apps(app_names): @@ -47,11 +50,6 @@ class WebsiteTemplateMixin(TemplateResponseMixin): If 'content_template' is not defined, value will fallback to template_name in child view. """ - - #TODO: class Template: - title = "Maraudes ALSA" - header = "Page Header" - header_small = None content_template = None class Configuration: @@ -60,6 +58,19 @@ class WebsiteTemplateMixin(TemplateResponseMixin): apps = get_apps(navbar_apps) + page_blocks = ['header', 'header_small', 'title'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self._page_blocks = [] + if not hasattr(self, "PageInfo"): + raise ImproperlyConfigured("You must define a PageInfo on ", self) + for attr, val in self.PageInfo.__dict__.items(): + if attr[0] is not "_" and type(val) is str: + setattr(self, attr, Template(val)) + self._page_blocks.append(attr) + def get_template_names(self): """ Ensure same template for all children views. """ return ["base_site.html"] @@ -95,6 +106,15 @@ class WebsiteTemplateMixin(TemplateResponseMixin): def get_prochaine_maraude(self): return apps.get_model('maraudes', model_name="Maraude").objects.next + def _update_context_with_rendered_blocks(self, context): + """ Render text for existing PageInfo attributes. + See Configuration.page_blocks for valid attribute names """ + render_context = Context(context) + for attr in self._page_blocks: + name = "page_%s" % attr + context[name] = getattr(self, attr).render(render_context) + return context + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -102,15 +122,13 @@ class WebsiteTemplateMixin(TemplateResponseMixin): context['apps'] = self.Configuration.apps context['active_app'] = self.get_active_app() - context['page_title'] = self.title - context['page_header'] = self.header - context['page_header_small'] = self.header_small - context['content_template'] = self.get_content_template() context['panels'] = self.get_panels() context['prochaine_maraude_abs'] = self.get_prochaine_maraude() context['prochaine_maraude'] = self.get_prochaine_maraude_for_user() + + self._update_context_with_rendered_blocks(context) return context