diff --git a/mayan/apps/document_indexing/models.py b/mayan/apps/document_indexing/models.py index 3e11337b00..5c962cf4dc 100644 --- a/mayan/apps/document_indexing/models.py +++ b/mayan/apps/document_indexing/models.py @@ -37,9 +37,6 @@ class Index(models.Model): def get_absolute_url(self): return reverse('indexing:index_instance_node_view', args=[self.instance_root.pk]) - def get_document_types_not_in_index(self): - return DocumentType.objects.exclude(pk__in=self.document_types.all()) - def save(self, *args, **kwargs): """Automatically create the root index template node""" super(Index, self).save(*args, **kwargs) diff --git a/mayan/apps/document_indexing/urls.py b/mayan/apps/document_indexing/urls.py index bf4e4a4839..88cf93daea 100644 --- a/mayan/apps/document_indexing/urls.py +++ b/mayan/apps/document_indexing/urls.py @@ -17,7 +17,7 @@ urlpatterns = patterns( url(r'^setup/index/(?P\d+)/edit/$', 'index_setup_edit', name='index_setup_edit'), url(r'^setup/index/(?P\d+)/delete/$', 'index_setup_delete', name='index_setup_delete'), url(r'^setup/index/(?P\d+)/view/$', 'index_setup_view', name='index_setup_view'), - url(r'^setup/index/(?P\d+)/document_types/$', SetupIndexDocumentTypesView.as_view(), name='index_setup_document_types'), + url(r'^setup/index/(?P\d+)/document_types/$', SetupIndexDocumentTypesView.as_view(), name='index_setup_document_types'), url(r'^setup/template/node/(?P\d+)/create/child/$', 'template_node_create', name='template_node_create'), url(r'^setup/template/node/(?P\d+)/edit/$', 'template_node_edit', name='template_node_edit'), diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index 932201b08e..cfe795890d 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -14,7 +14,7 @@ from acls.models import AccessEntry from common.utils import encapsulate from common.views import AssignRemoveView from common.widgets import two_state_template -from documents.models import Document +from documents.models import Document, DocumentType from documents.permissions import permission_document_view from documents.views import document_list from permissions import Permission @@ -165,37 +165,30 @@ def index_setup_view(request, index_pk): class SetupIndexDocumentTypesView(AssignRemoveView): decode_content_type = True + object_permission = permission_document_indexing_edit + left_list_title = _('Available document types') + right_list_title = _('Document types linked') def add(self, item): - self.index.document_types.add(item) + self.get_object().document_types.add(item) - def dispatch(self, request, *args, **kwargs): - self.index = get_object_or_404(Index, pk=self.kwargs['index_pk']) - - try: - Permission.check_permissions(request.user, [permission_document_indexing_edit]) - except PermissionDenied: - AccessEntry.objects.check_access(permission_document_indexing_edit, request.user, self.index) - - self.left_list_title = _('Document types not in index: %s') % self.index - self.right_list_title = _('Document types for index: %s') % self.index - - return super(SetupIndexDocumentTypesView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(Index, pk=self.kwargs['pk']) def left_list(self): - return AssignRemoveView.generate_choices(self.index.get_document_types_not_in_index()) + return AssignRemoveView.generate_choices(DocumentType.objects.exclude(pk__in=self.get_object().document_types.all())) def right_list(self): - return AssignRemoveView.generate_choices(self.index.document_types.all()) + return AssignRemoveView.generate_choices(self.get_object().document_types.all()) def remove(self, item): - self.index.document_types.remove(item) + self.get_object().document_types.remove(item) def get_context_data(self, **kwargs): data = super(SetupIndexDocumentTypesView, self).get_context_data(**kwargs) data.update({ - 'index': self.index, - 'navigation_object_list': ['index'], + 'object': self.get_object(), + 'title': _('Document types linked to index: %s') % self.get_object() }) return data diff --git a/mayan/apps/document_states/views.py b/mayan/apps/document_states/views.py index 219c13f583..4346995f63 100644 --- a/mayan/apps/document_states/views.py +++ b/mayan/apps/document_states/views.py @@ -165,38 +165,34 @@ class SetupWorkflowDeleteView(SingleObjectDeleteView): class SetupWorkflowDocumentTypesView(AssignRemoveView): decode_content_type = True + object_permission = permission_workflow_edit + left_list_title = _('Available document types') + right_list_title = _('Document types assigned this workflow') def add(self, item): - self.workflow.document_types.add(item) + self.get_object().document_types.add(item) # TODO: add task launching this workflow for all the document types of # item - def dispatch(self, request, *args, **kwargs): - self.workflow = get_object_or_404(Workflow, pk=self.kwargs['pk']) - - try: - Permission.check_permissions(self.request.user, [permission_workflow_edit]) - except PermissionDenied: - AccessEntry.objects.check_access(permission_workflow_edit, self.request.user, self.workflow) - - return super(SetupWorkflowDocumentTypesView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(Workflow, pk=self.kwargs['pk']) def left_list(self): - return AssignRemoveView.generate_choices(self.workflow.get_document_types_not_in_workflow()) + return AssignRemoveView.generate_choices(self.get_object().get_document_types_not_in_workflow()) def right_list(self): - return AssignRemoveView.generate_choices(self.workflow.document_types.all()) + return AssignRemoveView.generate_choices(self.get_object().document_types.all()) def remove(self, item): - self.workflow.document_types.remove(item) + self.get_object().document_types.remove(item) # TODO: add task deleting this workflow for all the document types of # item def get_context_data(self, **kwargs): data = super(SetupWorkflowDocumentTypesView, self).get_context_data(**kwargs) data.update({ - 'main_title': _('Document types assigned the workflow: %s') % self.workflow, - 'object': self.workflow, + 'title': _('Document types assigned the workflow: %s') % self.get_object(), + 'object': self.get_object(), }) return data diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index 2efd3228c9..9ee9dbdf9f 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -30,8 +30,8 @@ urlpatterns = patterns( url(r'^setup/type/(?P\d+)/edit/$', 'setup_metadata_type_edit', name='setup_metadata_type_edit'), url(r'^setup/type/(?P\d+)/delete/$', 'setup_metadata_type_delete', name='setup_metadata_type_delete'), - url(r'^setup/document/type/(?P\d+)/metadata/edit/$', SetupDocumentTypeMetadataOptionalView.as_view(), name='setup_document_type_metadata'), - url(r'^setup/document/type/(?P\d+)/metadata/edit/required/$', SetupDocumentTypeMetadataRequiredView.as_view(), name='setup_document_type_metadata_required'), + url(r'^setup/document/type/(?P\d+)/metadata/edit/$', SetupDocumentTypeMetadataOptionalView.as_view(), name='setup_document_type_metadata'), + url(r'^setup/document/type/(?P\d+)/metadata/edit/required/$', SetupDocumentTypeMetadataRequiredView.as_view(), name='setup_document_type_metadata_required'), url(r'^tools/missing_required_metadata/$', MissingRequiredMetadataDocumentListView.as_view(), name='documents_missing_required_metadata'), ) diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index 6e72a58949..ee36a5cf4e 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -442,20 +442,21 @@ def setup_metadata_type_delete(request, metadatatype_id): class SetupDocumentTypeMetadataOptionalView(AssignRemoveView): decode_content_type = True + view_permission = permission_document_type_edit + left_list_title = _('Available metadata types') + right_list_title = _('Metadata types assigned') def add(self, item): - self.document_type.metadata.create(metadata_type=item, required=False) + self.get_object().metadata.create(metadata_type=item, required=False) - def dispatch(self, request, *args, **kwargs): - Permission.check_permissions(request.user, [permission_document_type_edit]) - self.document_type = get_object_or_404(DocumentType, pk=self.kwargs['document_type_id']) - return super(SetupDocumentTypeMetadataOptionalView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(DocumentType, pk=self.kwargs['pk']) def left_list(self): - return AssignRemoveView.generate_choices(set(MetadataType.objects.all()) - set(MetadataType.objects.filter(id__in=self.document_type.metadata.values_list('metadata_type', flat=True)))) + return AssignRemoveView.generate_choices(set(MetadataType.objects.all()) - set(MetadataType.objects.filter(id__in=self.get_object().metadata.values_list('metadata_type', flat=True)))) def right_list(self): - return AssignRemoveView.generate_choices(self.document_type.metadata.filter(required=False)) + return AssignRemoveView.generate_choices(self.get_object().metadata.filter(required=False)) def remove(self, item): item.delete() @@ -463,9 +464,8 @@ class SetupDocumentTypeMetadataOptionalView(AssignRemoveView): def get_context_data(self, **kwargs): data = super(SetupDocumentTypeMetadataOptionalView, self).get_context_data(**kwargs) data.update({ - 'document_type': self.document_type, - 'main_title': _('Optional metadata types for document type: %s') % self.document_type, - 'navigation_object_list': ['document_type'], + 'object': self.get_object(), + 'title': _('Optional metadata types for document type: %s') % self.get_object(), }) return data @@ -473,17 +473,16 @@ class SetupDocumentTypeMetadataOptionalView(AssignRemoveView): class SetupDocumentTypeMetadataRequiredView(SetupDocumentTypeMetadataOptionalView): def add(self, item): - self.document_type.metadata.create(metadata_type=item, required=True) + self.get_object().metadata.create(metadata_type=item, required=True) def right_list(self): - return AssignRemoveView.generate_choices(self.document_type.metadata.filter(required=True)) + return AssignRemoveView.generate_choices(self.get_object().metadata.filter(required=True)) def get_context_data(self, **kwargs): data = super(SetupDocumentTypeMetadataRequiredView, self).get_context_data(**kwargs) data.update({ - 'document_type': self.document_type, - 'main_title': _('Required metadata types for document type: %s') % self.document_type, - 'navigation_object_list': ['document_type'], + 'object': self.get_object(), + 'title': _('Required metadata types for document type: %s') % self.get_object(), }) return data diff --git a/mayan/apps/permissions/urls.py b/mayan/apps/permissions/urls.py index b965c51d4b..79287170b9 100644 --- a/mayan/apps/permissions/urls.py +++ b/mayan/apps/permissions/urls.py @@ -15,7 +15,7 @@ urlpatterns = patterns( url(r'^role/(?P\d+)/permissions/$', SetupRolePermissionsView.as_view(), name='role_permissions'), url(r'^role/(?P\d+)/edit/$', RoleEditView.as_view(), name='role_edit'), url(r'^role/(?P\d+)/delete/$', RoleDeleteView.as_view(), name='role_delete'), - url(r'^role/(?P\d+)/members/$', SetupRoleMembersView.as_view(), name='role_members'), + url(r'^role/(?P\d+)/members/$', SetupRoleMembersView.as_view(), name='role_members'), ) api_urls = patterns( diff --git a/mayan/apps/permissions/views.py b/mayan/apps/permissions/views.py index 85bd9f4973..0ab14216af 100644 --- a/mayan/apps/permissions/views.py +++ b/mayan/apps/permissions/views.py @@ -42,34 +42,32 @@ class RoleEditView(SingleObjectEditView): class SetupRoleMembersView(AssignRemoveView): grouped = False + left_list_title = _('Available groups') + right_list_title = _('Member groups') + view_permission = permission_role_edit def add(self, item): group = get_object_or_404(Group, pk=item) - self.role.groups.add(group) + self.get_object().groups.add(group) - def dispatch(self, request, *args, **kwargs): - Permission.check_permissions(request.user, [permission_role_edit]) - self.role = get_object_or_404(Role, pk=self.kwargs['role_id']) - self.left_list_title = _('Available groups') - self.right_list_title = _('Member groups') - - return super(SetupRoleMembersView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(Role, pk=self.kwargs['pk']) def left_list(self): - return [(unicode(group.pk), group.name) for group in set(Group.objects.all()) - set(self.role.groups.all())] + return [(unicode(group.pk), group.name) for group in set(Group.objects.all()) - set(self.get_object().groups.all())] def right_list(self): - return [(unicode(group.pk), group.name) for group in self.role.groups.all()] + return [(unicode(group.pk), group.name) for group in self.get_object().groups.all()] def remove(self, item): group = get_object_or_404(Group, pk=item) - self.role.groups.remove(group) + self.get_object().groups.remove(group) def get_context_data(self, **kwargs): data = super(SetupRoleMembersView, self).get_context_data(**kwargs) data.update({ - 'object': self.role, - 'title': _('Group members of role: %s') % self.role + 'object': self.get_object(), + 'title': _('Group members of role: %s') % self.get_object() }) return data @@ -77,22 +75,21 @@ class SetupRoleMembersView(AssignRemoveView): class SetupRolePermissionsView(AssignRemoveView): grouped = True + left_list_title = _('Available permissions') + right_list_title = _('Granted permissions') + view_permission = permission_role_view def add(self, item): + Permission.check_permissions(self.request.user, permissions=(permission_permission_grant,)) permission = get_object_or_404(StoredPermission, pk=item) - self.role.permissions.add(permission) + self.get_object().permissions.add(permission) - def dispatch(self, request, *args, **kwargs): - Permission.check_permissions(request.user, [permission_permission_grant, permission_permission_revoke]) - self.role = get_object_or_404(Role, pk=self.kwargs['pk']) - self.left_list_title = _('Available permissions') - self.right_list_title = _('Granted permissions') - - return super(SetupRolePermissionsView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(Role, pk=self.kwargs['pk']) def left_list(self): results = [] - for namespace, permissions in itertools.groupby(StoredPermission.objects.exclude(id__in=self.role.permissions.values_list('pk', flat=True)), lambda entry: entry.namespace): + for namespace, permissions in itertools.groupby(StoredPermission.objects.exclude(id__in=self.get_object().permissions.values_list('pk', flat=True)), lambda entry: entry.namespace): permission_options = [(unicode(permission.pk), permission) for permission in permissions] results.append((PermissionNamespace.get(namespace), permission_options)) @@ -100,21 +97,22 @@ class SetupRolePermissionsView(AssignRemoveView): def right_list(self): results = [] - for namespace, permissions in itertools.groupby(self.role.permissions.all(), lambda entry: entry.namespace): + for namespace, permissions in itertools.groupby(self.get_object().permissions.all(), lambda entry: entry.namespace): permission_options = [(unicode(permission.pk), permission) for permission in permissions] results.append((PermissionNamespace.get(namespace), permission_options)) return results def remove(self, item): + Permission.check_permissions(self.request.user, permissions=(permission_permission_revoke,)) permission = get_object_or_404(StoredPermission, pk=item) - self.role.permissions.remove(permission) + self.get_object().permissions.remove(permission) def get_context_data(self, **kwargs): data = super(SetupRolePermissionsView, self).get_context_data(**kwargs) data.update({ - 'object': self.role, - 'title': _('Permissions for role: %s') % self.role, + 'object': self.get_object(), + 'title': _('Permissions for role: %s') % self.get_object(), }) return data diff --git a/mayan/apps/user_management/urls.py b/mayan/apps/user_management/urls.py index 3532808f2b..e427920306 100644 --- a/mayan/apps/user_management/urls.py +++ b/mayan/apps/user_management/urls.py @@ -17,14 +17,14 @@ urlpatterns = patterns( url(r'^user/multiple/delete/$', 'user_multiple_delete', name='user_multiple_delete'), url(r'^user/(?P\d+)/set_password/$', 'user_set_password', name='user_set_password'), url(r'^user/multiple/set_password/$', 'user_multiple_set_password', name='user_multiple_set_password'), - url(r'^user/(?P\d+)/groups/$', UserGroupsView.as_view(), name='user_groups'), + url(r'^user/(?P\d+)/groups/$', UserGroupsView.as_view(), name='user_groups'), url(r'^group/list/$', 'group_list', name='group_list'), url(r'^group/add/$', 'group_add', name='group_add'), url(r'^group/(?P\d+)/edit/$', 'group_edit', name='group_edit'), url(r'^group/(?P\d+)/delete/$', 'group_delete', name='group_delete'), url(r'^group/multiple/delete/$', 'group_multiple_delete', name='group_multiple_delete'), - url(r'^group/(?P\d+)/members/$', GroupMembersView.as_view(), name='group_members'), + url(r'^group/(?P\d+)/members/$', GroupMembersView.as_view(), name='group_members'), ) api_urls = patterns( diff --git a/mayan/apps/user_management/views.py b/mayan/apps/user_management/views.py index 397c541e88..3cbe306cab 100644 --- a/mayan/apps/user_management/views.py +++ b/mayan/apps/user_management/views.py @@ -221,31 +221,30 @@ def get_user_non_groups(user): class UserGroupsView(AssignRemoveView): decode_content_type = True + left_list_title = _('Available groups') + right_list_title = _('Groups joined') + view_permission = permission_user_edit def add(self, item): - item.user_set.add(self.user) + item.user_set.add(self.get_object()) - def dispatch(self, request, *args, **kwargs): - Permission.check_permissions(request.user, [permission_user_edit]) - self.user = get_object_or_404(User, pk=self.kwargs['user_id']) - self.left_list_title = _('Non groups of user: %s') % self.user - self.right_list_title = _('Groups of user: %s') % self.user - - return super(UserGroupsView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(User, pk=self.kwargs['pk']) def left_list(self): - return AssignRemoveView.generate_choices(get_user_non_groups(self.user)) + return AssignRemoveView.generate_choices(get_user_non_groups(self.get_object())) def right_list(self): - return AssignRemoveView.generate_choices(get_user_groups(self.user)) + return AssignRemoveView.generate_choices(get_user_groups(self.get_object())) def remove(self, item): - item.user_set.remove(self.user) + item.user_set.remove(self.get_object()) def get_context_data(self, **kwargs): data = super(UserGroupsView, self).get_context_data(**kwargs) data.update({ - 'object': self.user, + 'object': self.get_object(), + 'title': _('Groups of user: %s') % self.get_object() }) return data @@ -360,31 +359,30 @@ def group_multiple_delete(request): class GroupMembersView(AssignRemoveView): decode_content_type = True + left_list_title = _('Available groups') + right_list_title = _('Members of groups') + view_permission = permission_group_edit def add(self, item): - self.group.user_set.add(item) + self.get_object().user_set.add(item) - def dispatch(self, request, *args, **kwargs): - Permission.check_permissions(request.user, [permission_group_edit]) - self.group = get_object_or_404(Group, pk=self.kwargs['group_id']) - self.left_list_title = _('Non members of group: %s') % self.group - self.right_list_title = _('Members of group: %s') % self.group - - return super(GroupMembersView, self).dispatch(request, *args, **kwargs) + def get_object(self): + return get_object_or_404(Group, pk=self.kwargs['pk']) def left_list(self): - return AssignRemoveView.generate_choices(User.objects.exclude(groups=self.group).exclude(is_staff=True).exclude(is_superuser=True)) + return AssignRemoveView.generate_choices(User.objects.exclude(groups=self.get_object()).exclude(is_staff=True).exclude(is_superuser=True)) def right_list(self): - return AssignRemoveView.generate_choices(self.group.user_set.all()) + return AssignRemoveView.generate_choices(self.get_object().user_set.all()) def remove(self, item): - self.group.user_set.remove(item) + self.get_object().user_set.remove(item) def get_context_data(self, **kwargs): data = super(GroupMembersView, self).get_context_data(**kwargs) data.update({ - 'object': self.group, + 'object': self.get_object(), + 'title': _('Members of group: %s') % self.get_object() }) return data