diff --git a/mayan/apps/acls/urls.py b/mayan/apps/acls/urls.py index 5a96c21f4b..ba0652ae13 100644 --- a/mayan/apps/acls/urls.py +++ b/mayan/apps/acls/urls.py @@ -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[-\w]+)/(?P[-\w]+)/(?P\d+)/$', 'acl_new_holder_for', (), 'acl_new_holder_for'), url(r'^list_for/(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/$', 'acl_list', (), 'acl_list'), url(r'^details/(?P[.\w]+)/holder/(?P[.\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'), - ) diff --git a/mayan/apps/checkouts/urls.py b/mayan/apps/checkouts/urls.py index 0ac93964b7..58db5ca66b 100644 --- a/mayan/apps/checkouts/urls.py +++ b/mayan/apps/checkouts/urls.py @@ -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\d+)/check/out/$', 'checkout_document', (), 'checkout_document'), url(r'^(?P\d+)/check/in/$', 'checkin_document', (), 'checkin_document'), url(r'^(?P\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[0-9]+)/$', APICheckedoutDocumentView.as_view(), name='checkedout-document-view'), ) diff --git a/mayan/apps/common/forms.py b/mayan/apps/common/forms.py index 84de49539e..d6608840e0 100644 --- a/mayan/apps/common/forms.py +++ b/mayan/apps/common/forms.py @@ -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) diff --git a/mayan/apps/common/urls.py b/mayan/apps/common/urls.py index 4790c87841..86d7ff12c3 100644 --- a/mayan/apps/common/urls.py +++ b/mayan/apps/common/urls.py @@ -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'), ) diff --git a/mayan/apps/django_gpg/api.py b/mayan/apps/django_gpg/api.py index aeb79514b9..9f0403ac8b 100644 --- a/mayan/apps/django_gpg/api.py +++ b/mayan/apps/django_gpg/api.py @@ -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. diff --git a/mayan/apps/django_gpg/urls.py b/mayan/apps/django_gpg/urls.py index bdeb7a9c51..dc172041a4 100644 --- a/mayan/apps/django_gpg/urls.py +++ b/mayan/apps/django_gpg/urls.py @@ -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.+)/(?P\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'), diff --git a/mayan/apps/document_acls/urls.py b/mayan/apps/document_acls/urls.py index a3ac0c4127..dc2f264f79 100644 --- a/mayan/apps/document_acls/urls.py +++ b/mayan/apps/document_acls/urls.py @@ -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\d+)/$', 'document_acl_list', (), 'document_acl_list'), ) diff --git a/mayan/apps/document_comments/urls.py b/mayan/apps/document_comments/urls.py index 88042839c9..2d2f2cae2f 100644 --- a/mayan/apps/document_comments/urls.py +++ b/mayan/apps/document_comments/urls.py @@ -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\d+)/delete/$', 'comment_delete', (), 'comment_delete'), url(r'^comment/multiple/delete/$', 'comment_multiple_delete', (), 'comment_multiple_delete'), url(r'^(?P\d+)/comment/add/$', 'comment_add', (), 'comment_add'), diff --git a/mayan/apps/document_indexing/admin.py b/mayan/apps/document_indexing/admin.py index 4a1c4bf42f..6c32a8ce3b 100644 --- a/mayan/apps/document_indexing/admin.py +++ b/mayan/apps/document_indexing/admin.py @@ -24,6 +24,3 @@ class IndexAdmin(admin.ModelAdmin): admin.site.register(Index, IndexAdmin) - - - diff --git a/mayan/apps/document_indexing/urls.py b/mayan/apps/document_indexing/urls.py index dc0147afa6..4895703df4 100644 --- a/mayan/apps/document_indexing/urls.py +++ b/mayan/apps/document_indexing/urls.py @@ -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\d+)/edit/$', 'index_setup_edit', (), 'index_setup_edit'), @@ -28,7 +29,8 @@ urlpatterns = patterns('document_indexing.views', url(r'^list/for/document/(?P\d+)/$', 'document_index_list', (), 'document_index_list'), ) -api_urls = patterns('', +api_urls = patterns( + '', url(r'^index/node/(?P[0-9]+)/documents/$', APIIndexNodeInstanceDocumentListView.as_view(), name='index-node-documents'), url(r'^index/template/(?P[0-9]+)/$', APIIndexTemplateView.as_view(), name='index-template-detail'), url(r'^indexes/(?P[0-9]+)/$', APIIndexView.as_view(), name='index-detail'), diff --git a/mayan/apps/document_signatures/urls.py b/mayan/apps/document_signatures/urls.py index 9996f23fe6..3651d40107 100644 --- a/mayan/apps/document_signatures/urls.py +++ b/mayan/apps/document_signatures/urls.py @@ -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\d+)/$', 'document_verify', (), 'document_verify'), url(r'^upload/signature/(?P\d+)/$', 'document_signature_upload', (), 'document_signature_upload'), url(r'^download/signature/(?P\d+)/$', 'document_signature_download', (), 'document_signature_download'), diff --git a/mayan/apps/document_states/south_migrations/0004_auto__del_field_workflowinstancelogentry_document__del_field_workflowi.py b/mayan/apps/document_states/south_migrations/0004_auto__del_field_workflowinstancelogentry_document__del_field_workflowi.py index cad6ec63a4..d78cb33f4d 100644 --- a/mayan/apps/document_states/south_migrations/0004_auto__del_field_workflowinstancelogentry_document__del_field_workflowi.py +++ b/mayan/apps/document_states/south_migrations/0004_auto__del_field_workflowinstancelogentry_document__del_field_workflowi.py @@ -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.") diff --git a/mayan/apps/document_states/urls.py b/mayan/apps/document_states/urls.py index 7aae2fd723..6141eb3488 100644 --- a/mayan/apps/document_states/urls.py +++ b/mayan/apps/document_states/urls.py @@ -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\d+)/edit/$', SetupWorkflowEditView.as_view(), name='setup_workflow_edit'), @@ -33,6 +34,7 @@ urlpatterns = patterns('', url(r'^document/workflows/(?P\d+)/transition/$', WorkflowInstanceTransitionView.as_view(), name='workflow_instance_transition'), ) -urlpatterns += patterns('document_states.views', +urlpatterns += patterns( + 'document_states.views', url(r'^setup/(?P\d+)/document_types/$', 'setup_workflow_document_types', name='setup_workflow_document_types'), ) diff --git a/mayan/apps/documents/south_migrations/0026_auto__add_field_document_label.py b/mayan/apps/documents/south_migrations/0026_auto__add_field_document_label.py index f1c91d4507..c4da8e0910 100644 --- a/mayan/apps/documents/south_migrations/0026_auto__add_field_document_label.py +++ b/mayan/apps/documents/south_migrations/0026_auto__add_field_document_label.py @@ -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'}, diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 3ec218acff..51cc15c789 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -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\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[0-9]+)/$', APIDocumentView.as_view(), name='document-detail'), diff --git a/mayan/apps/dynamic_search/urls.py b/mayan/apps/dynamic_search/urls.py index cc635bde0a..20ec32cb06 100644 --- a/mayan/apps/dynamic_search/urls.py +++ b/mayan/apps/dynamic_search/urls.py @@ -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[0-9]+)/$', APIRecentSearchView.as_view(), name='recentsearch-detail'), url(r'^search/$', APISearchView.as_view(), name='search-view'), diff --git a/mayan/apps/events/urls.py b/mayan/apps/events/urls.py index 5d7d9ceb0d..0d0a13e2a2 100644 --- a/mayan/apps/events/urls.py +++ b/mayan/apps/events/urls.py @@ -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[\w\-]+)/(?P[\w\-]+)/(?P\d+)/$', 'events_list', (), 'events_for_object'), url(r'^by_verb/(?P[\w\-]+)/$', 'events_list', (), 'events_by_verb'), diff --git a/mayan/apps/folders/urls.py b/mayan/apps/folders/urls.py index 44c4e14728..2aacaf5ead 100644 --- a/mayan/apps/folders/urls.py +++ b/mayan/apps/folders/urls.py @@ -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\d+)/edit/$', 'folder_edit', (), 'folder_edit'), @@ -23,7 +24,8 @@ urlpatterns = patterns('folders.views', url(r'^(?P\d+)/acl/list/$', 'folder_acl_list', (), 'folder_acl_list'), ) -api_urls = patterns('', +api_urls = patterns( + '', url(r'^folders/(?P[0-9]+)/documents/(?P[0-9]+)/$', APIFolderDocumentView.as_view(), name='folder-document'), url(r'^folders/(?P[0-9]+)/documents/$', APIFolderDocumentListView.as_view(), name='folder-document-list'), url(r'^folders/(?P[0-9]+)/$', APIFolderView.as_view(), name='folder-detail'), diff --git a/mayan/apps/installation/__init__.py b/mayan/apps/installation/__init__.py index d88d725880..aba9413b96 100644 --- a/mayan/apps/installation/__init__.py +++ b/mayan/apps/installation/__init__.py @@ -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 _ diff --git a/mayan/apps/installation/models.py b/mayan/apps/installation/models.py index a1165f33bd..eac5bf9aab 100644 --- a/mayan/apps/installation/models.py +++ b/mayan/apps/installation/models.py @@ -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): diff --git a/mayan/apps/installation/south_migrations/0003_auto__del_field_installation_is_first_run.py b/mayan/apps/installation/south_migrations/0003_auto__del_field_installation_is_first_run.py index 9c585a1940..c968023f57 100644 --- a/mayan/apps/installation/south_migrations/0003_auto__del_field_installation_is_first_run.py +++ b/mayan/apps/installation/south_migrations/0003_auto__del_field_installation_is_first_run.py @@ -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'}, @@ -27,4 +24,4 @@ class Migration(SchemaMigration): } } - complete_apps = ['installation'] \ No newline at end of file + complete_apps = ['installation'] diff --git a/mayan/apps/installation/urls.py b/mayan/apps/installation/urls.py index 198f846238..42b8faa471 100644 --- a/mayan/apps/installation/urls.py +++ b/mayan/apps/installation/urls.py @@ -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\w+)/details/$', 'namespace_details', (), 'namespace_details'), ) diff --git a/mayan/apps/linking/urls.py b/mayan/apps/linking/urls.py index 5fcf0efb56..6d48fd424c 100644 --- a/mayan/apps/linking/urls.py +++ b/mayan/apps/linking/urls.py @@ -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\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'), diff --git a/mayan/apps/lock_manager/tests.py b/mayan/apps/lock_manager/tests.py index 4235064cef..1700018683 100644 --- a/mayan/apps/lock_manager/tests.py +++ b/mayan/apps/lock_manager/tests.py @@ -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() diff --git a/mayan/apps/mailer/urls.py b/mayan/apps/mailer/urls.py index 73b5ecdaf6..58beb532ed 100644 --- a/mayan/apps/mailer/urls.py +++ b/mayan/apps/mailer/urls.py @@ -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\d+)/send/link/$', 'send_document_link', (), 'send_document_link'), url(r'^(?P\d+)/send/document/$', 'send_document_link', {'as_attachment': True}, 'send_document'), ) diff --git a/mayan/apps/main/urls.py b/mayan/apps/main/urls.py index da01eb515d..bc9390ed36 100644 --- a/mayan/apps/main/urls.py +++ b/mayan/apps/main/urls.py @@ -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'))), ) diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index afa2a3bef7..726efc8631 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -10,7 +10,8 @@ from .api_views import ( APIMetadataTypeView ) -urlpatterns = patterns('metadata.views', +urlpatterns = patterns( + 'metadata.views', url(r'^(?P\d+)/edit/$', 'metadata_edit', (), 'metadata_edit'), url(r'^(?P\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[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail'), url(r'^document/metadata/(?P[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'), diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py deleted file mode 100644 index 543900387d..0000000000 --- a/mayan/apps/navigation/classes.py +++ /dev/null @@ -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) diff --git a/mayan/apps/ocr/urls.py b/mayan/apps/ocr/urls.py index 629f9e9888..983dd167d5 100644 --- a/mayan/apps/ocr/urls.py +++ b/mayan/apps/ocr/urls.py @@ -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\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'), ) diff --git a/mayan/apps/permissions/urls.py b/mayan/apps/permissions/urls.py index 82378035bb..cf47ff6c38 100644 --- a/mayan/apps/permissions/urls.py +++ b/mayan/apps/permissions/urls.py @@ -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\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[0-9]+)/$', APIRoleView.as_view(), name='role-detail'), ) diff --git a/mayan/apps/permissions/widgets.py b/mayan/apps/permissions/widgets.py index c907bc6cb5..a93480d2a3 100644 --- a/mayan/apps/permissions/widgets.py +++ b/mayan/apps/permissions/widgets.py @@ -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')}) diff --git a/mayan/apps/project_setup/urls.py b/mayan/apps/project_setup/urls.py index 5ff8a557f5..985bca0708 100644 --- a/mayan/apps/project_setup/urls.py +++ b/mayan/apps/project_setup/urls.py @@ -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'), ) diff --git a/mayan/apps/project_tools/urls.py b/mayan/apps/project_tools/urls.py index 81725db780..758254eca8 100644 --- a/mayan/apps/project_tools/urls.py +++ b/mayan/apps/project_tools/urls.py @@ -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'), ) diff --git a/mayan/apps/rest_api/classes.py b/mayan/apps/rest_api/classes.py index b93dffb2d7..f1010d2c77 100644 --- a/mayan/apps/rest_api/classes.py +++ b/mayan/apps/rest_api/classes.py @@ -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)), ) diff --git a/mayan/apps/rest_api/urls.py b/mayan/apps/rest_api/urls.py index 90841a6a2f..19c12f5688 100644 --- a/mayan/apps/rest_api/urls.py +++ b/mayan/apps/rest_api/urls.py @@ -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\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'), ) diff --git a/mayan/apps/smart_settings/urls.py b/mayan/apps/smart_settings/urls.py index 3547651fa8..02028cb272 100644 --- a/mayan/apps/smart_settings/urls.py +++ b/mayan/apps/smart_settings/urls.py @@ -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'), ) diff --git a/mayan/apps/sources/urls.py b/mayan/apps/sources/urls.py index 3a86e01007..de92adc095 100644 --- a/mayan/apps/sources/urls.py +++ b/mayan/apps/sources/urls.py @@ -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\d+)/(?P.+)/delete/$', 'staging_file_delete', name='staging_file_delete'), url(r'^upload/document/new/interactive/(?P\d+)/$', UploadInteractiveView.as_view(), name='upload_interactive'), @@ -36,7 +37,8 @@ urlpatterns = patterns('sources.views', url(r'^(?P\d+)/create/siblings/$', 'document_create_siblings', (), 'document_create_siblings'), ) -api_urls = patterns('', +api_urls = patterns( + '', url(r'^staging_folders/file/(?P[0-9]+)/(?P.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'), url(r'^staging_folders/file/(?P[0-9]+)/(?P.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'), url(r'^staging_folders/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'), diff --git a/mayan/apps/statistics/urls.py b/mayan/apps/statistics/urls.py index daabcba2d4..5de5b71ef9 100644 --- a/mayan/apps/statistics/urls.py +++ b/mayan/apps/statistics/urls.py @@ -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\w+)/details/$', 'namespace_details', name='namespace_details'), url(r'^(?P\w+)/execute/$', 'execute', name='execute'), diff --git a/mayan/apps/tags/urls.py b/mayan/apps/tags/urls.py index 753bb5a240..e83c7f3982 100644 --- a/mayan/apps/tags/urls.py +++ b/mayan/apps/tags/urls.py @@ -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\d+)/delete/$', 'tag_delete', (), 'tag_delete'), @@ -27,7 +28,8 @@ urlpatterns = patterns('tags.views', url(r'^(?P\d+)/acl/list/$', 'tag_acl_list', (), 'tag_acl_list'), ) -api_urls = patterns('', +api_urls = patterns( + '', url(r'^tags/(?P[0-9]+)/documents/$', APITagDocumentListView.as_view(), name='tag-document-list'), url(r'^tags/(?P[0-9]+)/$', APITagView.as_view(), name='tag-detail'), url(r'^tags/$', APITagListView.as_view(), name='tag-list'), diff --git a/mayan/apps/user_management/urls.py b/mayan/apps/user_management/urls.py index 946e9fe6dd..b128a334ef 100644 --- a/mayan/apps/user_management/urls.py +++ b/mayan/apps/user_management/urls.py @@ -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\d+)/edit/$', 'user_edit', (), 'user_edit'), @@ -25,7 +26,8 @@ urlpatterns = patterns('user_management.views', url(r'^group/(?P\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[0-9]+)/$', APIGroupView.as_view(), name='group-detail'), url(r'^users/$', APIUserListView.as_view(), name='user-list'), diff --git a/mayan/settings/travis/base.py b/mayan/settings/travis/base.py index aa39d38640..1c0362f4e9 100644 --- a/mayan/settings/travis/base.py +++ b/mayan/settings/travis/base.py @@ -1,6 +1,6 @@ from __future__ import absolute_import, unicode_literals -from .. import * +from .. import * # NOQA LOGGING = { 'version': 1, @@ -17,27 +17,27 @@ LOGGING = { }, }, 'handlers': { - 'console':{ - 'level':'DEBUG', - 'class':'logging.StreamHandler', + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', 'formatter': 'intermediate' } }, 'loggers': { 'documents': { - 'handlers':['console'], + 'handlers': ['console'], 'propagate': True, - 'level':'DEBUG', + 'level': 'DEBUG', }, 'converter': { - 'handlers':['console'], + 'handlers': ['console'], 'propagate': True, - 'level':'DEBUG', + 'level': 'DEBUG', }, 'ocr': { - 'handlers':['console'], + 'handlers': ['console'], 'propagate': True, - 'level':'DEBUG', + 'level': 'DEBUG', }, } } diff --git a/mayan/settings/travis/db_mysql.py b/mayan/settings/travis/db_mysql.py index 4e7a48a743..62a4fef251 100644 --- a/mayan/settings/travis/db_mysql.py +++ b/mayan/settings/travis/db_mysql.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from .base import * +from .base import * # NOQA DATABASES = { 'default': { diff --git a/mayan/settings/travis/db_postgres.py b/mayan/settings/travis/db_postgres.py index 70f10af28f..cccc43a58d 100644 --- a/mayan/settings/travis/db_postgres.py +++ b/mayan/settings/travis/db_postgres.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from .base import * +from .base import * # NOQA DATABASES = { 'default': { diff --git a/mayan/urls.py b/mayan/urls.py index e44e6f7e31..13a1170587 100644 --- a/mayan/urls.py +++ b/mayan/urls.py @@ -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')),