diff --git a/docs/topics/settings.rst b/docs/topics/settings.rst index 073b676a33..b386cf40ef 100644 --- a/docs/topics/settings.rst +++ b/docs/topics/settings.rst @@ -194,19 +194,6 @@ Default: ``/usr/bin/libreoffice`` Path to the libreoffice binary used to call LibreOffice for office document conversion. - -Linking -======= - -.. setting:: LINKING_SHOW_EMPTY_SMART_LINKS - -**LINKING_SHOW_EMPTY_SMART_LINKS** - -Default: ``True`` - -Show smart links even when they don't return any documents. - - Storage ======= diff --git a/mayan/apps/linking/__init__.py b/mayan/apps/linking/__init__.py index 41d9cc7c29..780c10397a 100644 --- a/mayan/apps/linking/__init__.py +++ b/mayan/apps/linking/__init__.py @@ -6,12 +6,14 @@ from documents.models import Document from navigation.api import register_links from project_setup.api import register_setup -from .links import (smart_link_acl_list, smart_link_create, - smart_link_condition_create, smart_link_condition_delete, - smart_link_condition_edit, smart_link_condition_list, - smart_link_delete, smart_link_document_types, - smart_link_edit, smart_link_instances_for_document, - smart_link_list, smart_link_setup) +from .classes import ResolvedSmartLink +from .links import (smart_link_acl_list, + smart_link_create, smart_link_condition_create, + smart_link_condition_delete, smart_link_condition_edit, + smart_link_condition_list, smart_link_delete, + smart_link_document_types, smart_link_edit, + smart_link_instance_view, smart_link_instances_for_document, smart_link_list, + smart_link_setup) from .models import SmartLink, SmartLinkCondition from .permissions import (PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT, @@ -21,6 +23,7 @@ register_links(Document, [smart_link_instances_for_document], menu_name='form_he register_links(SmartLink, [smart_link_edit, smart_link_document_types, smart_link_condition_list, smart_link_acl_list, smart_link_delete]) register_links([SmartLink, 'linking:smart_link_list', 'linking:smart_link_create'], [smart_link_list, smart_link_create], menu_name='secondary_menu') register_links(SmartLinkCondition, [smart_link_condition_edit, smart_link_condition_delete]) +register_links(ResolvedSmartLink, [smart_link_instance_view]) register_links(['linking:smart_link_condition_list', 'linking:smart_link_condition_create', 'linking:smart_link_condition_edit', 'linking:smart_link_condition_delete'], [smart_link_condition_create], menu_name='sidebar') register_setup(smart_link_setup) diff --git a/mayan/apps/linking/classes.py b/mayan/apps/linking/classes.py new file mode 100644 index 0000000000..d2ca5a8e9a --- /dev/null +++ b/mayan/apps/linking/classes.py @@ -0,0 +1,3 @@ +from collections import namedtuple + +ResolvedSmartLink = namedtuple('ResolvedSmartLink', ['smart_link', 'queryset']) diff --git a/mayan/apps/linking/forms.py b/mayan/apps/linking/forms.py index 39129f698c..f8b00e4ce9 100644 --- a/mayan/apps/linking/forms.py +++ b/mayan/apps/linking/forms.py @@ -1,15 +1,10 @@ from __future__ import absolute_import from django import forms -from django.core.urlresolvers import reverse -from django.utils.safestring import mark_safe -from django.utils.translation import ugettext from django.utils.translation import ugettext_lazy as _ from common.classes import ModelAttribute from documents.models import Document -from documents.widgets import document_html_widget -from documents.settings import MULTIPAGE_PREVIEW_SIZE from .models import SmartLink, SmartLinkCondition @@ -22,7 +17,6 @@ class SmartLinkForm(forms.ModelForm): class SmartLinkConditionForm(forms.ModelForm): def __init__(self, *args, **kwargs): - smart_link = kwargs.pop('smart_link', None) super(SmartLinkConditionForm, self).__init__(*args, **kwargs) self.fields['foreign_document_data'] = forms.ChoiceField(choices=ModelAttribute.get_choices_for(Document, type_names=['field', 'query']), label=_('Foreign document attribute')) self.fields['expression'].help_text = ' '.join([self.fields['expression'].help_text, ModelAttribute.help_text_for(Document, type_names=['field', 'related', 'property'])]) @@ -30,66 +24,3 @@ class SmartLinkConditionForm(forms.ModelForm): class Meta: model = SmartLinkCondition exclude = ('smart_link',) - - -class SmartLinkImageWidget(forms.widgets.Widget): - def render(self, name, value, attrs=None): - output = [] - # TODO: convert to navigation app - if value['links']: - output.append(u'') - - # TODO: Move CSS markup outside of forms.py - output.append(u'
') - for document in value['documents']: - output.append(u'
' % (u'border: 5px solid black; padding: 3px;' if value['current_document'] == document else u'')) - output.append(u'
%s
' % document) - output.append(u'
%s: %d
' % (ugettext(u'Pages'), document.pages.count())) - output.append(u'
') - output.append(document_html_widget(document, click_view='documents:document_display', size=MULTIPAGE_PREVIEW_SIZE, fancybox_class='fancybox-noscaling', gallery_name=u'smart_link_%d_documents_gallery' % value['smart_link_instance'].pk)) - output.append(u'
') - output.append(u'
') - output.append(u'%s' % (reverse('documents:document_view_simple', args=[document.pk]), ugettext(u'Select'))) - output.append(u'
') - output.append(u'
') - - output.append(u'
') - output.append( - u'
%s' % - ugettext(u'Click on the image for full size view of the first page.') - ) - - return mark_safe(u''.join(output)) - - -class SmartLinkInstanceForm(forms.Form): - def __init__(self, *args, **kwargs): - smart_link_instances = kwargs.pop('smart_link_instances', None) - links = kwargs.pop('links', None) - current_document = kwargs.pop('current_document', None) - - super(SmartLinkInstanceForm, self).__init__(*args, **kwargs) - - for smart_link_instance, data in smart_link_instances.items(): - self.fields['preview-%s' % smart_link_instance.pk] = forms.CharField( - widget=SmartLinkImageWidget(), - label=u'%s (%d)' % (unicode(data['title']), len(data['documents'])), - required=False, - initial={ - 'smart_link_instance': smart_link_instance, - 'documents': data['documents'], - 'current_document': current_document, - 'links': links - } - ) diff --git a/mayan/apps/linking/links.py b/mayan/apps/linking/links.py index a0b7bacb3f..dce31a288d 100644 --- a/mayan/apps/linking/links.py +++ b/mayan/apps/linking/links.py @@ -7,10 +7,8 @@ from documents.permissions import PERMISSION_DOCUMENT_VIEW from .permissions import (PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, - PERMISSION_SMART_LINK_EDIT) - -smart_link_instance_view_link = {'text': _(u'Smart links actions'), 'view': 'linking:smart_link_instance_view', 'famfam': 'page_link', 'permissions': [PERMISSION_DOCUMENT_VIEW]} -smart_link_instances_for_document = {'text': _(u'Smart links'), 'view': 'linking:smart_link_instances_for_document', 'args': 'object.pk', 'famfam': 'page_link', 'permissions': [PERMISSION_DOCUMENT_VIEW]} + PERMISSION_SMART_LINK_EDIT, + PERMISSION_SMART_LINK_VIEW) smart_link_setup = {'text': _(u'Smart links'), 'view': 'linking:smart_link_list', 'icon': 'link.png', 'permissions': [PERMISSION_SMART_LINK_CREATE]} smart_link_list = {'text': _(u'Smart links'), 'view': 'linking:smart_link_list', 'famfam': 'link', 'permissions': [PERMISSION_SMART_LINK_CREATE]} @@ -19,9 +17,12 @@ smart_link_edit = {'text': _(u'Edit'), 'view': 'linking:smart_link_edit', 'args' smart_link_delete = {'text': _(u'Delete'), 'view': 'linking:smart_link_delete', 'args': 'object.pk', 'famfam': 'link_delete', 'permissions': [PERMISSION_SMART_LINK_DELETE]} smart_link_document_types = {'text': _('Document types'), 'view': 'linking:smart_link_document_types', 'args': 'object.pk', 'famfam': 'layout', 'permissions': [PERMISSION_SMART_LINK_EDIT]} -smart_link_condition_list = {'text': _(u'Conditions'), 'view': 'linking:smart_link_condition_list', 'args': 'object.pk', 'famfam': 'cog', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_CREATE]} -smart_link_condition_create = {'text': _(u'Create condition'), 'view': 'linking:smart_link_condition_create', 'args': 'object.pk', 'famfam': 'cog_add', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]} -smart_link_condition_edit = {'text': _(u'Edit'), 'view': 'linking:smart_link_condition_edit', 'args': 'condition.pk', 'famfam': 'cog_edit', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]} -smart_link_condition_delete = {'text': _(u'Delete'), 'view': 'linking:smart_link_condition_delete', 'args': 'condition.pk', 'famfam': 'cog_delete', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]} +smart_link_instances_for_document = {'text': _(u'Smart links'), 'view': 'linking:smart_link_instances_for_document', 'args': 'object.pk', 'famfam': 'page_link', 'permissions': [PERMISSION_DOCUMENT_VIEW]} +smart_link_instance_view = {'text': _('Documents'), 'view': 'linking:smart_link_instance_view', 'args': ['document.pk', 'object.smart_link.pk'], 'famfam': 'layout', 'page': [PERMISSION_SMART_LINK_VIEW]} + +smart_link_condition_list = {'text': _(u'Conditions'), 'view': 'linking:smart_link_condition_list', 'args': 'object.pk', 'famfam': 'cog', 'permissions': [PERMISSION_SMART_LINK_EDIT]} +smart_link_condition_create = {'text': _(u'Create condition'), 'view': 'linking:smart_link_condition_create', 'args': 'object.pk', 'famfam': 'cog_add', 'permissions': [PERMISSION_SMART_LINK_EDIT]} +smart_link_condition_edit = {'text': _(u'Edit'), 'view': 'linking:smart_link_condition_edit', 'args': 'condition.pk', 'famfam': 'cog_edit', 'permissions': [PERMISSION_SMART_LINK_EDIT]} +smart_link_condition_delete = {'text': _(u'Delete'), 'view': 'linking:smart_link_condition_delete', 'args': 'condition.pk', 'famfam': 'cog_delete', 'permissions': [PERMISSION_SMART_LINK_EDIT]} smart_link_acl_list = {'text': _(u'ACLs'), 'view': 'linking:smart_link_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]} diff --git a/mayan/apps/linking/managers.py b/mayan/apps/linking/managers.py index 57836f7bd0..6337d95b69 100644 --- a/mayan/apps/linking/managers.py +++ b/mayan/apps/linking/managers.py @@ -1,61 +1,10 @@ from __future__ import absolute_import from django.db import models -from django.db.models import Q -from documents.models import Document - -from .literals import INCLUSION_AND, INCLUSION_OR +from .classes import ResolvedSmartLink class SmartLinkManager(models.Manager): - def get_for(self, document, smart_link_obj=None): - errors = [] - result = {} - - smart_link_qs = self.model.objects.filter(enabled=True) - - if smart_link_obj: - smart_link_qs = smart_link_qs.filter(pk=smart_link_obj.pk) - - smart_link_qs = smart_link_qs.filter(document_types=document.document_type) - - for smart_link in smart_link_qs: - total_query = Q() - for condition in smart_link.smartlinkcondition_set.filter(enabled=True): - value_query = Q(**{ - '%s__%s' % (condition.foreign_document_data, condition.operator): eval(condition.expression, {'document': document}) - }) - if condition.negated: - query = ~value_query - else: - query = value_query - if condition.inclusion == INCLUSION_AND: - total_query &= query - elif condition.inclusion == INCLUSION_OR: - total_query |= query - - if total_query: - try: - document_qs = Document.objects.filter(total_query) - result[smart_link] = {'documents': document_qs.order_by('date_added') or []} - except Exception as exception: - result[smart_link] = {'documents': []} - errors.append(exception) - else: - result[smart_link] = {'documents': []} - - if smart_link.dynamic_title: - try: - result[smart_link]['title'] = eval(smart_link.dynamic_title, {'document': document}) - except Exception as exception: - result[smart_link]['title'] = 'Error; %s' % exception - else: - result[smart_link]['title'] = smart_link.title - - if smart_link_obj: - # Return a single group if documents even if there were - # many matches - return result[smart_link_obj], errors - - return result, errors + def get_for(self, document): + return [ResolvedSmartLink(smart_link=smart_link, queryset=smart_link.get_linked_document_for(document)) for smart_link in self.filter(enabled=True).filter(document_types=document.document_type)] diff --git a/mayan/apps/linking/models.py b/mayan/apps/linking/models.py index 3ee1f85d4e..ff4a99464c 100644 --- a/mayan/apps/linking/models.py +++ b/mayan/apps/linking/models.py @@ -1,12 +1,14 @@ from __future__ import absolute_import from django.db import models +from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext -from documents.models import DocumentType +from documents.models import Document, DocumentType -from .literals import INCLUSION_AND, INCLUSION_CHOICES, OPERATOR_CHOICES +from .literals import (INCLUSION_AND, INCLUSION_CHOICES, INCLUSION_OR, + OPERATOR_CHOICES) from .managers import SmartLinkManager @@ -18,19 +20,39 @@ class SmartLink(models.Model): objects = SmartLinkManager() - def get_document_types_not_selected(self): - return DocumentType.objects.exclude(pk__in=self.document_types.all()) - def __unicode__(self): return self.title + def get_linked_document_for(self, document): + if document.document_type.pk not in self.document_types.values_list('pk', flat=True): + raise Exception(_('This smart link is not allowed for the selected document\'s type.')) + + smart_link_query = Q() + + for condition in self.conditions.filter(enabled=True): + condition_query = Q(**{ + '%s__%s' % (condition.foreign_document_data, condition.operator): eval(condition.expression, {'document': document}) + }) + if condition.negated: + condition_query = ~condition_query + + if condition.inclusion == INCLUSION_AND: + smart_link_query &= condition_query + elif condition.inclusion == INCLUSION_OR: + smart_link_query |= condition_query + + if smart_link_query: + return Document.objects.filter(smart_link_query) + else: + return Document.objects.none() + class Meta: verbose_name = _(u'Smart link') verbose_name_plural = _(u'Smart links') class SmartLinkCondition(models.Model): - smart_link = models.ForeignKey(SmartLink, verbose_name=_(u'Smart link')) + smart_link = models.ForeignKey(SmartLink, related_name='conditions', verbose_name=_(u'Smart link')) inclusion = models.CharField(default=INCLUSION_AND, max_length=16, choices=INCLUSION_CHOICES, help_text=_(u'The inclusion is ignored for the first item.')) foreign_document_data = models.CharField(max_length=128, verbose_name=_(u'Foreign document attribute'), help_text=_(u'This represents the metadata of all other documents.')) operator = models.CharField(max_length=16, choices=OPERATOR_CHOICES) diff --git a/mayan/apps/linking/settings.py b/mayan/apps/linking/settings.py deleted file mode 100644 index b858a076b7..0000000000 --- a/mayan/apps/linking/settings.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Configuration options for the linking app""" - -from django.utils.translation import ugettext_lazy as _ - -from smart_settings.api import register_settings - -register_settings( - namespace=u'linking', - module=u'linking.settings', - settings=[ - {'name': u'SHOW_EMPTY_SMART_LINKS', 'global_name': u'LINKING_SHOW_EMPTY_SMART_LINKS', 'default': True, 'description': _(u'Show smart link that don\'t return any documents.')}, - ] -) diff --git a/mayan/apps/linking/south_migrations/0001_initial.py b/mayan/apps/linking/south_migrations/0001_initial.py index d92d8dd97c..7af48b8ca1 100644 --- a/mayan/apps/linking/south_migrations/0001_initial.py +++ b/mayan/apps/linking/south_migrations/0001_initial.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime from south.db import db from south.v2 import SchemaMigration from django.db import models diff --git a/mayan/apps/linking/south_migrations/0002_auto.py b/mayan/apps/linking/south_migrations/0002_auto.py index d52e724ed0..8fea41e9f6 100644 --- a/mayan/apps/linking/south_migrations/0002_auto.py +++ b/mayan/apps/linking/south_migrations/0002_auto.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime from south.db import db from south.v2 import SchemaMigration from django.db import models diff --git a/mayan/apps/linking/south_migrations/0003_auto__chg_field_smartlinkcondition_foreign_document_data.py b/mayan/apps/linking/south_migrations/0003_auto__chg_field_smartlinkcondition_foreign_document_data.py index ced2d9c4b5..4d131e05b2 100644 --- a/mayan/apps/linking/south_migrations/0003_auto__chg_field_smartlinkcondition_foreign_document_data.py +++ b/mayan/apps/linking/south_migrations/0003_auto__chg_field_smartlinkcondition_foreign_document_data.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime from south.db import db from south.v2 import SchemaMigration from django.db import models @@ -45,4 +44,4 @@ class Migration(SchemaMigration): } } - complete_apps = ['linking'] \ No newline at end of file + complete_apps = ['linking'] diff --git a/mayan/apps/linking/urls.py b/mayan/apps/linking/urls.py index 92aa3310de..f16b9e95c3 100644 --- a/mayan/apps/linking/urls.py +++ b/mayan/apps/linking/urls.py @@ -1,9 +1,8 @@ from django.conf.urls import patterns, url urlpatterns = patterns('linking.views', - url(r'^action/$', 'smart_link_action', (), 'smart_link_action'), + url(r'^document/(?P\d+)/$', 'smart_link_instances_for_document', (), 'smart_link_instances_for_document'), url(r'^document/(?P\d+)/smart_link/(?P\d+)/$', 'smart_link_instance_view', (), 'smart_link_instance_view'), - url(r'^smart/for_document/(?P\d+)/$', 'smart_link_instances_for_document', (), 'smart_link_instances_for_document'), url(r'^setup/list/$', 'smart_link_list', (), 'smart_link_list'), url(r'^setup/create/$', 'smart_link_create', (), 'smart_link_create'), diff --git a/mayan/apps/linking/views.py b/mayan/apps/linking/views.py index f9d4ad2f92..1a7ca5a2d1 100644 --- a/mayan/apps/linking/views.py +++ b/mayan/apps/linking/views.py @@ -16,34 +16,20 @@ from acls.views import acl_list_for from common.utils import encapsulate, generate_choices_w_labels from common.views import assign_remove from common.widgets import two_state_template -from documents.models import Document -from documents.permissions import PERMISSION_DOCUMENT_VIEW +from documents.models import Document, DocumentType from documents.views import document_list from permissions.models import Permission -from .forms import (SmartLinkConditionForm, SmartLinkInstanceForm, - SmartLinkForm) -from .links import smart_link_instance_view_link +from .forms import SmartLinkConditionForm, SmartLinkForm from .models import SmartLink, SmartLinkCondition from .permissions import (PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT, PERMISSION_SMART_LINK_VIEW) -from .settings import SHOW_EMPTY_SMART_LINKS logger = logging.getLogger(__name__) -def smart_link_action(request): - action = request.GET.get('action', None) - - if not action: - messages.error(request, _(u'No action selected.')) - return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('main:home'))) - - return HttpResponseRedirect(action) - - def smart_link_instance_view(request, document_id, smart_link_pk): document = get_object_or_404(Document, pk=document_id) smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) @@ -53,14 +39,18 @@ def smart_link_instance_view(request, document_id, smart_link_pk): except PermissionDenied: AccessEntry.objects.check_access(PERMISSION_SMART_LINK_VIEW, request.user, smart_link) - object_list, errors = SmartLink.objects.get_for(document, smart_link) + try: + object_list = smart_link.get_linked_document_for(document) + except Exception as exception: + object_list = [] + + if request.user.is_staff or request.user.is_superuser: + messages.error(request, _(u'Smart link query error: %s' % exception)) return document_list( request, - title=_(u'Documents in smart link: %(group)s') % { - 'group': object_list['title'] - }, - object_list=object_list['documents'], + title=_(u'Documents in smart link: %s') % smart_link, + object_list=object_list, extra_context={ 'object': document } @@ -68,57 +58,40 @@ def smart_link_instance_view(request, document_id, smart_link_pk): def smart_link_instances_for_document(request, document_id): - subtemplates_list = [] document = get_object_or_404(Document, pk=document_id) - smart_link_instances, errors = SmartLink.objects.get_for(document) - if (request.user.is_staff or request.user.is_superuser) and errors: - for error in errors: - messages.warning(request, _(u'Smart link query error: %s' % error)) - if not SHOW_EMPTY_SMART_LINKS: - # If SHOW_EMPTY_SMART_LINKS is False, remove empty groups from - # dictionary - smart_link_instances = dict([(group, data) for group, data in smart_link_instances.items() if data['documents']]) + queryset = SmartLink.objects.get_for(document) try: Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW]) except PermissionDenied: - smart_link_instances_keys_filtered = AccessEntry.objects.filter_objects_by_access(PERMISSION_SMART_LINK_VIEW, request.user, smart_link_instances.keys()) - # Remove smart link instances not found in the new filtered key list - for key, value in smart_link_instances.items(): - if key not in smart_link_instances_keys_filtered: - smart_link_instances.pop(key) - - value['documents'] = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_VIEW, request.user, value['documents']) - - if smart_link_instances: - subtemplates_list = [{ - 'name': 'main/generic_form_subtemplate.html', - 'context': { - 'title': _(u'Smart links (%s)') % len(smart_link_instances.keys()), - 'form': SmartLinkInstanceForm( - smart_link_instances=smart_link_instances, current_document=document, - links=[smart_link_instance_view_link] - ), - 'form_action': reverse('linking:smart_link_action'), - 'submit_method': 'GET', - } - }] + smart_links = AccessEntry.objects.filter_objects_by_access(PERMISSION_SMART_LINK_VIEW, request.user, queryset) else: - # If there are not group display a placeholder messages saying so - subtemplates_list = [{ - 'name': 'main/generic_subtemplate.html', - 'context': { - 'title': _(u'Smart links (0)'), - 'content': _(u'There are no defined smart links for the current document.'), - } - }] + smart_links = queryset - return render_to_response('main/generic_detail.html', { - 'object': document, + context = { 'document': document, - 'subtemplates_list': subtemplates_list, - }, context_instance=RequestContext(request)) + 'object': document, + 'object_list': smart_links, + 'title': _(u'Smart links for: %s') % document, + 'extra_columns': [ + {'name': _('Indentifier'), 'attribute': 'smart_link'}, + {'name': _('Documents'), 'attribute': encapsulate(lambda smart_link: smart_link.queryset.count())} + ], + 'extra_navigation_links': { + SmartLink: { + None: { + 'link': [{'text': 'asd'}] + } + } + + }, + 'hide_object': True, + 'hide_link': True, + } + + return render_to_response('main/generic_list.html', context, + context_instance=RequestContext(request)) def smart_link_list(request): @@ -226,12 +199,10 @@ def smart_link_document_types(request, smart_link_pk): return assign_remove( request, - left_list=lambda: generate_choices_w_labels(smart_link.get_document_types_not_selected(), display_object_type=False), + left_list=lambda: generate_choices_w_labels(DocumentType.objects.exclude(pk__in=smart_link.document_types.all()), display_object_type=False), right_list=lambda: generate_choices_w_labels(smart_link.document_types.all(), display_object_type=False), add_method=lambda x: smart_link.document_types.add(x), remove_method=lambda x: smart_link.document_types.remove(x), - #left_list_title=_(u'Document types not in index: %s') % smart_link, - #right_list_title=_(u'Document types for index: %s') % smart_link, decode_content_type=True, extra_context={ 'main_title': _('Document type for which to enable smart link: %s') % smart_link, @@ -244,13 +215,13 @@ def smart_link_condition_list(request, smart_link_pk): smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) try: - Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]) + Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_EDIT]) except PermissionDenied: - AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link) + AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_EDIT], request.user, smart_link) return render_to_response('main/generic_list.html', { 'title': _(u'Conditions for smart link: %s') % smart_link, - 'object_list': smart_link.smartlinkcondition_set.all(), + 'object_list': smart_link.conditions.all(), 'extra_columns': [ {'name': _(u'Enabled'), 'attribute': encapsulate(lambda x: two_state_template(x.enabled))}, ], @@ -264,9 +235,9 @@ def smart_link_condition_create(request, smart_link_pk): smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) try: - Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]) + Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_EDIT]) except PermissionDenied: - AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link) + AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_EDIT], request.user, smart_link) if request.method == 'POST': form = SmartLinkConditionForm(data=request.POST) @@ -290,9 +261,9 @@ def smart_link_condition_edit(request, smart_link_condition_pk): smart_link_condition = get_object_or_404(SmartLinkCondition, pk=smart_link_condition_pk) try: - Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]) + Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_EDIT]) except PermissionDenied: - AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link_condition.smart_link) + AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_EDIT], request.user, smart_link_condition.smart_link) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse('main:home')))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse('main:home')))) @@ -325,9 +296,9 @@ def smart_link_condition_delete(request, smart_link_condition_pk): smart_link_condition = get_object_or_404(SmartLinkCondition, pk=smart_link_condition_pk) try: - Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]) + Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_EDIT]) except PermissionDenied: - AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link_condition.smart_link) + AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_EDIT], request.user, smart_link_condition.smart_link) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse('main:home')))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse('main:home'))))