This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
authentic2-pratic/src/authentic2_pratic/views.py

325 lines
11 KiB
Python

from django.utils.translation import ugettext_lazy as _
from django.shortcuts import get_object_or_404, redirect
from django.contrib import messages
from django.contrib.auth.views import redirect_to_login
from django.db.models.query import Q
from django.core.urlresolvers import reverse
from django.views.generic import (TemplateView, UpdateView,
CreateView, DeleteView)
from django_tables2 import SingleTableView
from authentic2.manager.views import AjaxFormViewMixin, \
ActionMixin, OtherActionsMixin, TitleMixin, Action
from authentic2.manager.user_views import UserEditView, UserAddView
from . import models, tables, forms
class SearchMixin(object):
search_filter = []
def get_queryset(self):
qs = super(SearchMixin, self).get_queryset()
search = self.request.GET.get('search')
if search:
filters = []
for name in self.search_filter:
filters.append(Q(**{'%s__contains' % name: search}))
filters = reduce(Q.__or__, filters)
qs = qs.filter(filters)
return qs
class AdminMixin(object):
def dispatch(self, request, *args, **kwargs):
user = request.user
if not user.is_authenticated:
return redirect_to_login(request.get_full_path())
if not user.is_superuser and (not hasattr(user, 'is_admin') or not user.is_admin):
messages.warning(request, _('You are not a super-administrator or a collectivity administrator'))
return redirect('auth_homepage')
return super(AdminMixin, self).dispatch(request, *args, **kwargs)
class SuperAdminMixin(object):
def dispatch(self, request, *args, **kwargs):
user = request.user
if not user.is_authenticated:
return redirect_to_login(request.get_full_path())
if not user.is_superuser:
messages.warning(request, _('You are not a super-administrator'))
return redirect('auth_homepage')
return super(SuperAdminMixin, self).dispatch(request, *args, **kwargs)
class HomepageView(AdminMixin, TemplateView):
template_name = 'authentic2_pratic/homepage.html'
# Services
class ServicesView(SuperAdminMixin, SingleTableView):
template_name = 'authentic2_pratic/services.html'
model = models.Service
table_class = tables.ServiceTable
class ServiceAddView(SuperAdminMixin, TitleMixin, ActionMixin, AjaxFormViewMixin, CreateView):
model = models.Service
form_class = forms.ServiceForm
title = _('Add service')
template_name = 'authentic2_pratic/form.html'
action = _('Add')
success_url = '..'
class ServiceView(SuperAdminMixin, TitleMixin, OtherActionsMixin,
AjaxFormViewMixin, UpdateView):
model = models.Service
title = _('Edit service')
template_name = 'authentic2_pratic/form.html'
form_class = forms.ServiceForm
class ServiceDeleteView(SuperAdminMixin, TitleMixin, AjaxFormViewMixin, DeleteView):
model = models.Service
template_name = 'authentic2_pratic/delete.html'
title = _('Delete service')
success_url = 'a2-pratic-services'
# Collectivities
class CollectivitiesView(SuperAdminMixin, SearchMixin, SingleTableView):
search_filter = ('name', 'slug', 'sirh_label', 'postal_code')
template_name = 'authentic2_pratic/collectivities.html'
model = models.Collectivity
table_class = tables.CollectivityTable
class CollectivityAddView(SuperAdminMixin, TitleMixin, ActionMixin, AjaxFormViewMixin, CreateView):
model = models.Collectivity
title = _('Add collectivity')
template_name = 'authentic2_pratic/form.html'
action = _('Add')
form_class = forms.CollectivityForm
success_url = '..'
class CollectivityView(SuperAdminMixin, TitleMixin, OtherActionsMixin,
AjaxFormViewMixin, UpdateView):
model = models.Collectivity
title = _('Edit collectivity')
template_name = 'authentic2_pratic/collectivity_edit.html'
form_class = forms.CollectivityForm
pk_url_kwarg = 'collectivity_pk'
class CollectivityDeleteView(SuperAdminMixin, TitleMixin, AjaxFormViewMixin, DeleteView):
model = models.Service
template_name = 'authentic2_pratic/delete.html'
title = _('Delete collectivity')
success_url = 'a2-pratic-collectivities'
pk_url_kwarg = 'collectivity_pk'
class CollectivityMixin(object):
def dispatch(self, request, *args, **kwargs):
self.collectivity = get_object_or_404(models.Collectivity,
pk=kwargs['collectivity_pk'])
user = request.user
if not user.is_authenticated:
return redirect_to_login(request.get_full_path())
if not user.is_superuser and \
(not hasattr(user, 'is_admin') or
not (user.is_admin and user.ou == self.collectivity)):
messages.warning(request, _('You are not a super-administrator or an administrator of %s') % self.collectivity)
return redirect('auth_homepage')
return super(CollectivityMixin, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
ctx = super(CollectivityMixin, self).get_context_data(**kwargs)
ctx['collectivity'] = self.collectivity
return ctx
class CollectivityChildMixin(CollectivityMixin):
def get_queryset(self):
qs = super(CollectivityMixin, self).get_queryset()
return qs.filter(collectivity=self.collectivity)
def get_form_kwargs(self):
kwargs = super(CollectivityMixin, self).get_form_kwargs()
if not kwargs.get('instance'):
kwargs['instance'] = self.model(collectivity=self.collectivity)
return kwargs
# users
class UsersView(CollectivityChildMixin, SingleTableView):
template_name = 'authentic2_pratic/users.html'
model = models.User
table_class = tables.UserTable
class UserAddView(CollectivityChildMixin, UserAddView):
model = models.User
title = _('Add agent')
action = _('Add')
form_class = forms.UserAddForm
template_name = 'authentic2_pratic/form.html'
success_url = '..'
fields = (
'uid',
'first_name',
'last_name',
'email',
'is_admin',
'direction',
'employee_type',
'postal_address',
'fax',
'mobile',
'phone',
'certificate_issuer_dn',
'certificate_subject_dn',
'certificate',
)
def get_success_url(self):
return reverse('a2-pratic-user-edit', kwargs={'collectivity_pk': self.object.collectivity.pk, 'pk': self.object.pk})
class UserView(CollectivityChildMixin, UserEditView):
model = models.User
title = _('Edit agent')
form_class = forms.UserEditForm
template_name = 'authentic2_pratic/user_edit.html'
fields = (
'uid',
'first_name',
'last_name',
'email',
'is_admin',
'direction',
'employee_type',
'postal_address',
'fax',
'mobile',
'phone',
'certificate_issuer_dn',
'certificate_subject_dn',
'certificate',
)
def get_other_actions(self):
actions = list(super(UserView, self).get_other_actions())
for action in actions:
if action.url_name == 'a2-manager-user-change-password':
action.url_name = None
action.url = reverse('a2-manager-user-change-password',
kwargs={'collectivity_pk':
self.object.collectivity.pk,
'pk': self.object.pk})
return actions
class UserDeleteView(CollectivityChildMixin, TitleMixin, AjaxFormViewMixin,
DeleteView):
model = models.User
template_name = 'authentic2_pratic/delete.html'
title = _('Delete agent')
success_url = 'a2-pratic-users'
# service instances
class ServiceInstancesView(CollectivityChildMixin, SingleTableView):
template_name = 'authentic2_pratic/service_instances.html'
model = models.ServiceInstance
table_class = tables.ServiceInstanceTable
class ServiceInstanceAddView(CollectivityChildMixin, TitleMixin, ActionMixin,
AjaxFormViewMixin, CreateView):
model = models.ServiceInstance
title = _('Add service instance')
template_name = 'authentic2_pratic/form.html'
action = _('Add')
form_class = forms.ServiceInstanceForm
success_url = '..'
class ServiceInstanceView(CollectivityChildMixin, TitleMixin,
OtherActionsMixin, AjaxFormViewMixin, UpdateView):
model = models.ServiceInstance
title = _('Edit service instance')
template_name = 'authentic2_pratic/form.html'
form_class = forms.ServiceInstanceForm
class ServiceInstanceDeleteView(CollectivityChildMixin, TitleMixin,
AjaxFormViewMixin, DeleteView):
model = models.ServiceInstance
template_name = 'authentic2_pratic/delete.html'
title = _('Delete service instance')
success_url = '../..'
# accesses
class AccessMixin(object):
def get_queryset(self):
qs = self.model.objects.all()
return qs.filter(user__collectivity=self.collectivity,
service_instance__collectivity=self.collectivity)
def get_form_kwargs(self):
kwargs = super(CollectivityMixin, self).get_form_kwargs()
kwargs['collectivity'] = self.collectivity
return kwargs
class AccessesView(AccessMixin, CollectivityMixin, SingleTableView):
template_name = 'authentic2_pratic/accesses.html'
model = models.Access
table_class = tables.AccessTable
class AccessAddView(AccessMixin, CollectivityMixin, TitleMixin, ActionMixin,
AjaxFormViewMixin, CreateView):
model = models.Access
title = _('Add service instance')
template_name = 'authentic2_pratic/form.html'
action = _('Add')
form_class = forms.AccessForm
success_url = '..'
class AccessView(AccessMixin, CollectivityMixin, TitleMixin,
OtherActionsMixin, AjaxFormViewMixin, UpdateView):
model = models.Access
title = _('Edit service instance')
template_name = 'authentic2_pratic/form.html'
form_class = forms.AccessForm
class AccessDeleteView(AccessMixin, CollectivityMixin, TitleMixin,
AjaxFormViewMixin, DeleteView):
model = models.Access
template_name = 'authentic2_pratic/delete.html'
title = _('Delete service instance')
success_url = 'a2-pratic-users'
success_url = '../..'
# general views
homepage = HomepageView.as_view()
# services
services = ServicesView.as_view()
service_edit = ServiceView.as_view()
service_add = ServiceAddView.as_view()
service_delete = ServiceDeleteView.as_view()
# collectivities
collectivities = CollectivitiesView.as_view()
collectivity_edit = CollectivityView.as_view()
collectivity_add = CollectivityAddView.as_view()
collectivity_delete = CollectivityDeleteView.as_view()
# collectivity users
collectivity_users = UsersView.as_view()
user_add = UserAddView.as_view()
user_edit = UserView.as_view()
user_delete = UserDeleteView.as_view()
# service instances
collectivity_service_instances = ServiceInstancesView.as_view()
service_instance_add = ServiceInstanceAddView.as_view()
service_instance_edit = ServiceInstanceView.as_view()
service_instance_delete = ServiceInstanceDeleteView.as_view()
# accesses
collectivity_accesses = AccessesView.as_view()
access_add = AccessAddView.as_view()
access_edit = AccessView.as_view()
access_delete = AccessDeleteView.as_view()