add PageInfo options on WebsiteTemplateMixin, rewrite website views

This commit is contained in:
Arthur Gerbaud
2016-08-07 13:22:41 +02:00
parent 9bd225ce42
commit a5af70becb
4 changed files with 95 additions and 28 deletions

View File

@@ -24,8 +24,9 @@ from .forms import ( RencontreForm, RencontreInlineFormSet,
class MaraudesView(views.WebsiteProtectedMixin): class MaraudesView(views.WebsiteProtectedMixin):
title = "Maraudes"
header = "Maraudes" class PageInfo:
title = "Maraudes ALSA"
permissions = ['maraudes.view_maraudes'] permissions = ['maraudes.view_maraudes']
@@ -47,6 +48,9 @@ class DerniereMaraudeMixin(object):
return context return context
class IndexView(MaraudesView, DerniereMaraudeMixin, generic.TemplateView): class IndexView(MaraudesView, DerniereMaraudeMixin, generic.TemplateView):
class PageInfo:
title = "Maraude - Tableau de bord"
header = "La Maraude" header = "La Maraude"
header_small = "Tableau de bord" header_small = "Tableau de bord"
@@ -61,8 +65,10 @@ class MaraudeDetailsView(MaraudesView, DerniereMaraudeMixin, generic.DetailView)
template_name = "maraudes/details.html" template_name = "maraudes/details.html"
# Template # Template
header = "Maraude" class PageInfo:
header_small = "Celle-ci" title = "Maraude - {{maraude.date}}"
header = "{{maraude.date}}"
header_small = "détails"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
@@ -79,6 +85,10 @@ class MaraudeListView(MaraudesView, generic.ListView):
template_name = "maraudes/list.html" template_name = "maraudes/list.html"
paginate_by = 10 paginate_by = 10
class PageInfo:
title = "Maraude - Liste des maraudes"
header = "Liste des maraudes"
def get_queryset(self): def get_queryset(self):
today = datetime.date.today() today = datetime.date.today()
return super().get_queryset().filter( return super().get_queryset().filter(
@@ -93,11 +103,14 @@ class CompteRenduCreateView(MaraudesView, generic.DetailView):
template_name = "compte_rendu/compterendu_create.html" template_name = "compte_rendu/compterendu_create.html"
context_object_name = "maraude" context_object_name = "maraude"
header = "Compte-rendu"
header_small = "maraude"
form = None form = None
inline_formset = 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): def get_forms(self, *args, initial=None):
self.form = RencontreForm(*args, self.form = RencontreForm(*args,
initial=initial) initial=initial)
@@ -179,6 +192,11 @@ class CompteRenduUpdateView(MaraudesView, generic.DetailView):
context_object_name = "maraude" context_object_name = "maraude"
template_name = "compte_rendu/compterendu_update.html" template_name = "compte_rendu/compterendu_update.html"
class PageInfo:
title = "{{maraude}} - Compte-rendu"
header = "{{maraude.date}}"
header_small = "compte-rendu"
base_formset = None base_formset = None
inline_formsets = [] inline_formsets = []
rencontres_queryset = None rencontres_queryset = None
@@ -241,9 +259,10 @@ class PlanningView(MaraudesView, generic.TemplateView):
template_name = "planning/planning.html" template_name = "planning/planning.html"
class PageInfo:
title = "Planning" title = "Planning"
header = "Plannification des maraudes" header = "Planning"
header_small = "Mois Année" header_small = "{{month}} {{year}}" #TODO: does not parse extra context
def _parse_request(self): def _parse_request(self):
self.current_date = datetime.date.today() self.current_date = datetime.date.today()
@@ -310,6 +329,9 @@ class LieuCreateView(views.WebsiteProtectedWithAjaxMixin, generic.edit.CreateVie
fields = "__all__" fields = "__all__"
success_url = "/maraudes/" success_url = "/maraudes/"
class PageInfo:
pass
permissions = ['maraudes.add_lieu'] permissions = ['maraudes.add_lieu']
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):

View File

@@ -10,14 +10,19 @@ from sujets.models import Sujet
class SuivisView(views.WebsiteProtectedMixin): class SuivisView(views.WebsiteProtectedMixin):
class PageInfo:
title = "Suivi des bénéficiaires" title = "Suivi des bénéficiaires"
header = "Suivi"
permissions = ['sujets.view_sujets'] permissions = ['sujets.view_sujets']
class IndexView(SuivisView, generic.TemplateView): class IndexView(SuivisView, generic.TemplateView):
template_name = "suivi/index.html" template_name = "suivi/index.html"
class PageInfo:
title = "Suivi des bénéficiaires"
header = "Suivi"
header_small = "Tableau de bord" header_small = "Tableau de bord"
@@ -26,6 +31,11 @@ class SuiviSujetView(SuivisView, generic.DetailView):
template_name = "suivi/details.html" template_name = "suivi/details.html"
context_object_name = "sujet" context_object_name = "sujet"
class PageInfo:
title = "Sujet - {{sujet}}"
header = "{{sujet}}"
header_small = "suivi"
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs) context = super().get_context_data(*args, **kwargs)
context['notes'] = self.object.notes.by_date(reverse=True) context['notes'] = self.object.notes.by_date(reverse=True)

View File

@@ -10,10 +10,12 @@ from django.forms import ModelForm
# Create your views here. # Create your views here.
class SujetsView(views.WebsiteProtectedMixin): class SujetsView(views.WebsiteProtectedMixin):
class PageInfo:
title = "Sujets" title = "Sujets"
def get_active_app(self): 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" template_name = "sujets/sujet_details.html"
model = Sujet model = Sujet
class PageInfo:
title = "Sujet - {{ sujet }}"
header = "{{ sujet }}"
header_small = "suivi"
class SujetListView(SujetsView, generic.ListView): class SujetListView(SujetsView, generic.ListView):
model = Sujet model = Sujet
template_name = "sujets/sujet_liste.html" template_name = "sujets/sujet_liste.html"
class PageInfo:
title = "Sujet - Liste des sujets"
header = "Liste des sujets"
class SujetUpdateView(SujetsView, generic.edit.UpdateView): class SujetUpdateView(SujetsView, generic.edit.UpdateView):
@@ -34,6 +42,11 @@ class SujetUpdateView(SujetsView, generic.edit.UpdateView):
model = Sujet model = Sujet
fields = '__all__' fields = '__all__'
class PageInfo:
title = "Mise à jour - {{sujet}}"
header = "{{sujet}}"
header_small = "mise à jour"
class SujetCreateForm(ModelForm): class SujetCreateForm(ModelForm):
@@ -47,8 +60,9 @@ class SujetCreateView(views.WebsiteProtectedWithAjaxMixin, generic.edit.CreateVi
template_name = "sujets/sujet_create.html" template_name = "sujets/sujet_create.html"
form_class = SujetCreateForm form_class = SujetCreateForm
title = "Création : Sujet" class PageInfo:
header = "Ajouter un sujet" title = "Nouveau sujet"
header = "Nouveau sujet"
permissions = ['sujets.view_sujets', 'sujets.add_sujet'] permissions = ['sujets.view_sujets', 'sujets.add_sujet']
@@ -64,3 +78,6 @@ class SujetCreateView(views.WebsiteProtectedWithAjaxMixin, generic.edit.CreateVi
except: except:
context['next'] = None context['next'] = None
return context return context
#Hack
get_active_app = SujetsView.get_active_app

View File

@@ -2,8 +2,11 @@ import datetime
from django.utils import timezone from django.utils import timezone
from django.views.generic.base import ContextMixin, TemplateResponseMixin from django.views.generic.base import ContextMixin, TemplateResponseMixin
from django.core.exceptions import ImproperlyConfigured
from django.apps import apps from django.apps import apps
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.template import Template, Context
## Utils ## ## Utils ##
def get_apps(app_names): def get_apps(app_names):
@@ -47,11 +50,6 @@ class WebsiteTemplateMixin(TemplateResponseMixin):
If 'content_template' is not defined, value will fallback to template_name If 'content_template' is not defined, value will fallback to template_name
in child view. in child view.
""" """
#TODO: class Template:
title = "Maraudes ALSA"
header = "Page Header"
header_small = None
content_template = None content_template = None
class Configuration: class Configuration:
@@ -60,6 +58,19 @@ class WebsiteTemplateMixin(TemplateResponseMixin):
apps = get_apps(navbar_apps) 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): def get_template_names(self):
""" Ensure same template for all children views. """ """ Ensure same template for all children views. """
return ["base_site.html"] return ["base_site.html"]
@@ -95,6 +106,15 @@ class WebsiteTemplateMixin(TemplateResponseMixin):
def get_prochaine_maraude(self): def get_prochaine_maraude(self):
return apps.get_model('maraudes', model_name="Maraude").objects.next 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): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
@@ -102,15 +122,13 @@ class WebsiteTemplateMixin(TemplateResponseMixin):
context['apps'] = self.Configuration.apps context['apps'] = self.Configuration.apps
context['active_app'] = self.get_active_app() 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['content_template'] = self.get_content_template()
context['panels'] = self.get_panels() context['panels'] = self.get_panels()
context['prochaine_maraude_abs'] = self.get_prochaine_maraude() context['prochaine_maraude_abs'] = self.get_prochaine_maraude()
context['prochaine_maraude'] = self.get_prochaine_maraude_for_user() context['prochaine_maraude'] = self.get_prochaine_maraude_for_user()
self._update_context_with_rendered_blocks(context)
return context return context