working on #10

This commit is contained in:
Arthur Gerbaud
2016-11-15 16:47:44 +01:00
parent b085d6295c
commit 96f013041b
8 changed files with 55 additions and 13 deletions

View File

@@ -22,10 +22,12 @@ from .forms import ( RencontreForm, RencontreInlineFormSet,
ObservationInlineFormSet, ObservationInlineFormSetNoExtra, ObservationInlineFormSet, ObservationInlineFormSetNoExtra,
MaraudeAutoDateForm, MonthSelectForm, ) MaraudeAutoDateForm, MonthSelectForm, )
from utilisateurs.models import Maraudeur
from website import decorators as website from website import decorators as website
webpage = website.webpage( webpage = website.webpage(
ajax=False, ajax=False,
permissions=['maraudes.view_maraudes'], app_users=[Maraudeur],
app_menu=["maraudes/menu_dernieres_maraudes.html", "maraudes/menu_administration.html"] app_menu=["maraudes/menu_dernieres_maraudes.html", "maraudes/menu_administration.html"]
) )

View File

@@ -7,10 +7,11 @@ from .forms import *
from notes.mixins import NoteFormMixin from notes.mixins import NoteFormMixin
from notes.forms import AutoNoteForm from notes.forms import AutoNoteForm
# Create your views here. # Create your views here.
from utilisateurs.models import Maraudeur
from website import decorators as website from website import decorators as website
webpage = website.webpage( webpage = website.webpage(
ajax=False, ajax=False,
permissions=['sujets.view_sujets'], app_users=[Maraudeur],
app_menu=["suivi/menu_sujets.html"] app_menu=["suivi/menu_sujets.html"]
) )

View File

@@ -5,10 +5,11 @@ from .models import Sujet
from .forms import SujetCreateForm from .forms import SujetCreateForm
### Webpage config ### Webpage config
from utilisateurs.models import Maraudeur
from website import decorators as website from website import decorators as website
webpage = website.webpage( webpage = website.webpage(
ajax=True, ajax=True,
permissions=['sujets.view_sujets'], app_users=[Maraudeur],
app_name="suivi", app_name="suivi",
app_menu=[] app_menu=[]
) )
@@ -70,10 +71,6 @@ class SujetCreateView(generic.edit.CreateView):
class PageInfo: class PageInfo:
title = "Nouveau sujet" title = "Nouveau sujet"
header = "Nouveau sujet" header = "Nouveau sujet"
# Special permissions
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.permissions += ['sujets.add_sujet']
#CreateView #CreateView
template_name = "sujets/sujet_create.html" template_name = "sujets/sujet_create.html"
form_class = SujetCreateForm form_class = SujetCreateForm

View File

@@ -1,15 +1,25 @@
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from utilisateurs.models import Maraudeur
class MyBackend(ModelBackend): class MyBackend(ModelBackend):
def authenticate(self, **kwargs): def authenticate(self, **kwargs):
print('use MyBackend') print('authenticate using MyBackend')
return super().authenticate(**kwargs) return super().authenticate(**kwargs)
def get_user(self, user_id): def get_user(self, user_id):
""" Retourne la classe enfant de l'utilisateur connecté
s'il en a une, sinon le User par défaut.
"""
print('use MyBackend: get_user', user_id) print('use MyBackend: get_user', user_id)
return super().get_user(user_id) try:
user = Maraudeur.objects.get(pk=user_id)
except Maraudeur.DoesNotExist:
print('no Maraudeur found. Using base user class')
user = super().get_user(user_id)
print("found:", user, user.__class__)
return user
def has_perm(self, *args, **kwargs): def has_perm(self, *args, **kwargs):
print('call has_perm', args, kwargs) print('call has_perm', args, kwargs)

View File

@@ -14,14 +14,18 @@ def webpage(**options):
permissions = options.pop('permissions', []) permissions = options.pop('permissions', [])
app_menu = options.pop('app_menu', []) app_menu = options.pop('app_menu', [])
app_name = options.pop('app_name', None) app_name = options.pop('app_name', None)
app_users = options.pop('app_users', [])
new_bases = [] new_bases = []
if ajax: if ajax:
new_bases.append(WebsiteAjaxTemplateMixin) new_bases.append(WebsiteAjaxTemplateMixin)
else: else:
new_bases.append(WebsiteTemplateMixin) new_bases.append(WebsiteTemplateMixin)
if permissions: if permissions:
new_bases.append(PermissionRequiredMixin) new_bases.append(PermissionRequiredMixin)
if app_users:
new_bases.append(SpecialUserRequiredMixin)
def class_decorator(cls): def class_decorator(cls):
_insert_bases(cls, new_bases) _insert_bases(cls, new_bases)
@@ -29,6 +33,7 @@ def webpage(**options):
cls.permissions = permissions cls.permissions = permissions
cls.app_menu = app_menu.copy() #avoid conflict between Views cls.app_menu = app_menu.copy() #avoid conflict between Views
cls.app_name = app_name cls.app_name = app_name
cls.app_users = app_users.copy()
return cls return cls
return class_decorator return class_decorator

View File

@@ -2,7 +2,9 @@ import datetime
from django.utils import timezone from django.utils import timezone
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.apps import apps from django.apps import apps
#TODO: remove next line
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.decorators import user_passes_test
from django.template import Template, Context from django.template import Template, Context
from django.views.generic.base import ContextMixin, TemplateResponseMixin from django.views.generic.base import ContextMixin, TemplateResponseMixin
@@ -17,6 +19,28 @@ class PermissionRequiredMixin(object):
view = super(PermissionRequiredMixin, cls).as_view(**initkwargs) view = super(PermissionRequiredMixin, cls).as_view(**initkwargs)
return permission_required(cls.permissions)(view) return permission_required(cls.permissions)(view)
def special_user_required(authorized_users):
valid_cls = tuple(authorized_users)
def check_special_user(user):
print('check user is instance of', valid_cls)
if isinstance(user, valid_cls):
return True
else:
return False
return user_passes_test(check_special_user)
class SpecialUserRequiredMixin(object):
app_users = []
@classmethod
def as_view(cls, **initkwargs):
view = super().as_view(**initkwargs)
return special_user_required(cls.app_users)(view)
class TemplateFieldsMetaclass(type): class TemplateFieldsMetaclass(type):
@@ -105,10 +129,13 @@ class WebsiteTemplateMixin(TemplateResponseMixin):
def get_active_app(self): def get_active_app(self):
if not self.app_name: if not self.app_name:
self.app_name = self.__class__.__module__.split(".")[0] self.app_name = self.__class__.__module__.split(".")[0]
# If app is website, there is no "active" application
if self.app_name == "website":
return None
active_app = apps.get_app_config(self.app_name) active_app = apps.get_app_config(self.app_name)
if not active_app in self.apps: #TODO: how do we deal with this ? if not active_app in self.apps: #TODO: how do we deal with this ?
print("%s must be registered in Configuration.navbar_apps" % active_app) raise ValueError("%s must be registered in Configuration.navbar_apps" % active_app)
return None
return active_app return active_app
@property @property

View File

@@ -15,7 +15,7 @@
<li class="{% if app == active_app %}active{%endif%}"> <li class="{% if app == active_app %}active{%endif%}">
<a href="/{{app.label}}/">{% bootstrap_icon app.menu_icon %} &middot; <strong>{{ app.name|title }}</strong></a> <a href="/{{app.label}}/">{% bootstrap_icon app.menu_icon %} &middot; <strong>{{ app.name|title }}</strong></a>
</li> </li>
{% if app == active_app %}{% for t in app_menu %}{% include t %}{% endfor %}{% endif %} {% if app == active_app %}{% for template in app_menu %}{% include template %}{% endfor %}{% endif %}
{% endif %}{%endfor%} {% endif %}{%endfor%}
</ul> </ul>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">

View File

@@ -8,7 +8,7 @@ from django.http import HttpResponseRedirect
class Index(WebsiteTemplateMixin, views.generic.TemplateView): class Index(WebsiteTemplateMixin, views.generic.TemplateView):
template_name = "main.html" template_name = "main.html"
app_menu = [] #TODO: fix this ! app_menu = None
login_response = None login_response = None
class PageInfo: class PageInfo: