8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-26 06:32:26 +00:00

Gestion des acl avec les permissions django pour cotisation

This commit is contained in:
Gabriel Detraz 2017-12-31 00:23:59 +01:00 committed by root
parent 47ac0eb39f
commit 8ab23e2925
4 changed files with 101 additions and 112 deletions

View file

@ -80,6 +80,12 @@ class Facture(FieldPermissionModelMixin, models.Model):
class Meta: class Meta:
abstract = False abstract = False
permissions = (
("change_facture_control", "Peut changer l'etat de controle"),
("change_facture_pdf", "Peut éditer une facture pdf"),
("view_facture", "Peut voir un objet facture"),
("change_all_facture", "Superdroit, peut modifier toutes les factures"),
)
def prix(self): def prix(self):
"""Renvoie le prix brut sans les quantités. Méthode """Renvoie le prix brut sans les quantités. Méthode
@ -112,13 +118,13 @@ class Facture(FieldPermissionModelMixin, models.Model):
return Facture.objects.get(pk=factureid) return Facture.objects.get(pk=factureid)
def can_create(user_request, *args, **kwargs): def can_create(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.add_facture'), u"Vous n'avez pas le\
droit de créer des factures" droit de créer des factures"
def can_edit(self, user_request, *args, **kwargs): def can_edit(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.change_facture'):
return False, u"Vous n'avez pas le droit d'éditer les factures" return False, u"Vous n'avez pas le droit d'éditer les factures"
elif not user_request.has_perms(('tresorier',)) and\ elif not user_request.has_perm('cotisation.change_all_facture') and\
(self.control or not self.valid): (self.control or not self.valid):
return False, u"Vous n'avez pas le droit d'éditer une facture\ return False, u"Vous n'avez pas le droit d'éditer une facture\
controlée ou invalidée par un trésorier" controlée ou invalidée par un trésorier"
@ -126,7 +132,7 @@ class Facture(FieldPermissionModelMixin, models.Model):
return True, None return True, None
def can_delete(self, user_request, *args, **kwargs): def can_delete(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.delete_facture'):
return False, u"Vous n'avez pas le droit de supprimer une facture" return False, u"Vous n'avez pas le droit de supprimer une facture"
if self.control or not self.valid: if self.control or not self.valid:
return False, u"Vous ne pouvez pas supprimer une facture\ return False, u"Vous ne pouvez pas supprimer une facture\
@ -135,12 +141,12 @@ class Facture(FieldPermissionModelMixin, models.Model):
return True, None return True, None
def can_view_all(user_request, *args, **kwargs): def can_view_all(user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.view_facture'):
return False, u"Vous n'avez pas le droit de voir les factures" return False, u"Vous n'avez pas le droit de voir les factures"
return True, None return True, None
def can_view(self, user_request, *args, **kwargs): def can_view(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)) and\ if not user_request.has_perm('cotisation.view_facture') and\
self.user != user_request: self.user != user_request:
return False, u"Vous ne pouvez pas afficher l'historique d'une\ return False, u"Vous ne pouvez pas afficher l'historique d'une\
facture d'un autre user que vous sans droit cableur" facture d'un autre user que vous sans droit cableur"
@ -207,6 +213,12 @@ class Vente(models.Model):
max_length=255 max_length=255
) )
class Meta:
permissions = (
("view_vente", "Peut voir un objet vente"),
("change_all_vente", "Superdroit, peut modifier toutes les ventes"),
)
def prix_total(self): def prix_total(self):
"""Renvoie le prix_total de self (nombre*prix)""" """Renvoie le prix_total de self (nombre*prix)"""
return self.prix*self.number return self.prix*self.number
@ -263,14 +275,14 @@ class Vente(models.Model):
return Vente.objects.get(pk=venteid) return Vente.objects.get(pk=venteid)
def can_create(user_request, *args, **kwargs): def can_create(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.add_vente'), u"Vous n'avez pas le\
droit de créer des ventes" droit de créer des ventes"
return True, None return True, None
def can_edit(self, user_request, *args, **kwargs): def can_edit(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.change_vente'):
return False, u"Vous n'avez pas le droit d'éditer les ventes" return False, u"Vous n'avez pas le droit d'éditer les ventes"
elif not user_request.has_perms(('tresorier',)) and\ elif not user_request.has_perm('cotisation.change_all_vente') and\
(self.facture.control or not self.facture.valid): (self.facture.control or not self.facture.valid):
return False, u"Vous n'avez pas le droit d'éditer une vente\ return False, u"Vous n'avez pas le droit d'éditer une vente\
controlée ou invalidée par un trésorier" controlée ou invalidée par un trésorier"
@ -278,7 +290,7 @@ class Vente(models.Model):
return True, None return True, None
def can_delete(self, user_request, *args, **kwargs): def can_delete(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.delete_vente'):
return False, u"Vous n'avez pas le droit de supprimer une vente" return False, u"Vous n'avez pas le droit de supprimer une vente"
if self.facture.control or not self.facture.valid: if self.facture.control or not self.facture.valid:
return False, u"Vous ne pouvez pas supprimer une vente\ return False, u"Vous ne pouvez pas supprimer une vente\
@ -287,12 +299,12 @@ class Vente(models.Model):
return True, None return True, None
def can_view_all(user_request, *args, **kwargs): def can_view_all(user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.view_vente'):
return False, u"Vous n'avez pas le droit de voir les ventes" return False, u"Vous n'avez pas le droit de voir les ventes"
return True, None return True, None
def can_view(self, user_request, *args, **kwargs): def can_view(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)) and\ if not user_request.has_perm('cotisation.view_vente') and\
self.facture.user != user_request: self.facture.user != user_request:
return False, u"Vous ne pouvez pas afficher l'historique d'une\ return False, u"Vous ne pouvez pas afficher l'historique d'une\
facture d'un autre user que vous sans droit cableur" facture d'un autre user que vous sans droit cableur"
@ -367,6 +379,11 @@ class Article(models.Model):
unique_together = ('name', 'type_user') unique_together = ('name', 'type_user')
class Meta:
permissions = (
("view_article", "Peut voir un objet article"),
)
def clean(self): def clean(self):
if self.name.lower() == "solde": if self.name.lower() == "solde":
raise ValidationError("Solde est un nom d'article invalide") raise ValidationError("Solde est un nom d'article invalide")
@ -379,23 +396,23 @@ class Article(models.Model):
return Article.objects.get(pk=articleid) return Article.objects.get(pk=articleid)
def can_create(user_request, *args, **kwargs): def can_create(user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.add_article'), u"Vous n'avez pas le\
droit d'ajouter des articles" droit d'ajouter des articles"
def can_edit(self, user_request, *args, **kwargs): def can_edit(self, user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.change_article'), u"Vous n'avez pas le\
droit d'éditer des articles" droit d'éditer des articles"
def can_delete(self, user_request, *args, **kwargs): def can_delete(self, user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.delete_article'), u"Vous n'avez pas le\
droit de supprimer des articles" droit de supprimer des articles"
def can_view_all(user_request, *args, **kwargs): def can_view_all(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.view_article'), u"Vous n'avez pas le\
droit de voir des articles" droit de voir des articles"
def can_view(self, user_request, *args, **kwargs): def can_view(self, user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.view_article'), u"Vous n'avez pas le\
droit de voir des articles" droit de voir des articles"
def __str__(self): def __str__(self):
@ -408,27 +425,32 @@ class Banque(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
class Meta:
permissions = (
("view_banque", "Peut voir un objet banque"),
)
def get_instance(banqueid, *args, **kwargs): def get_instance(banqueid, *args, **kwargs):
return Banque.objects.get(pk=banqueid) return Banque.objects.get(pk=banqueid)
def can_create(user_request, *args, **kwargs): def can_create(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.add_banque'), u"Vous n'avez pas le\
droit d'ajouter des banques" droit d'ajouter des banques"
def can_edit(self, user_request, *args, **kwargs): def can_edit(self, user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.change_banque'), u"Vous n'avez pas le\
droit d'éditer des banques" droit d'éditer des banques"
def can_delete(self, user_request, *args, **kwargs): def can_delete(self, user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.delete_banque'), u"Vous n'avez pas le\
droit de supprimer des banques" droit de supprimer des banques"
def can_view_all(user_request, *args, **kwargs): def can_view_all(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.view_banque'), u"Vous n'avez pas le\
droit de voir des banques" droit de voir des banques"
def can_view(self, user_request, *args, **kwargs): def can_view(self, user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.view_banque'), u"Vous n'avez pas le\
droit de voir des banques" droit de voir des banques"
def __str__(self): def __str__(self):
@ -446,27 +468,32 @@ class Paiement(models.Model):
moyen = models.CharField(max_length=255) moyen = models.CharField(max_length=255)
type_paiement = models.IntegerField(choices=PAYMENT_TYPES, default=0) type_paiement = models.IntegerField(choices=PAYMENT_TYPES, default=0)
class Meta:
permissions = (
("view_paiement", "Peut voir un objet paiement"),
)
def get_instance(paiementid, *args, **kwargs): def get_instance(paiementid, *args, **kwargs):
return Paiement.objects.get(pk=paiementid) return Paiement.objects.get(pk=paiementid)
def can_create(user_request, *args, **kwargs): def can_create(user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.add_paiement'), u"Vous n'avez pas le\
droit d'ajouter des paiements" droit d'ajouter des paiements"
def can_edit(self, user_request, *args, **kwargs): def can_edit(self, user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.change_paiement'), u"Vous n'avez pas le\
droit d'éditer des paiements" droit d'éditer des paiements"
def can_delete(self, user_request, *args, **kwargs): def can_delete(self, user_request, *args, **kwargs):
return user_request.has_perms(('tresorier',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.delete_paiement'), u"Vous n'avez pas le\
droit de supprimer des paiements" droit de supprimer des paiements"
def can_view_all(user_request, *args, **kwargs): def can_view_all(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.view_paiement'), u"Vous n'avez pas le\
droit de voir des paiements" droit de voir des paiements"
def can_view(self, user_request, *args, **kwargs): def can_view(self, user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.view_paiement'), u"Vous n'avez pas le\
droit de voir des paiements" droit de voir des paiements"
def __str__(self): def __str__(self):
@ -501,18 +528,24 @@ class Cotisation(models.Model):
date_start = models.DateTimeField() date_start = models.DateTimeField()
date_end = models.DateTimeField() date_end = models.DateTimeField()
class Meta:
permissions = (
("view_cotisation", "Peut voir un objet cotisation"),
("change_all_cotisation", "Superdroit, peut modifier toutes les cotisations"),
)
def get_instance(cotisationid, *args, **kwargs): def get_instance(cotisationid, *args, **kwargs):
return Cotisations.objects.get(pk=cotisationid) return Cotisations.objects.get(pk=cotisationid)
def can_create(user_request, *args, **kwargs): def can_create(user_request, *args, **kwargs):
return user_request.has_perms(('cableur',)), u"Vous n'avez pas le\ return user_request.has_perm('cotisation.add_cotisation'), u"Vous n'avez pas le\
droit de créer des cotisations" droit de créer des cotisations"
return True, None return True, None
def can_edit(self, user_request, *args, **kwargs): def can_edit(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.change_cotisation'):
return False, u"Vous n'avez pas le droit d'éditer les cotisations" return False, u"Vous n'avez pas le droit d'éditer les cotisations"
elif not user_request.has_perms(('tresorier',)) and\ elif not user_request.has_perm('cotisation.change_all_cotisation') and\
(self.vente.facture.control or not self.vente.facture.valid): (self.vente.facture.control or not self.vente.facture.valid):
return False, u"Vous n'avez pas le droit d'éditer une cotisation\ return False, u"Vous n'avez pas le droit d'éditer une cotisation\
controlée ou invalidée par un trésorier" controlée ou invalidée par un trésorier"
@ -520,7 +553,7 @@ class Cotisation(models.Model):
return True, None return True, None
def can_delete(self, user_request, *args, **kwargs): def can_delete(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.delete_cotisation'):
return False, u"Vous n'avez pas le droit de supprimer une cotisations" return False, u"Vous n'avez pas le droit de supprimer une cotisations"
if self.vente.facture.control or not self.vente.facture.valid: if self.vente.facture.control or not self.vente.facture.valid:
return False, u"Vous ne pouvez pas supprimer une cotisations\ return False, u"Vous ne pouvez pas supprimer une cotisations\
@ -529,12 +562,12 @@ class Cotisation(models.Model):
return True, None return True, None
def can_view_all(user_request, *args, **kwargs): def can_view_all(user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)): if not user_request.has_perm('cotisation.view_cotisation'):
return False, u"Vous n'avez pas le droit de voir les cotisations" return False, u"Vous n'avez pas le droit de voir les cotisations"
return True, None return True, None
def can_view(self, user_request, *args, **kwargs): def can_view(self, user_request, *args, **kwargs):
if not user_request.has_perms(('cableur',)) and\ if not user_request.has_perm('cotisation.view_cotisation') and\
self.vente.facture.user != user_request: self.vente.facture.user != user_request:
return False, u"Vous ne pouvez pas afficher l'historique d'une\ return False, u"Vous ne pouvez pas afficher l'historique d'une\
cotisation d'un autre user que vous sans droit cableur" cotisation d'un autre user que vous sans droit cableur"

View file

@ -9,9 +9,6 @@ class FieldPermissionModelMixin:
FIELD_PERMISSION_GETTER = 'can_change_{name}' FIELD_PERMISSION_GETTER = 'can_change_{name}'
FIELD_PERMISSION_MISSING_DEFAULT = True FIELD_PERMISSION_MISSING_DEFAULT = True
def has_perm(self, user, perm):
return user.has_perm(perm) # Never give 'obj' argument here
def has_field_perm(self, user, field): def has_field_perm(self, user, field):
if field in self.field_permissions: if field in self.field_permissions:
checks = self.field_permissions[field] checks = self.field_permissions[field]

View file

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-12-30 19:33
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('auth', '0008_alter_user_username_max_length'),
('users', '0060_auto_20171120_0317'),
]
operations = [
migrations.AddField(
model_name='user',
name='groups',
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
),
migrations.AddField(
model_name='user',
name='is_superuser',
field=models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status'),
),
migrations.AddField(
model_name='user',
name='user_permissions',
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
),
]

View file

@ -62,7 +62,8 @@ from django.db import transaction
from django.utils import timezone from django.utils import timezone
from django.contrib.auth.models import ( from django.contrib.auth.models import (
AbstractBaseUser, AbstractBaseUser,
BaseUserManager BaseUserManager,
PermissionsMixin
) )
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
@ -181,7 +182,7 @@ class UserManager(BaseUserManager):
""" """
return self._create_user(pseudo, surname, email, password, True) return self._create_user(pseudo, surname, email, password, True)
class User(FieldPermissionModelMixin, AbstractBaseUser): class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin):
""" Definition de l'utilisateur de base. """ Definition de l'utilisateur de base.
Champs principaux : name, surnname, pseudo, email, room, password Champs principaux : name, surnname, pseudo, email, room, password
Herite du django BaseUser et du système d'auth django""" Herite du django BaseUser et du système d'auth django"""
@ -285,20 +286,7 @@ class User(FieldPermissionModelMixin, AbstractBaseUser):
@property @property
def is_admin(self): def is_admin(self):
""" Renvoie si l'user est admin""" """ Renvoie si l'user est admin"""
try: return self.is_superuser
Right.objects.get(user=self, right__listright='admin')
except Right.DoesNotExist:
return False
return True
@is_admin.setter
def is_admin(self, value):
""" Change la valeur de admin à true ou false suivant la valeur de
value"""
if value and not self.is_admin:
self.make_admin()
elif not value and self.is_admin:
self.un_admin()
def get_full_name(self): def get_full_name(self):
""" Renvoie le nom complet de l'user formaté nom/prénom""" """ Renvoie le nom complet de l'user formaté nom/prénom"""
@ -312,66 +300,6 @@ class User(FieldPermissionModelMixin, AbstractBaseUser):
""" Renvoie seulement le nom""" """ Renvoie seulement le nom"""
return self.surname return self.surname
def has_perms(self, perms, obj=None):
""" Renvoie true si l'user dispose de la permission.
Prend en argument une liste de permissions.
TODO : Arranger cette fonction"""
for perm in perms:
if perm in RIGHTS_LINK:
query = Q()
for right in RIGHTS_LINK[perm]:
query = query | Q(right__listright=right)
if Right.objects.filter(Q(user=self) & query):
return True
try:
Right.objects.get(user=self, right__listright=perm)
except Right.DoesNotExist:
return False
return True
def has_perm(self, perm, obj=None):
"""Ne sert à rien"""
return True
def has_right(self, right):
""" Renvoie si un user a un right donné. Crée le right si il n'existe
pas"""
try:
list_right = ListRight.objects.get(listright=right)
except:
list_right = ListRight(listright=right, gid=get_fresh_gid())
list_right.save()
return Right.objects.filter(user=self).filter(
right=list_right
).exists()
@cached_property
def is_bureau(self):
""" True si user a les droits bureau """
return self.has_right('bureau')
@cached_property
def is_bofh(self):
""" True si l'user a les droits bofh"""
return self.has_right('bofh')
@cached_property
def is_cableur(self):
""" True si l'user a les droits cableur
(également true si bureau, infra ou bofh)"""
return self.has_right('cableur') or self.has_right('bureau') or\
self.has_right('infra') or self.has_right('bofh')
@cached_property
def is_trez(self):
""" Renvoie true si droits trésorier pour l'user"""
return self.has_right('tresorier')
@cached_property
def is_infra(self):
""" True si a les droits infra"""
return self.has_right('infra')
def end_adhesion(self): def end_adhesion(self):
""" Renvoie la date de fin d'adhésion d'un user. Examine les objets """ Renvoie la date de fin d'adhésion d'un user. Examine les objets
cotisation""" cotisation"""