diff --git a/mayan/apps/acls/forms.py b/mayan/apps/acls/forms.py index 0f65fefbc7..1ee911f60e 100644 --- a/mayan/apps/acls/forms.py +++ b/mayan/apps/acls/forms.py @@ -17,7 +17,7 @@ creator_singleton = SimpleLazyObject(lambda: CreatorSingleton.objects.get()) def _as_choice_list(holders): - return sorted([(AccessHolder.encapsulate(holder).gid, get_object_name(holder, display_object_type=False)) for holder in holders], key=lambda x: x[1]) + return sorted([(AccessHolder.encapsulate(holder).gid, get_object_name(holder)) for holder in holders], key=lambda x: x[1]) class BaseHolderSelectionForm(forms.Form): diff --git a/mayan/apps/checkouts/views.py b/mayan/apps/checkouts/views.py index 4c51eee754..82df946715 100644 --- a/mayan/apps/checkouts/views.py +++ b/mayan/apps/checkouts/views.py @@ -33,7 +33,7 @@ class CheckoutListView(DocumentListView): 'title': _('Documents checked out'), 'hide_links': True, 'extra_columns': [ - {'name': _('Checkout user'), 'attribute': encapsulate(lambda document: get_object_name(document.checkout_info().user_object, display_object_type=False))}, + {'name': _('Checkout user'), 'attribute': encapsulate(lambda document: get_object_name(document.checkout_info().user_object))}, {'name': _('Checkout time and date'), 'attribute': encapsulate(lambda document: document.checkout_info().checkout_datetime)}, {'name': _('Checkout expiration'), 'attribute': encapsulate(lambda document: document.checkout_info().expiration_datetime)}, ], @@ -51,7 +51,7 @@ def checkout_info(request, document_pk): if document.is_checked_out(): checkout_info = document.checkout_info() - paragraphs.append(_('User: %s') % get_object_name(checkout_info.user_object, display_object_type=False)) + paragraphs.append(_('User: %s') % get_object_name(checkout_info.user_object)) paragraphs.append(_('Check out time: %s') % checkout_info.checkout_datetime) paragraphs.append(_('Check out expiration: %s') % checkout_info.expiration_datetime) paragraphs.append(_('New versions allowed: %s') % (_('Yes') if not checkout_info.block_new_version else _('No'))) diff --git a/mayan/apps/common/utils.py b/mayan/apps/common/utils.py index 5c89f2285f..ce112856ec 100644 --- a/mayan/apps/common/utils.py +++ b/mayan/apps/common/utils.py @@ -131,7 +131,7 @@ def parse_range(astr): return sorted(result) -def generate_choices_w_labels(choices, display_object_type=True): +def generate_choices_w_labels(choices): results = [] for choice in choices: ct = ContentType.objects.get_for_model(choice) @@ -139,32 +139,20 @@ def generate_choices_w_labels(choices, display_object_type=True): if isinstance(choice, User): label = choice.get_full_name() if choice.get_full_name() else choice - if display_object_type: - verbose_name = unicode(getattr(choice._meta, 'verbose_name', ct.name)) - results.append(('%s,%s' % (ct.model, choice.pk), '%s: %s' % (verbose_name, label))) - else: - results.append(('%s,%s' % (ct.model, choice.pk), '%s' % (label))) + results.append(('%s,%s' % (ct.model, choice.pk), '%s' % (label))) # Sort results by the label not the key value return sorted(results, key=lambda x: x[1]) -def get_object_name(obj, display_object_type=True): +def get_object_name(obj): ct_label = ContentType.objects.get_for_model(obj).name if isinstance(obj, User): label = obj.get_full_name() if obj.get_full_name() else obj else: label = unicode(obj) - if display_object_type: - try: - verbose_name = unicode(obj._meta.verbose_name) - except AttributeError: - verbose_name = ct_label - - return '%s: %s' % (verbose_name, label) - else: - return '%s' % (label) + return '%s' % (label) def validate_path(path): @@ -252,9 +240,3 @@ def fs_cleanup(filename, suppress_exceptions=True): pass else: raise - - -def get_obj_from_content_type_string(string): - model, pk = string.split(',') - ct = ContentType.objects.get(model=model) - return ct.get_object_for_this_type(pk=pk) diff --git a/mayan/apps/common/views.py b/mayan/apps/common/views.py index 180b650e40..e8c507778c 100644 --- a/mayan/apps/common/views.py +++ b/mayan/apps/common/views.py @@ -32,7 +32,132 @@ from .mixins import ( ExtraContextMixin, ObjectListPermissionFilterMixin, ObjectPermissionCheckMixin, RedirectionMixin, ViewPermissionCheckMixin ) -from .utils import get_obj_from_content_type_string + + +class AssignRemoveView(TemplateView): + left_list_title = None + right_list_title = None + decode_content_type = False + extra_context = None + grouped = False + + LEFT_LIST_NAME = 'left_list' + RIGHT_LIST_NAME = 'right_list' + + template_name = 'appearance/generic_form.html' + + @staticmethod + def get_obj_from_content_type_string(string): + model, pk = string.split(',') + ct = ContentType.objects.get(model=model) + return ct.get_object_for_this_type(pk=pk) + + def left_list(self): + # Subclass must override + return [] + + def right_list(self): + # Subclass must override + return [] + + def add(self, item): + # Subclass must override + pass + + def remove(self, item): + # Subclass must override + pass + + def get(self, request, *args, **kwargs): + self.unselected_list = ChoiceForm(prefix=self.LEFT_LIST_NAME, choices=self.left_list()) + self.selected_list = ChoiceForm(prefix=self.RIGHT_LIST_NAME, choices=self.right_list()) + return self.render_to_response(self.get_context_data()) + + def post(self, request, *args, **kwargs): + if '%s-submit' % self.LEFT_LIST_NAME in self.request.POST.keys(): + self.unselected_list = ChoiceForm( + self.request.POST, prefix=self.LEFT_LIST_NAME, + choices=self.left_list() + ) + if self.unselected_list.is_valid(): + for selection in self.unselected_list.cleaned_data['selection']: + if self.grouped: + flat_list = [] + for group in self.left_list(): + flat_list.extend(group[1]) + else: + flat_list = self.left_list() + + label = dict(flat_list)[selection] + if self.decode_content_type: + selection_obj = AssignRemoveView.get_obj_from_content_type_string(selection) + else: + selection_obj = selection + try: + self.add(selection_obj) + except: + if settings.DEBUG: + raise + else: + messages.error(self.request, _('Unable to remove %(selection)s.') % { + 'selection': label, 'right_list_title': self.right_list_title}) + + if '%s-submit' % self.RIGHT_LIST_NAME in self.request.POST.keys(): + self.selected_list = ChoiceForm( + self.request.POST, prefix=self.RIGHT_LIST_NAME, + choices=self.right_list() + ) + if self.selected_list.is_valid(): + for selection in self.selected_list.cleaned_data['selection']: + if self.grouped: + flat_list = [] + for group in self.right_list(): + flat_list.extend(group[1]) + else: + flat_list = self.right_list() + + label = dict(flat_list)[selection] + if self.decode_content_type: + selection = AssignRemoveView.get_obj_from_content_type_string(selection) + try: + self.remove(selection) + except: + if settings.DEBUG: + raise + else: + messages.error(self.request, _('Unable to add %(selection)s.') % { + 'selection': label, 'right_list_title': self.right_list_title}) + + return self.get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + data = super(AssignRemoveView, self).get_context_data(**kwargs) + data.update({ + 'subtemplates_list': [ + { + 'name': 'appearance/generic_form_subtemplate.html', + 'column_class': 'col-xs-12 col-sm-6 col-md-6 col-lg-6', + 'context': { + 'form': self.unselected_list, + 'title': self.left_list_title or ' ', + 'submit_label': _('Add'), + 'submit_icon': 'fa fa-plus' + } + }, + { + 'name': 'appearance/generic_form_subtemplate.html', + 'column_class': 'col-xs-12 col-sm-6 col-md-6 col-lg-6', + 'context': { + 'form': self.selected_list, + 'title': self.right_list_title or ' ', + 'submit_label': _('Remove'), + 'submit_icon': 'fa fa-minus' + } + }, + + ], + }) + return data class AboutView(TemplateView): @@ -331,126 +456,6 @@ def multi_object_action_view(request): ) -class AssignRemoveView(TemplateView): - left_list_title = None - right_list_title = None - decode_content_type = False - extra_context = None - grouped = False - - LEFT_LIST_NAME = 'left_list' - RIGHT_LIST_NAME = 'right_list' - - template_name = 'appearance/generic_form.html' - - def left_list(self): - # Subclass must override - return [] - - def right_list(self): - # Subclass must override - return [] - - def add(self, item): - # Subclass must override - pass - - def remove(self, item): - # Subclass must override - pass - - def get(self, request, *args, **kwargs): - self.unselected_list = ChoiceForm(prefix=self.LEFT_LIST_NAME, choices=self.left_list()) - self.selected_list = ChoiceForm(prefix=self.RIGHT_LIST_NAME, choices=self.right_list()) - return self.render_to_response(self.get_context_data()) - - def post(self, request, *args, **kwargs): - if '%s-submit' % self.LEFT_LIST_NAME in self.request.POST.keys(): - self.unselected_list = ChoiceForm( - self.request.POST, prefix=self.LEFT_LIST_NAME, - choices=self.left_list() - ) - if self.unselected_list.is_valid(): - for selection in self.unselected_list.cleaned_data['selection']: - if self.grouped: - flat_list = [] - for group in self.left_list(): - flat_list.extend(group[1]) - else: - flat_list = self.left_list() - - label = dict(flat_list)[selection] - if self.decode_content_type: - selection_obj = get_obj_from_content_type_string(selection) - else: - selection_obj = selection - try: - self.add(selection_obj) - except: - if settings.DEBUG: - raise - else: - messages.error(self.request, _('Unable to remove %(selection)s.') % { - 'selection': label, 'right_list_title': self.right_list_title}) - - if '%s-submit' % self.RIGHT_LIST_NAME in self.request.POST.keys(): - self.selected_list = ChoiceForm( - self.request.POST, prefix=self.RIGHT_LIST_NAME, - choices=self.right_list() - ) - if self.selected_list.is_valid(): - for selection in self.selected_list.cleaned_data['selection']: - if self.grouped: - flat_list = [] - for group in self.right_list(): - flat_list.extend(group[1]) - else: - flat_list = self.right_list() - - label = dict(flat_list)[selection] - if self.decode_content_type: - selection = get_obj_from_content_type_string(selection) - try: - self.remove(selection) - except: - if settings.DEBUG: - raise - else: - messages.error(self.request, _('Unable to add %(selection)s.') % { - 'selection': label, 'right_list_title': self.right_list_title}) - - return self.get(request, *args, **kwargs) - - def get_context_data(self, **kwargs): - data = super(AssignRemoveView, self).get_context_data(**kwargs) - data.update({ - 'subtemplates_list': [ - { - 'name': 'appearance/generic_form_subtemplate.html', - 'column_class': 'col-xs-12 col-sm-6 col-md-6 col-lg-6', - 'context': { - 'form': self.unselected_list, - 'title': self.left_list_title or ' ', - 'submit_label': _('Add'), - 'submit_icon': 'fa fa-plus' - } - }, - { - 'name': 'appearance/generic_form_subtemplate.html', - 'column_class': 'col-xs-12 col-sm-6 col-md-6 col-lg-6', - 'context': { - 'form': self.selected_list, - 'title': self.right_list_title or ' ', - 'submit_label': _('Remove'), - 'submit_icon': 'fa fa-minus' - } - }, - - ], - }) - return data - - def current_user_edit(request): """ Allow an user to edit his own details diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index 53d0a7d943..c8b5a7c257 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -184,10 +184,10 @@ class SetupIndexDocumentTypesView(AssignRemoveView): return super(SetupIndexDocumentTypesView, self).dispatch(request, *args, **kwargs) def left_list(self): - return generate_choices_w_labels(self.index.get_document_types_not_in_index(), display_object_type=False) + return generate_choices_w_labels(self.index.get_document_types_not_in_index()) def right_list(self): - return generate_choices_w_labels(self.index.document_types.all(), display_object_type=False) + return generate_choices_w_labels(self.index.document_types.all()) def remove(self, item): self.index.document_types.remove(item) diff --git a/mayan/apps/linking/views.py b/mayan/apps/linking/views.py index da003a60ea..eb75860187 100644 --- a/mayan/apps/linking/views.py +++ b/mayan/apps/linking/views.py @@ -48,10 +48,10 @@ class SetupSmartLinkDocumentTypesView(AssignRemoveView): return super(SetupSmartLinkDocumentTypesView, self).dispatch(request, *args, **kwargs) def left_list(self): - return generate_choices_w_labels(DocumentType.objects.exclude(pk__in=self.smart_link.document_types.all()), display_object_type=False) + return generate_choices_w_labels(DocumentType.objects.exclude(pk__in=self.smart_link.document_types.all())) def right_list(self): - return generate_choices_w_labels(self.smart_link.document_types.all(), display_object_type=False) + return generate_choices_w_labels(self.smart_link.document_types.all()) def remove(self, item): self.smart_link.document_types.remove(item) diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index 64be1eb532..05dcc906a6 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -453,10 +453,10 @@ class SetupDocumentTypeMetadataOptionalView(AssignRemoveView): return super(SetupDocumentTypeMetadataOptionalView, self).dispatch(request, *args, **kwargs) def left_list(self): - return generate_choices_w_labels(set(MetadataType.objects.all()) - set(MetadataType.objects.filter(id__in=self.document_type.metadata.values_list('metadata_type', flat=True))), display_object_type=False) + return generate_choices_w_labels(set(MetadataType.objects.all()) - set(MetadataType.objects.filter(id__in=self.document_type.metadata.values_list('metadata_type', flat=True)))) def right_list(self): - return generate_choices_w_labels(self.document_type.metadata.filter(required=False), display_object_type=False) + return generate_choices_w_labels(self.document_type.metadata.filter(required=False)) def remove(self, item): item.delete() @@ -477,7 +477,7 @@ class SetupDocumentTypeMetadataRequiredView(SetupDocumentTypeMetadataOptionalVie self.document_type.metadata.create(metadata_type=item, required=True) def right_list(self): - return generate_choices_w_labels(self.document_type.metadata.filter(required=True), display_object_type=False) + return generate_choices_w_labels(self.document_type.metadata.filter(required=True)) def get_context_data(self, **kwargs): data = super(SetupDocumentTypeMetadataRequiredView, self).get_context_data(**kwargs) diff --git a/mayan/apps/permissions/utils.py b/mayan/apps/permissions/utils.py index 914aa6012c..a4c67960cc 100644 --- a/mayan/apps/permissions/utils.py +++ b/mayan/apps/permissions/utils.py @@ -11,7 +11,7 @@ from .classes import Member def _as_choice_list(items): - return sorted([(Member.encapsulate(item).gid, get_object_name(item, display_object_type=False)) for item in items], key=lambda x: x[1]) + return sorted([(Member.encapsulate(item).gid, get_object_name(item)) for item in items], key=lambda x: x[1]) def get_role_members(role, separate=False): diff --git a/mayan/apps/user_management/views.py b/mayan/apps/user_management/views.py index e52f28128f..534b3ecc4b 100644 --- a/mayan/apps/user_management/views.py +++ b/mayan/apps/user_management/views.py @@ -234,10 +234,10 @@ class UserGroupsView(AssignRemoveView): return super(UserGroupsView, self).dispatch(request, *args, **kwargs) def left_list(self): - return generate_choices_w_labels(get_user_non_groups(self.user), display_object_type=False) + return generate_choices_w_labels(get_user_non_groups(self.user)) def right_list(self): - return generate_choices_w_labels(get_user_groups(self.user), display_object_type=False) + return generate_choices_w_labels(get_user_groups(self.user)) def remove(self, item): item.user_set.remove(self.user) @@ -373,10 +373,10 @@ class GroupMembersView(AssignRemoveView): return super(GroupMembersView, self).dispatch(request, *args, **kwargs) def left_list(self): - return generate_choices_w_labels(User.objects.exclude(groups=self.group).exclude(is_staff=True).exclude(is_superuser=True), display_object_type=False) + return generate_choices_w_labels(User.objects.exclude(groups=self.group).exclude(is_staff=True).exclude(is_superuser=True)) def right_list(self): - return generate_choices_w_labels(self.group.user_set.all(), display_object_type=False) + return generate_choices_w_labels(self.group.user_set.all()) def remove(self, item): self.group.user_set.remove(item)