mirror of https://gitlab.federez.net/re2o/re2o
committed by
root
24 changed files with 592 additions and 291 deletions
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
""".acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""logs.acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""machines.acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
@ -0,0 +1,2 @@ |
|||
|
|||
from .acl import * |
|||
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""preferences.acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
@ -0,0 +1,235 @@ |
|||
# -*- mode: python; coding: utf-8 -*- |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""Handles ACL for re2o. |
|||
|
|||
Here are defined some decorators that can be used in views to handle ACL. |
|||
""" |
|||
from __future__ import unicode_literals |
|||
|
|||
import sys |
|||
|
|||
from django.contrib import messages |
|||
from django.shortcuts import redirect |
|||
from django.urls import reverse |
|||
|
|||
import cotisations, logs, machines, preferences, search, topologie, users |
|||
|
|||
|
|||
def can_create(model): |
|||
"""Decorator to check if an user can create a model. |
|||
It assumes that a valid user exists in the request and that the model has a |
|||
method can_create(user) which returns true if the user can create this kind |
|||
of models. |
|||
""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
can, msg = model.can_create(request.user, *args, **kwargs) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_edit(model, *field_list): |
|||
"""Decorator to check if an user can edit a model. |
|||
It tries to get an instance of the model, using |
|||
`model.get_instance(*args, **kwargs)` and assumes that the model has a |
|||
method `can_edit(user)` which returns `true` if the user can edit this |
|||
kind of models. |
|||
""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
try: |
|||
instance = model.get_instance(*args, **kwargs) |
|||
except model.DoesNotExist: |
|||
messages.error(request, u"Entrée inexistante") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
can, msg = instance.can_edit(request.user) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
for field in field_list: |
|||
can_create = getattr(model, 'can_change_' + field) |
|||
can, msg = can_create(instance, request.user, *args, **kwargs) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, instance, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_change(model, *field_list): |
|||
"""Decorator to check if an user can edit a field of a model class. |
|||
Difference with can_edit : take a class and not an instance |
|||
""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
for field in field_list: |
|||
can_create = getattr(model, 'can_change_' + field) |
|||
can, msg = can_create(request.user, *args, **kwargs) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_delete(model): |
|||
"""Decorator to check if an user can delete a model. |
|||
It tries to get an instance of the model, using |
|||
`model.get_instance(*args, **kwargs)` and assumes that the model has a |
|||
method `can_delete(user)` which returns `true` if the user can delete this |
|||
kind of models. |
|||
""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
try: |
|||
instance = model.get_instance(*args, **kwargs) |
|||
except model.DoesNotExist: |
|||
messages.error(request, u"Entrée inexistante") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
can, msg = instance.can_delete(request.user) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, instance, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_delete_set(model): |
|||
"""Decorator which returns a list of detable models by request user. |
|||
If none of them, return an error""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
all_objects = model.objects.all() |
|||
instances_id = [] |
|||
for instance in all_objects: |
|||
can, msg = instance.can_delete(request.user) |
|||
if can: |
|||
instances_id.append(instance.id) |
|||
instances = model.objects.filter(id__in=instances_id) |
|||
if not instances: |
|||
messages.error(request, "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, instances, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_view(model): |
|||
"""Decorator to check if an user can view a model. |
|||
It tries to get an instance of the model, using |
|||
`model.get_instance(*args, **kwargs)` and assumes that the model has a |
|||
method `can_view(user)` which returns `true` if the user can view this |
|||
kind of models. |
|||
""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
try: |
|||
instance = model.get_instance(*args, **kwargs) |
|||
except model.DoesNotExist: |
|||
messages.error(request, u"Entrée inexistante") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
can, msg = instance.can_view(request.user) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, instance, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_view_all(model): |
|||
"""Decorator to check if an user can view a class of model. |
|||
""" |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
can, msg = model.can_view_all(request.user) |
|||
if not can: |
|||
messages.error(request, msg or "Vous ne pouvez pas accéder à ce menu") |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return view(request, *args, **kwargs) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_view_app(app_name): |
|||
"""Decorator to check if an user can view an application. |
|||
""" |
|||
assert app_name in sys.modules.keys() |
|||
def decorator(view): |
|||
def wrapper(request, *args, **kwargs): |
|||
app = sys.modules[app_name] |
|||
can,msg = app.can_view(request.user) |
|||
if can: |
|||
return view(request, *args, **kwargs) |
|||
messages.error(request, msg) |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return wrapper |
|||
return decorator |
|||
|
|||
|
|||
def can_edit_history(view): |
|||
"""Decorator to check if an user can edit history.""" |
|||
def wrapper(request, *args, **kwargs): |
|||
if request.user.has_perms(('admin',)): |
|||
return view(request, *args, **kwargs) |
|||
messages.error( |
|||
request, |
|||
"Vous ne pouvez pas éditer l'historique." |
|||
) |
|||
return redirect(reverse('users:profil', |
|||
kwargs={'userid':str(request.user.id)} |
|||
)) |
|||
return wrapper |
|||
|
|||
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""search.acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""topologie.acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
@ -0,0 +1,39 @@ |
|||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il |
|||
# se veut agnostique au réseau considéré, de manière à être installable en |
|||
# quelques clics. |
|||
# |
|||
# Copyright © 2017 Gabriel Détraz |
|||
# Copyright © 2017 Goulven Kermarec |
|||
# Copyright © 2017 Augustin Lemesle |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License along |
|||
# with this program; if not, write to the Free Software Foundation, Inc., |
|||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
"""users.acl |
|||
|
|||
Here are defined some functions to check acl on the application. |
|||
""" |
|||
|
|||
def can_view(user): |
|||
"""Check if an user can view the application. |
|||
|
|||
Args: |
|||
user: The user who wants to view the application. |
|||
|
|||
Returns: |
|||
A couple (allowed, msg) where allowed is a boolean which is True if |
|||
viewing is granted and msg is a message (can be None). |
|||
""" |
|||
can = user.has_perms(('cableur',)) |
|||
return can, None if can else "Vous ne pouvez pas voir cette application." |
|||
Loading…
Reference in new issue