From 891ef9ef6325c923b82051e5ea0035b06bda5ce5 Mon Sep 17 00:00:00 2001 From: Arthur Gerbaud Date: Sat, 19 Nov 2016 21:46:40 +0100 Subject: [PATCH] modified website.decorators, webpage->app_config, created new configs --- .../templates/compte_rendu/menu/creation.html | 54 ++++++++++++++++++ .../templates/compte_rendu/menu_creation.html | 56 ------------------- .../admin_menu.html} | 0 .../dernieres_maraudes.html} | 0 maraudes/tests.py | 2 +- maraudes/views.py | 37 ++++++++---- suivi/templates/suivi/menu/admin_sujets.html | 2 - suivi/templates/suivi/menu/sujets.html | 2 +- suivi/urls.py | 2 +- suivi/views.py | 40 ++++++++++--- sujets/urls.py | 1 - sujets/views.py | 40 +++---------- website/decorators.py | 30 +++++----- website/mixins.py | 18 +++--- 14 files changed, 148 insertions(+), 136 deletions(-) create mode 100644 maraudes/templates/compte_rendu/menu/creation.html rename maraudes/templates/maraudes/{menu_administration.html => menu/admin_menu.html} (100%) rename maraudes/templates/maraudes/{menu_dernieres_maraudes.html => menu/dernieres_maraudes.html} (100%) diff --git a/maraudes/templates/compte_rendu/menu/creation.html b/maraudes/templates/compte_rendu/menu/creation.html new file mode 100644 index 0000000..92196ee --- /dev/null +++ b/maraudes/templates/compte_rendu/menu/creation.html @@ -0,0 +1,54 @@ +{% load bootstrap3 %} +
  • {% bootstrap_icon "wrench" %} Gérer les sujets
  • -{% endif %} diff --git a/suivi/templates/suivi/menu/sujets.html b/suivi/templates/suivi/menu/sujets.html index 81bbeb0..206e163 100644 --- a/suivi/templates/suivi/menu/sujets.html +++ b/suivi/templates/suivi/menu/sujets.html @@ -1,6 +1,6 @@ {% load bootstrap3 %}
  • - Liste des sujets + Liste des sujets {% bootstrap_icon "list" %}
  • diff --git a/suivi/urls.py b/suivi/urls.py index 3867732..b98ddf8 100644 --- a/suivi/urls.py +++ b/suivi/urls.py @@ -1,9 +1,9 @@ from django.conf.urls import url from . import views -from sujets import views as sujets_views urlpatterns = [ url(r'^$', views.IndexView.as_view(), name="index"), + url(r'liste/$', views.SujetListView.as_view(), name="liste"), url(r'(?P[0-9]+)/$', views.SuiviSujetView.as_view(), name="details"), ] diff --git a/suivi/views.py b/suivi/views.py index a9b30da..8cef7b8 100644 --- a/suivi/views.py +++ b/suivi/views.py @@ -9,15 +9,17 @@ from notes.forms import AutoNoteForm # Create your views here. from utilisateurs.models import Maraudeur from website import decorators as website -webpage = website.webpage( +suivi = website.app_config( + name="suivi", + groups=[Maraudeur], + menu=["suivi/menu/sujets.html"], + admin_menu=["suivi/menu/admin_sujets.html"], ajax=False, - app_users=[Maraudeur], - app_menu=["suivi/menu/sujets.html", "suivi/menu/admin_sujets.html"] ) -@webpage +@suivi class IndexView(NoteFormMixin, generic.TemplateView): class PageInfo: title = "Suivi des bénéficiaires" @@ -36,10 +38,33 @@ class IndexView(NoteFormMixin, generic.TemplateView): #TemplateView template_name = "suivi/index.html" +@suivi +class SujetListView(generic.ListView): + class PageInfo: + title = "Sujet - Liste des sujets" + header = "Liste des sujets" + #ListView + model = Sujet + template_name = "sujets/sujet_liste.html" + paginate_by = 30 + def post(self, request, **kwargs): + from watson import search as watson + search_text = request.POST.get('q') + results = watson.filter(Sujet, search_text) + if results.count() == 1: + return redirect(results[0].get_absolute_url()) + self.queryset = results + return self.get(request, **kwargs) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['query_text'] = self.request.POST.get('q', None) + return context - -@webpage +# Import app_config from 'sujets' application, using +# its admin_menu option +from sujets.views import sujets +@sujets class SuiviSujetView(NoteFormMixin, generic.DetailView): class PageInfo: title = "Sujet - {{sujet}}" @@ -59,9 +84,6 @@ class SuiviSujetView(NoteFormMixin, generic.DetailView): model = Sujet template_name = "suivi/details.html" context_object_name = "sujet" - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.insert_menu("sujets/menu_sujet.html") 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/urls.py b/sujets/urls.py index 85f8067..7352f69 100644 --- a/sujets/urls.py +++ b/sujets/urls.py @@ -5,6 +5,5 @@ from . import views urlpatterns = [ url(r'(?P[0-9]+)/$', views.SujetDetailsView.as_view(), name="details"), url(r'(?P[0-9]+)/update/$', views.SujetUpdateView.as_view(), name="update"), - url(r'liste/$', views.SujetListView.as_view(), name="liste"), url(r'create/$', views.SujetCreateView.as_view(), name="create"), ] diff --git a/sujets/views.py b/sujets/views.py index 627d425..865e082 100644 --- a/sujets/views.py +++ b/sujets/views.py @@ -7,15 +7,16 @@ from .forms import SujetCreateForm ### Webpage config from utilisateurs.models import Maraudeur from website import decorators as website -webpage = website.webpage( +sujets = website.app_config( + name="suivi", + groups=[Maraudeur], + menu=["suivi/menu/sujets.html"], + admin_menu=["sujets/menu/admin_sujet.html"], ajax=True, - app_users=[Maraudeur], - app_name="suivi", - app_menu=["sujets/menu/admin_sujet.html"] ) ### Views -@webpage +@sujets class SujetDetailsView(generic.DetailView): class PageInfo: title = "Sujet - {{ sujet }}" @@ -27,33 +28,10 @@ class SujetDetailsView(generic.DetailView): -@webpage -class SujetListView(generic.ListView): - class PageInfo: - title = "Sujet - Liste des sujets" - header = "Liste des sujets" - #ListView - model = Sujet - template_name = "sujets/sujet_liste.html" - paginate_by = 30 - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.insert_menu("sujets/menu/admin_sujet.html") - def post(self, request, **kwargs): - from watson import search as watson - search_text = request.POST.get('q') - results = watson.filter(Sujet, search_text) - if results.count() == 1: - return redirect(results[0].get_absolute_url()) - self.queryset = results - return self.get(request, **kwargs) - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context['query_text'] = self.request.POST.get('q', None) - return context -@webpage + +@sujets class SujetUpdateView(generic.edit.UpdateView): class PageInfo: title = "Mise à jour - {{sujet}}" @@ -66,7 +44,7 @@ class SujetUpdateView(generic.edit.UpdateView): -@webpage +@sujets class SujetCreateView(generic.edit.CreateView): class PageInfo: title = "Nouveau sujet" diff --git a/website/decorators.py b/website/decorators.py index 8151198..7ca9e3a 100644 --- a/website/decorators.py +++ b/website/decorators.py @@ -5,16 +5,19 @@ def _insert_bases(cls, bases): new_bases = tuple(bases) + old_bases cls.__bases__ = new_bases -def webpage(**options): - """ Class decorators that insert needed bases according to options : +def app_config(**options): + """ Insert per-application configuration options : + -- name : name of the app to register under in navbar + -- groups : user groups needed to access this application + -- menu : user menu templates to be used + -- admin_menu : admin menu templates, only appear for superuser -- ajax : view will return content_template for Ajax requests - -- permissions : list of permissions needed to access view """ + name = options.pop('name', None) + groups = options.pop('groups', []) #Transition from app_users + menu = options.pop('menu', []) + admin_menu = options.pop('admin_menu', []) ajax = options.pop('ajax', False) - permissions = options.pop('permissions', []) - app_menu = options.pop('app_menu', []) - app_name = options.pop('app_name', None) - app_users = options.pop('app_users', []) new_bases = [] if ajax: @@ -22,18 +25,15 @@ def webpage(**options): else: new_bases.append(WebsiteTemplateMixin) - if permissions: - new_bases.append(PermissionRequiredMixin) - if app_users: + if groups: #TODO: use group instaed of user class new_bases.append(SpecialUserRequiredMixin) def class_decorator(cls): _insert_bases(cls, new_bases) - if permissions: - cls.permissions = permissions - cls.app_menu = app_menu.copy() #avoid conflict between Views - cls.app_name = app_name - cls.app_users = app_users.copy() + cls._user_menu = menu + cls._admin_menu = admin_menu + cls.app_name = name + cls.app_users = groups.copy() return cls return class_decorator diff --git a/website/mixins.py b/website/mixins.py index 6d1168c..d3f2ead 100644 --- a/website/mixins.py +++ b/website/mixins.py @@ -70,7 +70,12 @@ class WebsiteTemplateMixin(TemplateResponseMixin): """ base_template = "base_site.html" content_template = None + app_name = None + _user_menu = [] + _admin_menu = [] + _groups = [] + class Configuration: stylesheets = ['base.css'] @@ -147,16 +152,15 @@ class WebsiteTemplateMixin(TemplateResponseMixin): self._active_app = self.get_active_app() return self._active_app - def get_menu(self): + @property + def menu(self): """ Renvoie la liste des templates utilisés comme menu pour l'application active """ - return self.app_menu + if not self.request.user.is_superuser: + return self._user_menu + return self._user_menu + self._admin_menu - def insert_menu(self, template_name): - """ Insert menu at beginning of self.app_menu """ - if not template_name in self.app_menu: - self.app_menu.insert(0, template_name) def _update_context_with_rendered_blocks(self, context): """ Render text for existing PageInfo attributes. @@ -178,7 +182,7 @@ class WebsiteTemplateMixin(TemplateResponseMixin): context = user_processor(self.request, context) #Webpage context['content_template'] = self.get_content_template() - context['app_menu'] = self.get_menu() + context['app_menu'] = self.menu return context class WebsiteAjaxTemplateMixin(WebsiteTemplateMixin):