PEP8 Cleanups
This commit is contained in:
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('acls.views',
|
||||
urlpatterns = patterns(
|
||||
'acls.views',
|
||||
url(r'^new_holder_for/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/$', 'acl_new_holder_for', (), 'acl_new_holder_for'),
|
||||
url(r'^list_for/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/$', 'acl_list', (), 'acl_list'),
|
||||
url(r'^details/(?P<access_object_gid>[.\w]+)/holder/(?P<holder_object_gid>[.\w]+)/$', 'acl_detail', (), 'acl_detail'),
|
||||
@@ -18,5 +19,4 @@ urlpatterns = patterns('acls.views',
|
||||
|
||||
url(r'^class/multiple/grant/$', 'acl_class_multiple_grant', (), 'acl_class_multiple_grant'),
|
||||
url(r'^class/multiple/revoke/$', 'acl_class_multiple_revoke', (), 'acl_class_multiple_revoke'),
|
||||
|
||||
)
|
||||
|
||||
@@ -4,14 +4,16 @@ from django.conf.urls import patterns, url
|
||||
|
||||
from .api_views import APICheckedoutDocumentListView, APICheckedoutDocumentView
|
||||
|
||||
urlpatterns = patterns('checkouts.views',
|
||||
urlpatterns = patterns(
|
||||
'checkouts.views',
|
||||
url(r'^list/$', 'checkout_list', (), 'checkout_list'),
|
||||
url(r'^(?P<document_pk>\d+)/check/out/$', 'checkout_document', (), 'checkout_document'),
|
||||
url(r'^(?P<document_pk>\d+)/check/in/$', 'checkin_document', (), 'checkin_document'),
|
||||
url(r'^(?P<document_pk>\d+)/check/info/$', 'checkout_info', (), 'checkout_info'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^documents/$', APICheckedoutDocumentListView.as_view(), name='checkout-document-list'),
|
||||
url(r'^documents/(?P<pk>[0-9]+)/$', APICheckedoutDocumentView.as_view(), name='checkedout-document-view'),
|
||||
)
|
||||
|
||||
@@ -31,8 +31,12 @@ class DetailForm(forms.ModelForm):
|
||||
else:
|
||||
self.fields[extra_field['field']] = forms.CharField(
|
||||
label=extra_field['label'],
|
||||
initial=escape(return_attrib(self.instance,
|
||||
extra_field['field'], None)),
|
||||
initial=escape(
|
||||
return_attrib(
|
||||
self.instance,
|
||||
extra_field['field'], None
|
||||
)
|
||||
),
|
||||
widget=PlainWidget)
|
||||
|
||||
for field_name, field in self.fields.items():
|
||||
@@ -140,8 +144,8 @@ class EmailAuthenticationForm(forms.Form):
|
||||
"""
|
||||
A form to use email address authentication
|
||||
"""
|
||||
email = forms.CharField(label=_('Email'), max_length=254,
|
||||
widget=EmailInput()
|
||||
email = forms.CharField(
|
||||
label=_('Email'), max_length=254, widget=EmailInput()
|
||||
)
|
||||
password = forms.CharField(label=_('Password'), widget=forms.PasswordInput)
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@ from django.conf.urls import patterns, url
|
||||
from django.views.generic import TemplateView
|
||||
|
||||
|
||||
urlpatterns = patterns('common.views',
|
||||
urlpatterns = patterns(
|
||||
'common.views',
|
||||
url(r'^about/$', TemplateView.as_view(template_name='main/about.html'), name='about_view'),
|
||||
url(r'^license/$', 'license_view', (), name='license_view'),
|
||||
url(r'^password/change/done/$', 'password_change_done', (), name='password_change_done'),
|
||||
@@ -20,7 +21,8 @@ urlpatterns = patterns('common.views',
|
||||
url(r'^password/change/$', 'password_change_view', (), name='password_change_view'),
|
||||
)
|
||||
|
||||
urlpatterns += patterns('',
|
||||
urlpatterns += patterns(
|
||||
'',
|
||||
url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': 'main:home'}, name='logout_view'),
|
||||
|
||||
url(r'^password/reset/$', 'django.contrib.auth.views.password_reset', {'email_template_name': 'main/password_reset_email.html', 'template_name': 'main/password_reset_form.html', 'post_reset_redirect': '/password/reset/done'}, name='password_reset_view'),
|
||||
@@ -29,6 +31,7 @@ urlpatterns += patterns('',
|
||||
url(r'^password/reset/done/$', 'django.contrib.auth.views.password_reset_done', {'template_name': 'main/password_reset_done.html'}, name='password_reset_done_view'),
|
||||
)
|
||||
|
||||
urlpatterns += patterns('',
|
||||
urlpatterns += patterns(
|
||||
'',
|
||||
url(r'^set_language/$', 'django.views.i18n.set_language', name='set_language'),
|
||||
)
|
||||
|
||||
@@ -132,7 +132,6 @@ class GPG(object):
|
||||
except Exception as exception:
|
||||
raise GPGException('ERROR: GPG initialization error; %s' % exception)
|
||||
|
||||
|
||||
def verify_file(self, file_input, detached_signature=None, fetch_key=False):
|
||||
"""
|
||||
Verify the signature of a file.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('django_gpg.views',
|
||||
urlpatterns = patterns(
|
||||
'django_gpg.views',
|
||||
url(r'^delete/(?P<fingerprint>.+)/(?P<key_type>\w+)/$', 'key_delete', (), 'key_delete'),
|
||||
url(r'^list/private/$', 'key_list', {'secret': True}, 'key_private_list'),
|
||||
url(r'^list/public/$', 'key_list', {'secret': False}, 'key_public_list'),
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('document_acls.views',
|
||||
urlpatterns = patterns(
|
||||
'document_acls.views',
|
||||
url(r'^list_for/document/(?P<document_id>\d+)/$', 'document_acl_list', (), 'document_acl_list'),
|
||||
)
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('document_comments.views',
|
||||
urlpatterns = patterns(
|
||||
'document_comments.views',
|
||||
url(r'^comment/(?P<comment_id>\d+)/delete/$', 'comment_delete', (), 'comment_delete'),
|
||||
url(r'^comment/multiple/delete/$', 'comment_multiple_delete', (), 'comment_multiple_delete'),
|
||||
url(r'^(?P<document_id>\d+)/comment/add/$', 'comment_add', (), 'comment_add'),
|
||||
|
||||
@@ -24,6 +24,3 @@ class IndexAdmin(admin.ModelAdmin):
|
||||
|
||||
|
||||
admin.site.register(Index, IndexAdmin)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@ from .api_views import (
|
||||
)
|
||||
|
||||
|
||||
urlpatterns = patterns('document_indexing.views',
|
||||
urlpatterns = patterns(
|
||||
'document_indexing.views',
|
||||
url(r'^setup/index/list/$', 'index_setup_list', (), 'index_setup_list'),
|
||||
url(r'^setup/index/create/$', 'index_setup_create', (), 'index_setup_create'),
|
||||
url(r'^setup/index/(?P<index_pk>\d+)/edit/$', 'index_setup_edit', (), 'index_setup_edit'),
|
||||
@@ -28,7 +29,8 @@ urlpatterns = patterns('document_indexing.views',
|
||||
url(r'^list/for/document/(?P<document_id>\d+)/$', 'document_index_list', (), 'document_index_list'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^index/node/(?P<pk>[0-9]+)/documents/$', APIIndexNodeInstanceDocumentListView.as_view(), name='index-node-documents'),
|
||||
url(r'^index/template/(?P<pk>[0-9]+)/$', APIIndexTemplateView.as_view(), name='index-template-detail'),
|
||||
url(r'^indexes/(?P<pk>[0-9]+)/$', APIIndexView.as_view(), name='index-detail'),
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('document_signatures.views',
|
||||
urlpatterns = patterns(
|
||||
'document_signatures.views',
|
||||
url(r'^verify/(?P<document_pk>\d+)/$', 'document_verify', (), 'document_verify'),
|
||||
url(r'^upload/signature/(?P<document_pk>\d+)/$', 'document_signature_upload', (), 'document_signature_upload'),
|
||||
url(r'^download/signature/(?P<document_pk>\d+)/$', 'document_signature_download', (), 'document_signature_download'),
|
||||
|
||||
@@ -33,7 +33,6 @@ class Migration(SchemaMigration):
|
||||
self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.Document']),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
# User chose to not deal with backwards NULL issues for 'WorkflowInstanceLogEntry.workflow_instace'
|
||||
raise RuntimeError("Cannot reverse this migration. 'WorkflowInstanceLogEntry.workflow_instace' and its values cannot be restored.")
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@ from .views import (
|
||||
WorkflowInstanceTransitionView, DocumentWorkflowInstanceListView
|
||||
)
|
||||
|
||||
urlpatterns = patterns('',
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^setup/all/$', SetupWorkflowListView.as_view(), name='setup_workflow_list'),
|
||||
url(r'^setup/create/$', SetupWorkflowCreateView.as_view(), name='setup_workflow_create'),
|
||||
url(r'^setup/(?P<pk>\d+)/edit/$', SetupWorkflowEditView.as_view(), name='setup_workflow_edit'),
|
||||
@@ -33,6 +34,7 @@ urlpatterns = patterns('',
|
||||
url(r'^document/workflows/(?P<pk>\d+)/transition/$', WorkflowInstanceTransitionView.as_view(), name='workflow_instance_transition'),
|
||||
)
|
||||
|
||||
urlpatterns += patterns('document_states.views',
|
||||
urlpatterns += patterns(
|
||||
'document_states.views',
|
||||
url(r'^setup/(?P<pk>\d+)/document_types/$', 'setup_workflow_document_types', name='setup_workflow_document_types'),
|
||||
)
|
||||
|
||||
@@ -5,19 +5,16 @@ from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding field 'Document.label'
|
||||
db.add_column(u'documents_document', 'label',
|
||||
self.gf('django.db.models.fields.CharField')(default=u'Uninitialized document', max_length=255, db_index=True),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting field 'Document.label'
|
||||
db.delete_column(u'documents_document', 'label')
|
||||
|
||||
|
||||
models = {
|
||||
u'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
|
||||
@@ -12,7 +12,8 @@ from .api_views import (
|
||||
from .settings import PRINT_SIZE, DISPLAY_SIZE
|
||||
from .views import DocumentListView
|
||||
|
||||
urlpatterns = patterns('documents.views',
|
||||
urlpatterns = patterns(
|
||||
'documents.views',
|
||||
url(r'^list/$', DocumentListView.as_view(), name='document_list'),
|
||||
url(r'^list/recent/$', 'document_list_recent', (), 'document_list_recent'),
|
||||
|
||||
@@ -74,7 +75,8 @@ urlpatterns = patterns('documents.views',
|
||||
url(r'^type/(?P<document_type_id>\d+)/filename/create/$', 'document_type_filename_create', (), 'document_type_filename_create'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^documents/$', APIDocumentListView.as_view(), name='document-list'),
|
||||
url(r'^documents/recent/$', APIRecentDocumentListView.as_view(), name='document-recent-list'),
|
||||
url(r'^documents/(?P<pk>[0-9]+)/$', APIDocumentView.as_view(), name='document-detail'),
|
||||
|
||||
@@ -6,14 +6,16 @@ from .api_views import (
|
||||
APIRecentSearchListView, APIRecentSearchView, APISearchView
|
||||
)
|
||||
|
||||
urlpatterns = patterns('dynamic_search.views',
|
||||
urlpatterns = patterns(
|
||||
'dynamic_search.views',
|
||||
url(r'^$', 'search', (), 'search'),
|
||||
url(r'^advanced/$', 'search', {'advanced': True}, 'search_advanced'),
|
||||
url(r'^again/$', 'search_again', (), 'search_again'),
|
||||
url(r'^results/$', 'results', (), 'results'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^recent_searches/$', APIRecentSearchListView.as_view(), name='recentsearch-list'),
|
||||
url(r'^recent_searches/(?P<pk>[0-9]+)/$', APIRecentSearchView.as_view(), name='recentsearch-detail'),
|
||||
url(r'^search/$', APISearchView.as_view(), name='search-view'),
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('events.views',
|
||||
urlpatterns = patterns(
|
||||
'events.views',
|
||||
url(r'^all/$', 'events_list', (), 'events_list'),
|
||||
url(r'^for_object/(?P<app_label>[\w\-]+)/(?P<module_name>[\w\-]+)/(?P<object_id>\d+)/$', 'events_list', (), 'events_for_object'),
|
||||
url(r'^by_verb/(?P<verb>[\w\-]+)/$', 'events_list', (), 'events_by_verb'),
|
||||
|
||||
@@ -8,7 +8,8 @@ from .api_views import (
|
||||
)
|
||||
from .views import FolderDetailView, FolderListView
|
||||
|
||||
urlpatterns = patterns('folders.views',
|
||||
urlpatterns = patterns(
|
||||
'folders.views',
|
||||
url(r'^list/$', FolderListView.as_view(), name='folder_list'),
|
||||
url(r'^create/$', 'folder_create', (), 'folder_create'),
|
||||
url(r'^(?P<folder_id>\d+)/edit/$', 'folder_edit', (), 'folder_edit'),
|
||||
@@ -23,7 +24,8 @@ urlpatterns = patterns('folders.views',
|
||||
url(r'^(?P<folder_pk>\d+)/acl/list/$', 'folder_acl_list', (), 'folder_acl_list'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^folders/(?P<pk>[0-9]+)/documents/(?P<document_pk>[0-9]+)/$', APIFolderDocumentView.as_view(), name='folder-document'),
|
||||
url(r'^folders/(?P<pk>[0-9]+)/documents/$', APIFolderDocumentListView.as_view(), name='folder-document-list'),
|
||||
url(r'^folders/(?P<pk>[0-9]+)/$', APIFolderView.as_view(), name='folder-detail'),
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db.utils import DatabaseError
|
||||
from django.dispatch import receiver
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ from common.utils import pretty_size
|
||||
from mayan import __version__ as mayan_version
|
||||
from ocr.settings import PDFTOTEXT_PATH, TESSERACT_PATH, UNPAPER_PATH
|
||||
|
||||
from .classes import PIPNotFound, Property, PropertyNamespace, VirtualEnv
|
||||
from .classes import PIPNotFound, PropertyNamespace, VirtualEnv
|
||||
|
||||
|
||||
class Installation(SingletonModel):
|
||||
|
||||
@@ -6,19 +6,16 @@ from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Deleting field 'Installation.is_first_run'
|
||||
db.delete_column(u'installation_installation', 'is_first_run')
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Adding field 'Installation.is_first_run'
|
||||
db.add_column(u'installation_installation', 'is_first_run',
|
||||
self.gf('django.db.models.fields.BooleanField')(default=False),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
models = {
|
||||
u'installation.installation': {
|
||||
'Meta': {'object_name': 'Installation'},
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('installation.views',
|
||||
urlpatterns = patterns(
|
||||
'installation.views',
|
||||
url(r'^$', 'namespace_list', (), 'namespace_list'),
|
||||
url(r'^(?P<namespace_id>\w+)/details/$', 'namespace_details', (), 'namespace_details'),
|
||||
)
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('linking.views',
|
||||
urlpatterns = patterns(
|
||||
'linking.views',
|
||||
url(r'^document/(?P<document_id>\d+)/$', 'smart_link_instances_for_document', (), 'smart_link_instances_for_document'),
|
||||
url(r'^document/(?P<document_id>\d+)/smart_link/(?P<smart_link_pk>\d+)/$', 'smart_link_instance_view', (), 'smart_link_instance_view'),
|
||||
|
||||
|
||||
@@ -4,13 +4,9 @@ import time
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
from .exceptions import LockError#, StaleLock
|
||||
from .exceptions import LockError
|
||||
from .models import Lock
|
||||
|
||||
# Notice: StaleLock exception and tests are not available until more changes are
|
||||
# backported.
|
||||
# TODO: backport stale lock code
|
||||
|
||||
|
||||
class LockTestCase(TestCase):
|
||||
def test_exclusive(self):
|
||||
@@ -46,8 +42,6 @@ class LockTestCase(TestCase):
|
||||
def test_double_release(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1')
|
||||
lock_1.release()
|
||||
#with self.assertRaises(StaleLock):
|
||||
# lock_1.release()
|
||||
|
||||
def test_release_expired(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1', timeout=1)
|
||||
@@ -59,11 +53,8 @@ class LockTestCase(TestCase):
|
||||
# would be successfull, even after an extended lapse of time
|
||||
|
||||
def test_release_expired_reaquired(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1', timeout=1)
|
||||
time.sleep(2)
|
||||
lock_2 = Lock.objects.acquire_lock(name='test_lock_1', timeout=1)
|
||||
#with self.assertRaises(StaleLock):
|
||||
# lock_1.release()
|
||||
|
||||
# Cleanup
|
||||
lock_2.release()
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('mailer.views',
|
||||
urlpatterns = patterns(
|
||||
'mailer.views',
|
||||
url(r'^(?P<document_id>\d+)/send/link/$', 'send_document_link', (), 'send_document_link'),
|
||||
url(r'^(?P<document_id>\d+)/send/document/$', 'send_document_link', {'as_attachment': True}, 'send_document'),
|
||||
)
|
||||
|
||||
@@ -4,12 +4,14 @@ from django.conf.urls import patterns, url
|
||||
from django.contrib.staticfiles.templatetags.staticfiles import static
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
urlpatterns = patterns('main.views',
|
||||
urlpatterns = patterns(
|
||||
'main.views',
|
||||
url(r'^$', 'home', (), 'home'),
|
||||
url(r'^maintenance_menu/$', 'maintenance_menu', (), 'maintenance_menu'),
|
||||
url(r'^diagnostics/$', 'diagnostics_view', (), 'diagnostics'),
|
||||
)
|
||||
|
||||
urlpatterns += patterns('',
|
||||
urlpatterns += patterns(
|
||||
'',
|
||||
(r'^favicon\.ico$', RedirectView.as_view(url=static('main/images/favicon.ico'))),
|
||||
)
|
||||
|
||||
@@ -10,7 +10,8 @@ from .api_views import (
|
||||
APIMetadataTypeView
|
||||
)
|
||||
|
||||
urlpatterns = patterns('metadata.views',
|
||||
urlpatterns = patterns(
|
||||
'metadata.views',
|
||||
url(r'^(?P<document_id>\d+)/edit/$', 'metadata_edit', (), 'metadata_edit'),
|
||||
url(r'^(?P<document_id>\d+)/view/$', 'metadata_view', (), 'metadata_view'),
|
||||
url(r'^multiple/edit/$', 'metadata_multiple_edit', (), 'metadata_multiple_edit'),
|
||||
@@ -30,7 +31,8 @@ urlpatterns = patterns('metadata.views',
|
||||
url(r'^tools/missing_required_metadata/$', 'documents_missing_required_metadata', (), 'documents_missing_required_metadata'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^metadatatypes/$', APIMetadataTypeListView.as_view(), name='metadatatype-list'),
|
||||
url(r'^metadatatypes/(?P<pk>[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail'),
|
||||
url(r'^document/metadata/(?P<pk>[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'),
|
||||
|
||||
@@ -1,315 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import inspect
|
||||
import logging
|
||||
import urllib
|
||||
import urlparse
|
||||
|
||||
from django.core.urlresolvers import NoReverseMatch, resolve, reverse
|
||||
from django.template import VariableDoesNotExist, Variable
|
||||
from django.utils.encoding import smart_str, smart_unicode
|
||||
from django.utils.http import urlencode, urlquote
|
||||
from django.utils.text import unescape_string_literal
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ResolvedLink(object):
|
||||
active = False
|
||||
url = '#'
|
||||
text = _('Unnamed link')
|
||||
|
||||
|
||||
class Link(object):
|
||||
bound_links = {}
|
||||
|
||||
@classmethod
|
||||
def bind_links(cls, sources, links, menu_name=None, position=0):
|
||||
"""
|
||||
Associate a link to a model, a view, or an url
|
||||
"""
|
||||
cls.bound_links.setdefault(menu_name, {})
|
||||
try:
|
||||
for source in sources:
|
||||
cls.bound_links[menu_name].setdefault(source, {'links': []})
|
||||
try:
|
||||
cls.bound_links[menu_name][source]['links'].extend(links)
|
||||
except TypeError:
|
||||
# Try to see if links is a single link
|
||||
cls.bound_links[menu_name][source]['links'].append(links)
|
||||
except TypeError:
|
||||
raise Exception('The bind_links source argument must be a list, even for single element sources.')
|
||||
|
||||
def __init__(self, text, view, klass=None, args=None, icon=None,
|
||||
permissions=None, condition=None, conditional_disable=None,
|
||||
description=None, dont_mark_active=False, keep_query=False,
|
||||
conditional_highlight=None):
|
||||
|
||||
self.text = text
|
||||
self.view = view
|
||||
self.args = args or {}
|
||||
#self.kwargs = kwargs or {}
|
||||
self.icon = icon
|
||||
self.permissions = permissions or []
|
||||
self.condition = condition
|
||||
self.conditional_disable = conditional_disable
|
||||
self.description = description
|
||||
self.dont_mark_active = dont_mark_active
|
||||
self.klass = klass
|
||||
self.keep_query = keep_query
|
||||
self.conditional_highlight = conditional_highlight # Used by dynamic sources
|
||||
|
||||
def resolve(self, context, request=None, current_path=None, current_view=None, resolved_object=None):
|
||||
# Don't calculate these if passed in an argument
|
||||
request = request or Variable('request').resolve(context)
|
||||
current_path = current_path or request.META['PATH_INFO']
|
||||
if not current_view:
|
||||
match = resolve(current_path)
|
||||
if match.namespace:
|
||||
current_view = '{}:{}'.format(match.namespace, match.url_name)
|
||||
else:
|
||||
current_view = match.url_name
|
||||
|
||||
# Preserve unicode data in URL query
|
||||
previous_path = smart_unicode(urllib.unquote_plus(smart_str(request.get_full_path()) or smart_str(request.META.get('HTTP_REFERER', reverse('main:home')))))
|
||||
query_string = urlparse.urlparse(previous_path).query
|
||||
parsed_query_string = urlparse.parse_qs(query_string)
|
||||
|
||||
logger.debug('condition: %s', self.condition)
|
||||
|
||||
if resolved_object:
|
||||
context['resolved_object'] = resolved_object
|
||||
|
||||
# Check to see if link has conditional display
|
||||
if self.condition:
|
||||
self.condition_result = self.condition(context)
|
||||
else:
|
||||
self.condition_result = True
|
||||
|
||||
logger.debug('self.condition_result: %s', self.condition_result)
|
||||
|
||||
if self.condition_result:
|
||||
resolved_link = ResolvedLink()
|
||||
resolved_link.text = self.text
|
||||
resolved_link.icon = self.icon
|
||||
resolved_link.permissions = self.permissions
|
||||
resolved_link.condition_result = self.condition_result
|
||||
|
||||
try:
|
||||
#args, kwargs = resolve_arguments(context, self.get('args', {}))
|
||||
args, kwargs = Link.resolve_arguments(context, self.args)
|
||||
except VariableDoesNotExist:
|
||||
args = []
|
||||
kwargs = {}
|
||||
|
||||
if self.view:
|
||||
if not self.dont_mark_active:
|
||||
resolved_link.active = self.view == current_view
|
||||
|
||||
try:
|
||||
if kwargs:
|
||||
resolved_link.url = reverse(self.view, kwargs=kwargs)
|
||||
else:
|
||||
resolved_link.url = reverse(self.view, args=args)
|
||||
if self.keep_query:
|
||||
resolved_link.url = '%s?%s' % (urlquote(resolved_link.url), urlencode(parsed_query_string, doseq=True))
|
||||
|
||||
except NoReverseMatch, exc:
|
||||
resolved_link.url = '#'
|
||||
resolved_link.error = exc
|
||||
elif self.url:
|
||||
if not self.dont_mark_active:
|
||||
resolved_link.url.active = self.url == current_path
|
||||
|
||||
if kwargs:
|
||||
resolved_link.url = self.url % kwargs
|
||||
else:
|
||||
resolved_link.url = self.url % args
|
||||
if self.keep_query:
|
||||
resolved_link.url = '%s?%s' % (urlquote(resolved_link.url), urlencode(parsed_query_string, doseq=True))
|
||||
else:
|
||||
resolved_link.active = False
|
||||
|
||||
if self.conditional_highlight:
|
||||
resolved_link.active = self.conditional_highlight(context)
|
||||
|
||||
if self.conditional_disable:
|
||||
resolved_link.disabled = self.conditional_disable(context)
|
||||
else:
|
||||
resolved_link.disabled = False
|
||||
|
||||
# TODO: add tree base main menu support to auto activate parent links
|
||||
|
||||
return resolved_link
|
||||
|
||||
@classmethod
|
||||
def get_context_navigation_links(cls, context, menu_name=None, links_dict=None):
|
||||
request = Variable('request').resolve(context)
|
||||
current_path = request.META['PATH_INFO']
|
||||
match = resolve(current_path)
|
||||
if match.namespace:
|
||||
current_view = '{}:{}'.format(match.namespace, match.url_name)
|
||||
else:
|
||||
current_view = match.url_name
|
||||
|
||||
context_links = {}
|
||||
if not links_dict:
|
||||
links_dict = Link.bound_links
|
||||
|
||||
# Don't fudge with the original global dictionary
|
||||
# TODO: fix this
|
||||
links_dict = links_dict.copy()
|
||||
|
||||
# Dynamic sources
|
||||
# TODO: improve name to 'injected...'
|
||||
# TODO: remove, only used by staging files
|
||||
try:
|
||||
# Check for an inject temporary navigation dictionary
|
||||
temp_navigation_links = Variable('extra_navigation_links').resolve(context)
|
||||
if temp_navigation_links:
|
||||
links_dict.update(temp_navigation_links)
|
||||
except VariableDoesNotExist:
|
||||
pass
|
||||
|
||||
# Get view only links
|
||||
try:
|
||||
view_links = links_dict[menu_name][current_view]['links']
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
context_links[None] = []
|
||||
|
||||
for link in view_links:
|
||||
context_links[None].append(link.resolve(context, request=request, current_path=current_path, current_view=current_view))
|
||||
|
||||
# Get object links
|
||||
for resolved_object in Link.get_navigation_objects(context).keys():
|
||||
for source, data in links_dict.get(menu_name, {}).items():
|
||||
if inspect.isclass(source) and isinstance(resolved_object, source) or Combined(obj=type(resolved_object), view=current_view) == source:
|
||||
context_links[resolved_object] = []
|
||||
for link in data['links']:
|
||||
context_links[resolved_object].append(link.resolve(context, request=request, current_path=current_path, current_view=current_view, resolved_object=resolved_object))
|
||||
break # No need for further content object match testing
|
||||
return context_links
|
||||
|
||||
@classmethod
|
||||
def get_navigation_objects(cls, context):
|
||||
objects = {}
|
||||
|
||||
try:
|
||||
object_list = Variable('navigation_object_list').resolve(context)
|
||||
except VariableDoesNotExist:
|
||||
pass
|
||||
else:
|
||||
logger.debug('found: navigation_object_list')
|
||||
for obj in object_list:
|
||||
objects.setdefault(obj, {})
|
||||
|
||||
# Legacy
|
||||
try:
|
||||
indirect_reference_list = Variable('navigation_object_list_ref').resolve(context)
|
||||
except VariableDoesNotExist:
|
||||
pass
|
||||
else:
|
||||
logger.debug('found: navigation_object_list_ref')
|
||||
for indirect_reference in indirect_reference_list:
|
||||
try:
|
||||
resolved_object = Variable(indirect_reference['object']).resolve(context)
|
||||
except VariableDoesNotExist:
|
||||
resolved_object = None
|
||||
else:
|
||||
objects.setdefault(resolved_object, {})
|
||||
objects[resolved_object]['label'] = indirect_reference.get('object_name')
|
||||
|
||||
try:
|
||||
resolved_object = Variable('object').resolve(context)
|
||||
except VariableDoesNotExist:
|
||||
pass
|
||||
else:
|
||||
logger.debug('found single object')
|
||||
try:
|
||||
object_label = Variable('object_name').resolve(context)
|
||||
except VariableDoesNotExist:
|
||||
object_label = None
|
||||
finally:
|
||||
objects.setdefault(resolved_object, {})
|
||||
objects[resolved_object]['label'] = object_label
|
||||
|
||||
return objects
|
||||
|
||||
@classmethod
|
||||
def resolve_template_variable(cls, context, name):
|
||||
try:
|
||||
return unescape_string_literal(name)
|
||||
except ValueError:
|
||||
#return Variable(name).resolve(context)
|
||||
#TODO: Research if should return always as a str
|
||||
return str(Variable(name).resolve(context))
|
||||
except TypeError:
|
||||
return name
|
||||
|
||||
@classmethod
|
||||
def resolve_arguments(cls, context, src_args):
|
||||
args = []
|
||||
kwargs = {}
|
||||
|
||||
if isinstance(src_args, list):
|
||||
for i in src_args:
|
||||
try:
|
||||
# Try to execute as a function
|
||||
val = i(context=context)
|
||||
except TypeError:
|
||||
val = Link.resolve_template_variable(context, i)
|
||||
if val:
|
||||
args.append(val)
|
||||
else:
|
||||
args.append(val)
|
||||
elif isinstance(src_args, dict):
|
||||
for key, value in src_args.items():
|
||||
try:
|
||||
# Try to execute as a function
|
||||
val = i(context=context)
|
||||
except TypeError:
|
||||
val = Link.resolve_template_variable(context, value)
|
||||
if val:
|
||||
kwargs[key] = val
|
||||
else:
|
||||
kwargs[key] = val
|
||||
else:
|
||||
val = Link.resolve_template_variable(context, src_args)
|
||||
if val:
|
||||
args.append(val)
|
||||
|
||||
return args, kwargs
|
||||
|
||||
|
||||
class ModelListColumn(object):
|
||||
_model_list_columns = {}
|
||||
|
||||
@classmethod
|
||||
def get_model(cls, model):
|
||||
return cls._model_list_columns.get(model)
|
||||
|
||||
def __init__(self, model, name, attribute):
|
||||
self.__class__._model_list_columns.setdefault(model, [])
|
||||
self.__class__._model_list_columns[model].extend(columns)
|
||||
|
||||
|
||||
class Combined(object):
|
||||
"""
|
||||
Class that binds a link to a combination of an object and a view.
|
||||
This is used to show links relating to a specific object type but only
|
||||
in certain views.
|
||||
Used by the PageDocument class to show rotatio and zoom link only on
|
||||
certain views
|
||||
"""
|
||||
def __init__(self, obj, view):
|
||||
self.obj = obj
|
||||
self.view = view
|
||||
|
||||
def __hash__(self):
|
||||
return hash((self.obj, self.view))
|
||||
|
||||
def __eq__(self, other):
|
||||
return hash(self) == hash(other)
|
||||
@@ -4,7 +4,8 @@ from django.conf.urls import patterns, url
|
||||
|
||||
from .api_views import DocumentVersionOCRView
|
||||
|
||||
urlpatterns = patterns('ocr.views',
|
||||
urlpatterns = patterns(
|
||||
'ocr.views',
|
||||
url(r'^document/(?P<pk>\d+)/submit/$', 'document_submit', (), 'document_submit'),
|
||||
url(r'^document/multiple/submit/$', 'document_submit_multiple', (), 'document_submit_multiple'),
|
||||
url(r'^document/all/clean_up/$', 'document_all_ocr_cleanup', (), 'document_all_ocr_cleanup'),
|
||||
@@ -16,6 +17,7 @@ urlpatterns = patterns('ocr.views',
|
||||
url(r'^multiple/re-queue/$', 'entry_re_queue_multiple', (), 'entry_re_queue_multiple'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^submit/$', DocumentVersionOCRView.as_view(), name='document-version-ocr-submit-view'),
|
||||
)
|
||||
|
||||
@@ -5,7 +5,8 @@ from django.conf.urls import patterns, url
|
||||
from .api_views import APIRoleListView, APIRoleView
|
||||
from .views import RoleCreateView, RoleDeleteView, RoleEditView
|
||||
|
||||
urlpatterns = patterns('permissions.views',
|
||||
urlpatterns = patterns(
|
||||
'permissions.views',
|
||||
url(r'^role/list/$', 'role_list', (), 'role_list'),
|
||||
url(r'^role/create/$', RoleCreateView.as_view(), name='role_create'),
|
||||
url(r'^role/(?P<role_id>\d+)/permissions/$', 'role_permissions', (), 'role_permissions'),
|
||||
@@ -17,7 +18,8 @@ urlpatterns = patterns('permissions.views',
|
||||
url(r'^permissions/multiple/revoke/$', 'permission_revoke', (), 'permission_multiple_revoke'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^roles/$', APIRoleListView.as_view(), name='role-list'),
|
||||
url(r'^roles/(?P<pk>[0-9]+)/$', APIRoleView.as_view(), name='role-detail'),
|
||||
)
|
||||
|
||||
@@ -13,13 +13,19 @@ def role_permission_link(requester, permission, permission_list):
|
||||
|
||||
if permission in permission_list:
|
||||
return mark_safe(template % {
|
||||
'url': reverse('permission_revoke',
|
||||
args=[permission.pk, ct.app_label, ct.model,
|
||||
requester.pk]),
|
||||
'url': reverse(
|
||||
'permission_revoke',
|
||||
args=[
|
||||
permission.pk, ct.app_label, ct.model, requester.pk
|
||||
]
|
||||
),
|
||||
'icon': 'key_delete', 'text': ugettext('Revoke')})
|
||||
else:
|
||||
return mark_safe(template % {
|
||||
'url': reverse('permission_grant',
|
||||
args=[permission.pk, ct.app_label, ct.model,
|
||||
requester.pk]),
|
||||
'url': reverse(
|
||||
'permission_grant',
|
||||
args=[
|
||||
permission.pk, ct.app_label, ct.model, requester.pk
|
||||
]
|
||||
),
|
||||
'icon': 'key_add', 'text': ugettext('Grant')})
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('project_setup.views',
|
||||
urlpatterns = patterns(
|
||||
'project_setup.views',
|
||||
url(r'^list/$', 'setup_list', (), 'setup_list'),
|
||||
)
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('project_tools.views',
|
||||
urlpatterns = patterns(
|
||||
'project_tools.views',
|
||||
url(r'^list/$', 'tools_list', (), 'tools_list'),
|
||||
)
|
||||
|
||||
@@ -38,7 +38,8 @@ class APIEndPoint(object):
|
||||
|
||||
def register_urls(self, urlpatterns):
|
||||
from .urls import version_0_urlpatterns
|
||||
endpoint_urls = patterns('',
|
||||
endpoint_urls = patterns(
|
||||
'',
|
||||
url(r'^%s/' % self.name, include(urlpatterns)),
|
||||
)
|
||||
|
||||
|
||||
@@ -4,16 +4,19 @@ from django.conf.urls import include, patterns, url
|
||||
|
||||
from .views import APIBase, Version_0, APIAppView, BrowseableObtainAuthToken
|
||||
|
||||
version_0_urlpatterns = patterns('',
|
||||
version_0_urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^$', Version_0.as_view(), name='api-version-0'),
|
||||
url(r'^(?P<app_name>\w+)/$', APIAppView.as_view(), name='api-version-0-app'),
|
||||
)
|
||||
|
||||
urlpatterns = patterns('',
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^$', APIBase.as_view(), name='api-root'),
|
||||
url(r'^v0/', include(version_0_urlpatterns)),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^auth/token/obtain/', BrowseableObtainAuthToken.as_view(), name='auth_token_obtain'),
|
||||
)
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('smart_settings.views',
|
||||
urlpatterns = patterns(
|
||||
'smart_settings.views',
|
||||
url(r'^list/$', 'setting_list', (), 'setting_list'),
|
||||
)
|
||||
|
||||
@@ -9,7 +9,8 @@ from .api_views import (
|
||||
from .views import UploadInteractiveVersionView, UploadInteractiveView
|
||||
from .wizards import DocumentCreateWizard
|
||||
|
||||
urlpatterns = patterns('sources.views',
|
||||
urlpatterns = patterns(
|
||||
'sources.views',
|
||||
url(r'^staging_file/(?P<staging_folder_pk>\d+)/(?P<encoded_filename>.+)/delete/$', 'staging_file_delete', name='staging_file_delete'),
|
||||
|
||||
url(r'^upload/document/new/interactive/(?P<source_id>\d+)/$', UploadInteractiveView.as_view(), name='upload_interactive'),
|
||||
@@ -36,7 +37,8 @@ urlpatterns = patterns('sources.views',
|
||||
url(r'^(?P<document_id>\d+)/create/siblings/$', 'document_create_siblings', (), 'document_create_siblings'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^staging_folders/file/(?P<staging_folder_pk>[0-9]+)/(?P<encoded_filename>.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'),
|
||||
url(r'^staging_folders/file/(?P<staging_folder_pk>[0-9]+)/(?P<encoded_filename>.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'),
|
||||
url(r'^staging_folders/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'),
|
||||
|
||||
@@ -2,7 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('statistics.views',
|
||||
urlpatterns = patterns(
|
||||
'statistics.views',
|
||||
url(r'^$', 'namespace_list', name='namespace_list'),
|
||||
url(r'^namespace/(?P<namespace_id>\w+)/details/$', 'namespace_details', name='namespace_details'),
|
||||
url(r'^(?P<statistic_id>\w+)/execute/$', 'execute', name='execute'),
|
||||
|
||||
@@ -8,7 +8,8 @@ from .api_views import (
|
||||
)
|
||||
from .views import TagTaggedItemListView
|
||||
|
||||
urlpatterns = patterns('tags.views',
|
||||
urlpatterns = patterns(
|
||||
'tags.views',
|
||||
url(r'^list/$', 'tag_list', (), 'tag_list'),
|
||||
url(r'^create/$', 'tag_create', (), 'tag_create'),
|
||||
url(r'^(?P<tag_id>\d+)/delete/$', 'tag_delete', (), 'tag_delete'),
|
||||
@@ -27,7 +28,8 @@ urlpatterns = patterns('tags.views',
|
||||
url(r'^(?P<tag_pk>\d+)/acl/list/$', 'tag_acl_list', (), 'tag_acl_list'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^tags/(?P<pk>[0-9]+)/documents/$', APITagDocumentListView.as_view(), name='tag-document-list'),
|
||||
url(r'^tags/(?P<pk>[0-9]+)/$', APITagView.as_view(), name='tag-detail'),
|
||||
url(r'^tags/$', APITagListView.as_view(), name='tag-list'),
|
||||
|
||||
@@ -7,7 +7,8 @@ from .api_views import (
|
||||
APIUserView
|
||||
)
|
||||
|
||||
urlpatterns = patterns('user_management.views',
|
||||
urlpatterns = patterns(
|
||||
'user_management.views',
|
||||
url(r'^user/list/$', 'user_list', (), 'user_list'),
|
||||
url(r'^user/add/$', 'user_add', (), 'user_add'),
|
||||
url(r'^user/(?P<user_id>\d+)/edit/$', 'user_edit', (), 'user_edit'),
|
||||
@@ -25,7 +26,8 @@ urlpatterns = patterns('user_management.views',
|
||||
url(r'^group/(?P<group_id>\d+)/members/$', 'group_members', (), 'group_members'),
|
||||
)
|
||||
|
||||
api_urls = patterns('',
|
||||
api_urls = patterns(
|
||||
'',
|
||||
url(r'^groups/$', APIGroupListView.as_view(), name='group-list'),
|
||||
url(r'^groups/(?P<pk>[0-9]+)/$', APIGroupView.as_view(), name='group-detail'),
|
||||
url(r'^users/$', APIUserListView.as_view(), name='user-list'),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from .. import *
|
||||
from .. import * # NOQA
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import *
|
||||
from .base import * # NOQA
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .base import *
|
||||
from .base import * # NOQA
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
|
||||
@@ -6,7 +6,8 @@ from django.contrib import admin
|
||||
|
||||
admin.autodiscover()
|
||||
|
||||
urlpatterns = patterns('',
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^', include('main.urls', namespace='main')),
|
||||
url(r'^accounts/', include('user_management.urls', namespace='user_management')),
|
||||
url(r'^acls/', include('acls.urls', namespace='acls')),
|
||||
|
||||
Reference in New Issue
Block a user