authentic/src/authentic2/manager/ou_views.py

153 lines
5.3 KiB
Python

# authentic2 - versatile identity manager
# Copyright (C) 2010-2019 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
from django_rbac.utils import get_ou_model
from django.http import HttpResponseRedirect
from django.contrib import messages
from django.core.exceptions import PermissionDenied, ValidationError
from django.db import transaction
from django.urls import reverse
from django.utils import six
from django.utils.translation import ugettext as _
from django.views.generic import FormView
from authentic2 import data_transfer
from . import tables, views, forms
class OrganizationalUnitView(views.BaseTableView):
template_name = 'authentic2/manager/ous.html'
model = get_ou_model()
table_class = tables.OUTable
search_form_class = forms.NameSearchForm
permissions = ['a2_rbac.search_organizationalunit']
title = _('Organizational units')
listing = OrganizationalUnitView.as_view()
class OrganizationalUnitAddView(views.BaseAddView):
model = get_ou_model()
permissions = ['a2_rbac.add_organizationalunit']
form_class = forms.OUEditForm
title = _('Add organizational unit')
exclude_fields = ('slug',)
def get_fields(self):
return [x for x in self.form_class.base_fields.keys()
if x not in self.exclude_fields]
def get_success_url(self):
return '..'
add = OrganizationalUnitAddView.as_view()
class OrganizationalUnitDetailView(views.BaseDetailView):
model = get_ou_model()
permissions = ['a2_rbac.view_organizationalunit']
form_class = forms.OUEditForm
template_name = 'authentic2/manager/ou_detail.html'
@property
def title(self):
return six.text_type(self.object)
def authorize(self, request, *args, **kwargs):
super(OrganizationalUnitDetailView, self).authorize(request, *args, **kwargs)
self.can_delete = self.can_delete and not self.object.default
detail = OrganizationalUnitDetailView.as_view()
class OrganizationalUnitEditView(views.BaseEditView):
model = get_ou_model()
permissions = ['a2_rbac.change_organizationalunit']
form_class = forms.OUEditForm
template_name = 'authentic2/manager/ou_edit.html'
title = _('Edit organizational unit')
edit = OrganizationalUnitEditView.as_view()
class OrganizationalUnitDeleteView(views.BaseDeleteView):
model = get_ou_model()
template_name = 'authentic2/manager/ou_delete.html'
permissions = ['a2_rbac.delete_organizationalunit']
title = _('Delete organizational unit')
def dispatch(self, request, *args, **kwargs):
if self.get_object().default:
messages.warning(request, _('You cannot delete the default '
'organizational unit, you must first '
'set another default organiational '
'unit.'))
return self.return_ajax_response(
request, HttpResponseRedirect(self.get_success_url()))
return super(OrganizationalUnitDeleteView, self).dispatch(request, *args,
**kwargs)
delete = OrganizationalUnitDeleteView.as_view()
class OusExportView(views.ExportMixin, OrganizationalUnitView):
export_prefix = 'ous-export-'
def get(self, request, *args, **kwargs):
export = data_transfer.export_site(
data_transfer.ExportContext(
ou_qs=self.get_table_data(),
export_roles=False,
export_ous=True))
return self.export_response(json.dumps(export, indent=4), 'application/json', 'json')
export = OusExportView.as_view()
class OusImportView(views.PermissionMixin, views.TitleMixin, views.MediaMixin, views.FormNeedsRequest,
FormView):
form_class = forms.OusImportForm
model = get_ou_model()
template_name = 'authentic2/manager/import_form.html'
title = _('Organizational Units Import')
def post(self, request, *args, **kwargs):
if not self.can_add:
raise PermissionDenied
return super().post(request, *args, **kwargs)
def form_valid(self, form):
try:
context = data_transfer.ImportContext(import_roles=False)
with transaction.atomic():
data_transfer.import_site(form.cleaned_data['site_json'], context)
except ValidationError as e:
form.add_error('site_json', e)
return self.form_invalid(form)
return super().form_valid(form)
def get_success_url(self):
messages.success(self.request, _('Organizational Units have been successfully imported.'))
return reverse('a2-manager-ous')
ous_import = OusImportView.as_view()