diff --git a/apps/acls/__init__.py b/apps/acls/__init__.py index af8531ae90..17088b0e3e 100644 --- a/apps/acls/__init__.py +++ b/apps/acls/__init__.py @@ -6,7 +6,7 @@ from project_setup.api import register_setup from .classes import (AccessHolder, AccessObjectClass, ClassAccessHolder, AccessObject) -from .links import (acl_list, acl_detail, acl_grant, acl_revoke, +from .links import (acl_detail, acl_grant, acl_revoke, acl_holder_new, acl_setup_valid_classes, acl_class_list, acl_class_acl_list, acl_class_acl_detail, acl_class_new_holder_for, acl_class_grant, acl_class_revoke) diff --git a/apps/acls/managers.py b/apps/acls/managers.py index 6e27dd11e1..237561305f 100644 --- a/apps/acls/managers.py +++ b/apps/acls/managers.py @@ -76,7 +76,7 @@ class AccessEntryManager(models.Manager): actor = AnonymousUserSingleton.objects.passthru_check(actor) try: - content_type=ContentType.objects.get_for_model(obj) + content_type = ContentType.objects.get_for_model(obj) except AttributeError: # Object doesn't have a content type, therefore allow access return True diff --git a/apps/bootstrap/__init__.py b/apps/bootstrap/__init__.py index 1917e950b3..ac50d1e698 100644 --- a/apps/bootstrap/__init__.py +++ b/apps/bootstrap/__init__.py @@ -1,8 +1,8 @@ from __future__ import absolute_import from project_setup.api import register_setup -from navigation.api import bind_links#, register_sidebar_template - +from navigation.api import bind_links + from .links import database_bootstrap, bootstrap_execute, erase_database_link from .api import BootstrapSimple, BootstrapPermit diff --git a/apps/bootstrap/api.py b/apps/bootstrap/api.py index 239d3154e0..9f9f37fd7c 100644 --- a/apps/bootstrap/api.py +++ b/apps/bootstrap/api.py @@ -7,7 +7,6 @@ from django.contrib.auth.models import User, Group from permissions.models import Role from documents.models import DocumentType, DocumentTypeFilename, Document from metadata.models import MetadataType, MetadataSet -from metadata.api import save_metadata_list from document_indexing.models import Index, IndexTemplateNode from sources.models import WebForm, StagingFolder from ocr.models import QueueDocument, QueueTransformation, DocumentQueue @@ -90,11 +89,11 @@ def nuke_database(): # Delete all foders for obj in Folder.objects.all(): - obj.delete() + obj.delete() # Delete all recent searches for obj in RecentSearch.objects.all(): - obj.delete() + obj.delete() # Clear the entire key ring (public and private keys) gpg.delete_all_keys() @@ -107,21 +106,21 @@ class BootstrapBase(object): def __unicode__(self): return unicode(self.label) - + class BootstrapSimple(BootstrapBase): name = 'simple' label = _(u'Simple') description = _(u'A simple setup providing an uploaded date metadata and index plus an alphabetic index based on document filenames.') - + def execute(self): # Create metadata types upload_date = MetadataType.objects.create(name='upload_date', title=ugettext(u'Upload date'), default='current_date()') - + # Create a segmented date index index = Index.objects.create(name='date_tree', title=ugettext(u'Segmented date index'), enabled=True) template_root = index.template_root - + # Create index template node1 = IndexTemplateNode.objects.create(parent=template_root, index=index, expression='metadata.upload_date[0:4]', enabled=True, link_documents=False) node2 = IndexTemplateNode.objects.create(parent=node1, index=index, expression='metadata.upload_date[5:7]', enabled=True, link_documents=False) @@ -132,7 +131,7 @@ class BootstrapPermit(BootstrapBase): name = 'permits' label = _(u'Permits') description = _(u'A setup for handling permits and related documents.') - + def execute(self): # Create document types form = DocumentType.objects.create(name=ugettext(u'Form')) @@ -142,17 +141,17 @@ class BootstrapPermit(BootstrapBase): blueprint = DocumentType.objects.create(name=ugettext(u'Blueprint')) DocumentTypeFilename.objects.create(document_type=blueprint, filename=ugettext(u'Floorplan')) DocumentTypeFilename.objects.create(document_type=blueprint, filename=ugettext(u'Plot plan')) - + # Create metadata types date = MetadataType.objects.create(name='date', title=ugettext(u'Date'), default='current_date()') client = MetadataType.objects.create(name='client', title=ugettext(u'Client')) permit = MetadataType.objects.create(name='permit', title=ugettext(u'Permit number')) project = MetadataType.objects.create(name='project', title=ugettext(u'Project')) user = MetadataType.objects.create(name='user', title=ugettext(u'User'), lookup='sorted([user.get_full_name() or user for user in User.objects.all() if user.is_active])') - + # Create a segmented date index index = Index.objects.create(name='main_index', title=ugettext(u'Permit index'), enabled=True) - + # Create index template per_permit = IndexTemplateNode.objects.create(parent=index.template_root, index=index, expression='\'%s\'' % ugettext(u'Per permit'), enabled=True, link_documents=False) per_permit_child = IndexTemplateNode.objects.create(parent=per_permit, index=index, expression='metadata.permit', enabled=True, link_documents=True) @@ -170,7 +169,7 @@ class BootstrapPermit(BootstrapBase): per_client = IndexTemplateNode.objects.create(parent=index.template_root, index=index, expression='\'%s\'' % ugettext(u'Per client'), enabled=True, link_documents=False) per_client_child = IndexTemplateNode.objects.create(parent=per_client, index=index, expression='metadata.client', enabled=True, link_documents=True) - + for bootstrap in [BootstrapSimple(), BootstrapPermit()]: bootstrap_options[bootstrap.name] = bootstrap diff --git a/apps/bootstrap/links.py b/apps/bootstrap/links.py index 243eb1ce6c..32528aec67 100644 --- a/apps/bootstrap/links.py +++ b/apps/bootstrap/links.py @@ -2,8 +2,10 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE +from navigation.api import Link -database_bootstrap = {'text': _(u'bootstrap database'), 'view': 'bootstrap_type_list', 'icon': 'database_lightning.png', 'permissions': [PERMISSION_BOOTSTRAP_EXECUTE]} -bootstrap_execute = {'text': _(u'execute'), 'view': 'bootstrap_execute', 'args': 'object.name', 'sprite': 'database_lightning.png', 'permissions': [PERMISSION_BOOTSTRAP_EXECUTE]} -erase_database_link = {'text': _(u'erase database'), 'view': 'erase_database_view', 'icon': 'radioactivity.png', 'permissions': [PERMISSION_NUKE_DATABASE]} +from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE + +database_bootstrap = Link(text=_(u'bootstrap database'), view='bootstrap_type_list', icon='database_lightning.png', permissions=[PERMISSION_BOOTSTRAP_EXECUTE]) +bootstrap_execute = Link(text=_(u'execute'), view='bootstrap_execute', args='object.name', sprite='database_lightning.png', permissions=[PERMISSION_BOOTSTRAP_EXECUTE]) +erase_database_link = Link(text=_(u'erase database'), view='erase_database_view', icon='radioactivity.png', permissions=[PERMISSION_NUKE_DATABASE]) diff --git a/apps/bootstrap/permissions.py b/apps/bootstrap/permissions.py index aef9f052ee..46955433c6 100644 --- a/apps/bootstrap/permissions.py +++ b/apps/bootstrap/permissions.py @@ -8,4 +8,3 @@ namespace = PermissionNamespace('bootstrap', _(u'Database bootstrap')) PERMISSION_BOOTSTRAP_EXECUTE = Permission.objects.register(namespace, 'bootstrap_execute', _(u'Execute document bootstraps')) PERMISSION_NUKE_DATABASE = Permission.objects.register(namespace, 'nuke_database', _(u'Erase the entire database and document storage')) - diff --git a/apps/bootstrap/views.py b/apps/bootstrap/views.py index d1233576eb..db64511a81 100644 --- a/apps/bootstrap/views.py +++ b/apps/bootstrap/views.py @@ -2,7 +2,7 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from django.http import HttpResponseRedirect -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import render_to_response from django.template import RequestContext from django.contrib import messages from django.core.urlresolvers import reverse @@ -10,12 +10,12 @@ from django.core.urlresolvers import reverse from permissions.models import Permission from .api import bootstrap_options, nuke_database -from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE +from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE def bootstrap_type_list(request): Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE]) - + context = { 'object_list': bootstrap_options.values(), 'title': _(u'database bootstrap setups'), @@ -32,7 +32,7 @@ def bootstrap_type_list(request): def bootstrap_execute(request, bootstrap_name): Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE]) bootstrap = bootstrap_options[bootstrap_name] - + post_action_redirect = reverse('bootstrap_type_list') previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) @@ -90,4 +90,4 @@ def erase_database_view(request): context['message'] = _(u'All documents, sources, metadata, metadata types, set, tags, indexes and logs will be lost irreversibly!') return render_to_response('generic_confirm.html', context, - context_instance=RequestContext(request)) + context_instance=RequestContext(request)) diff --git a/apps/checkouts/__init__.py b/apps/checkouts/__init__.py index 586b43ca86..f176cfa01a 100644 --- a/apps/checkouts/__init__.py +++ b/apps/checkouts/__init__.py @@ -2,13 +2,10 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from navigation.api import (bind_links, register_top_menu, - register_model_list_columns, - register_sidebar_template, Link) +from navigation.api import bind_links, register_top_menu from scheduler.api import register_interval_job from documents.models import Document -from documents.permissions import PERMISSION_DOCUMENT_VIEW from acls.api import class_permissions from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, @@ -37,6 +34,6 @@ class_permissions(Document, [ PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE ]) -CHECK_EXPIRED_CHECK_OUTS_INTERVAL=60 # Lowest check out expiration allowed +CHECK_EXPIRED_CHECK_OUTS_INTERVAL = 60 # Lowest check out expiration allowed register_interval_job('task_check_expired_check_outs', _(u'Check expired check out documents and checks them in.'), task_check_expired_check_outs, seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL) initialize_document_checkout_extra_methods() diff --git a/apps/checkouts/exceptions.py b/apps/checkouts/exceptions.py index e27b9645de..c0119f6d7e 100644 --- a/apps/checkouts/exceptions.py +++ b/apps/checkouts/exceptions.py @@ -3,7 +3,8 @@ class DocumentNotCheckedOut(Exception): Raised when trying to checkin a document that is not checkedout """ pass - + + class DocumentAlreadyCheckedOut(Exception): """ Raised when trying to checkout an already checkedout document diff --git a/apps/checkouts/forms.py b/apps/checkouts/forms.py index 80fb3091f9..ab7ba14594 100644 --- a/apps/checkouts/forms.py +++ b/apps/checkouts/forms.py @@ -1,7 +1,6 @@ from __future__ import absolute_import from django import forms -from django.utils.translation import ugettext_lazy as _ from .models import DocumentCheckout from .exceptions import DocumentAlreadyCheckedOut @@ -17,7 +16,7 @@ class DocumentCheckoutForm(forms.ModelForm): widgets = { 'document': forms.widgets.HiddenInput(), - } + } def clean_document(self): document = self.cleaned_data['document'] diff --git a/apps/checkouts/links.py b/apps/checkouts/links.py index 516bcdb940..eea20d9ac0 100644 --- a/apps/checkouts/links.py +++ b/apps/checkouts/links.py @@ -2,7 +2,6 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from documents.permissions import PERMISSION_DOCUMENT_VIEW from navigation.api import Link from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE) diff --git a/apps/checkouts/managers.py b/apps/checkouts/managers.py index 7a8f5c9cd1..f6add72fe3 100644 --- a/apps/checkouts/managers.py +++ b/apps/checkouts/managers.py @@ -22,7 +22,7 @@ logger = logging.getLogger(__name__) class DocumentCheckoutManager(models.Manager): def checked_out_documents(self): return Document.objects.filter(pk__in=self.model.objects.all().values_list('document__pk', flat=True)) - + def expired_check_outs(self): expired_list = Document.objects.filter(pk__in=self.model.objects.filter(expiration_datetime__lte=datetime.datetime.now()).values_list('document__pk', flat=True)) logger.debug('expired_list: %s' % expired_list) @@ -37,7 +37,7 @@ class DocumentCheckoutManager(models.Manager): return True else: return False - + def check_in_document(self, document, user=None): try: document_checkout = self.model.objects.get(document=document) @@ -51,9 +51,9 @@ class DocumentCheckoutManager(models.Manager): history_document_checked_in.commit(source_object=document, data={'user': user, 'document': document}) else: history_document_auto_checked_in.commit(source_object=document, data={'document': document}) - + document_checkout.delete() - + def document_checkout_info(self, document): try: return self.model.objects.get(document=document) @@ -93,7 +93,6 @@ class DocumentCheckoutManager(models.Manager): # Last resort check if original user enabled restriction return not checkout_info.block_new_version else: - return True + return True else: - return True - + return True diff --git a/apps/checkouts/models.py b/apps/checkouts/models.py index dc9b208186..d595864c8b 100644 --- a/apps/checkouts/models.py +++ b/apps/checkouts/models.py @@ -3,7 +3,7 @@ from __future__ import absolute_import import logging import datetime -from django.db import models, IntegrityError +from django.db import models from django.utils.translation import ugettext_lazy as _ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic @@ -11,7 +11,6 @@ from django.contrib.contenttypes import generic from documents.models import Document from .managers import DocumentCheckoutManager -from .exceptions import DocumentAlreadyCheckedOut from .events import history_document_checked_out logger = logging.getLogger(__name__) @@ -33,9 +32,9 @@ class DocumentCheckout(models.Model): #block_metadata #block_editing #block tag add/remove - + objects = DocumentCheckoutManager() - + def __unicode__(self): return unicode(self.document) @@ -45,11 +44,11 @@ class DocumentCheckout(models.Model): result = super(DocumentCheckout, self).save(*args, **kwargs) history_document_checked_out.commit(source_object=self.document, data={'user': self.user_object, 'document': self.document}) return result - + @models.permalink def get_absolute_url(self): - return ('checkout_info', [self.document.pk]) - + return ('checkout_info', [self.document.pk]) + class Meta: verbose_name = _(u'document checkout') verbose_name_plural = _(u'document checkouts') diff --git a/apps/checkouts/permissions.py b/apps/checkouts/permissions.py index 19430381b8..415c197c29 100644 --- a/apps/checkouts/permissions.py +++ b/apps/checkouts/permissions.py @@ -10,4 +10,3 @@ PERMISSION_DOCUMENT_CHECKOUT = Permission.objects.register(namespace, 'checkout_ PERMISSION_DOCUMENT_CHECKIN = Permission.objects.register(namespace, 'checkin_document', _(u'Check in documents')) PERMISSION_DOCUMENT_CHECKIN_OVERRIDE = Permission.objects.register(namespace, 'checkin_document_override', _(u'Forcefully check in documents')) PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE = Permission.objects.register(namespace, 'checkout_restrictions_override', _(u'Allow overriding check out restrictions')) - diff --git a/apps/checkouts/views.py b/apps/checkouts/views.py index ace4a14085..5603856d81 100644 --- a/apps/checkouts/views.py +++ b/apps/checkouts/views.py @@ -21,7 +21,6 @@ from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHEC PERMISSION_DOCUMENT_CHECKIN_OVERRIDE) from .forms import DocumentCheckoutForm from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut -from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS from .widgets import checkout_widget @@ -56,12 +55,12 @@ def checkout_info(request, document_pk): paragraphs.append(_(u'Check out time: %s') % checkout_info.checkout_datetime) paragraphs.append(_(u'Check out expiration: %s') % checkout_info.expiration_datetime) paragraphs.append(_(u'New versions allowed: %s') % (_(u'yes') if not checkout_info.block_new_version else _(u'no'))) - + return render_to_response('generic_template.html', { 'paragraphs': paragraphs, 'object': document, 'title': _(u'Check out details for document: %s') % document - }, context_instance=RequestContext(request)) + }, context_instance=RequestContext(request)) def checkout_document(request, document_pk): @@ -70,7 +69,7 @@ def checkout_document(request, document_pk): Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKOUT]) except PermissionDenied: AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKOUT, request.user, document) - + if request.method == 'POST': form = DocumentCheckoutForm(data=request.POST, initial={'document': document}) try: @@ -94,7 +93,7 @@ def checkout_document(request, document_pk): 'form': form, 'object': document, 'title': _(u'Check out document: %s') % document - }, context_instance=RequestContext(request)) + }, context_instance=RequestContext(request)) def checkin_document(request, document_pk): diff --git a/apps/checkouts/widgets.py b/apps/checkouts/widgets.py index cd5f3d8f70..b71bbb6d40 100644 --- a/apps/checkouts/widgets.py +++ b/apps/checkouts/widgets.py @@ -8,7 +8,7 @@ from django.utils.safestring import mark_safe from django.conf import settings from django.core import validators -from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS +from .literals import STATE_ICONS, STATE_LABELS def checkout_widget(document): @@ -27,9 +27,9 @@ class SplitDeltaWidget(forms.widgets.MultiWidget): """ def __init__(self, attrs=None): widgets = ( - forms.widgets.TextInput(attrs={'maxlength': 3, 'style':'width: 5em;', 'placeholder': _(u'Days')}), - forms.widgets.TextInput(attrs={'maxlength': 4, 'style':'width: 5em;', 'placeholder': _(u'Hours')}), - forms.widgets.TextInput(attrs={'maxlength': 5, 'style':'width: 5em;', 'placeholder': _(u'Minutes')}), + forms.widgets.TextInput(attrs={'maxlength': 3, 'style': 'width: 5em;', 'placeholder': _(u'Days')}), + forms.widgets.TextInput(attrs={'maxlength': 4, 'style': 'width: 5em;', 'placeholder': _(u'Hours')}), + forms.widgets.TextInput(attrs={'maxlength': 5, 'style': 'width: 5em;', 'placeholder': _(u'Minutes')}), ) super(SplitDeltaWidget, self).__init__(widgets, attrs) @@ -49,7 +49,7 @@ class SplitHiddenDeltaWidget(forms.widgets.SplitDateTimeWidget): is_hidden = True def __init__(self, attrs=None): - super(SplitHiddenDeltaWidget, self).__init__(attrs, date_format, time_format) + super(SplitHiddenDeltaWidget, self).__init__(attrs) for widget in self.widgets: widget.input_type = 'hidden' widget.is_hidden = True @@ -73,15 +73,15 @@ class SplitTimeDeltaField(forms.MultiValueField): fields = ( forms.IntegerField(min_value=0, error_messages={'invalid': errors['invalid_days']}, - localize=localize + localize=localize ), forms.IntegerField(min_value=0, error_messages={'invalid': errors['invalid_hours']}, - localize=localize + localize=localize ), forms.IntegerField(min_value=0, error_messages={'invalid': errors['invalid_minutes']}, - localize=localize + localize=localize ), ) super(SplitTimeDeltaField, self).__init__(fields, *args, **kwargs) @@ -91,7 +91,7 @@ class SplitTimeDeltaField(forms.MultiValueField): def compress(self, data_list): if data_list == [0, 0, 0]: raise forms.ValidationError(self.error_messages['invalid_timedelta']) - + if data_list: # Raise a validation error if time or date is empty # (possible if SplitDateTimeField has required=False). @@ -100,8 +100,8 @@ class SplitTimeDeltaField(forms.MultiValueField): if data_list[1] in validators.EMPTY_VALUES: raise forms.ValidationError(self.error_messages['invalid_hours']) if data_list[2] in validators.EMPTY_VALUES: - raise forms.ValidationError(self.error_messages['invalid_minutes']) - + raise forms.ValidationError(self.error_messages['invalid_minutes']) + timedelta = datetime.timedelta(days=data_list[0], hours=data_list[1], minutes=data_list[2]) return datetime.datetime.now() + timedelta return None diff --git a/apps/common/__init__.py b/apps/common/__init__.py index 14a6198e78..7e6320c8a7 100644 --- a/apps/common/__init__.py +++ b/apps/common/__init__.py @@ -7,7 +7,6 @@ from south.signals import post_migrate from django.utils.translation import ugettext_lazy as _ from django.contrib.auth import models as auth_models from django.contrib.auth.models import User -from django.contrib.auth.management import create_superuser from django.dispatch import receiver from django.conf import settings from django.db.models.signals import post_save diff --git a/apps/common/templatetags/autoadmin_tags.py b/apps/common/templatetags/autoadmin_tags.py index 1170d686f6..ee602a781a 100644 --- a/apps/common/templatetags/autoadmin_tags.py +++ b/apps/common/templatetags/autoadmin_tags.py @@ -1,5 +1,4 @@ from django.template import Library -from django.utils.importlib import import_module from common.models import AutoAdminSingleton diff --git a/apps/converter/api.py b/apps/converter/api.py index c09ce336aa..80001292cf 100644 --- a/apps/converter/api.py +++ b/apps/converter/api.py @@ -1,7 +1,6 @@ from __future__ import absolute_import import os -import subprocess import hashlib import logging diff --git a/apps/converter/office_converter.py b/apps/converter/office_converter.py index f2d80bc16d..46614839ac 100644 --- a/apps/converter/office_converter.py +++ b/apps/converter/office_converter.py @@ -6,11 +6,9 @@ import logging from mimetype.api import get_mimetype from common.conf.settings import TEMPORARY_DIRECTORY -from common.utils import id_generator from .conf.settings import LIBREOFFICE_PATH -from .exceptions import (OfficeConversionError, - OfficeBackendError, UnknownFileFormat) +from .exceptions import OfficeBackendError, UnknownFileFormat CACHED_FILE_SUFFIX = u'_office_converter' diff --git a/apps/django_gpg/__init__.py b/apps/django_gpg/__init__.py index 359a5fb146..0ec0dd4b86 100644 --- a/apps/django_gpg/__init__.py +++ b/apps/django_gpg/__init__.py @@ -1,14 +1,10 @@ from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ - -from navigation.api import bind_links, Link +from navigation.api import bind_links from project_setup.api import register_setup from hkp import Key as KeyServerKey from .api import Key -from .permissions import (PERMISSION_KEY_VIEW, PERMISSION_KEY_DELETE, - PERMISSION_KEYSERVER_QUERY, PERMISSION_KEY_RECEIVE) from .links import (private_keys, public_keys, key_delete, key_query, key_receive, key_setup) diff --git a/apps/django_gpg/api.py b/apps/django_gpg/api.py index fe61f77320..e1491c5f99 100644 --- a/apps/django_gpg/api.py +++ b/apps/django_gpg/api.py @@ -325,7 +325,7 @@ class GPG(object): # Delete secret keys first for key in Key.get_all(self, secret=True): self.delete_key(key) - + # Delete public keys for key in Key.get_all(self, secret=False): self.delete_key(key) diff --git a/apps/django_gpg/views.py b/apps/django_gpg/views.py index b390dee333..03fba78443 100644 --- a/apps/django_gpg/views.py +++ b/apps/django_gpg/views.py @@ -13,7 +13,7 @@ from common.utils import encapsulate from .api import Key from .runtime import gpg -from .exceptions import KeyFetchingError, KeyImportError +from .exceptions import KeyImportError from .forms import KeySearchForm from .permissions import (PERMISSION_KEY_VIEW, PERMISSION_KEY_DELETE, PERMISSION_KEYSERVER_QUERY, PERMISSION_KEY_RECEIVE) diff --git a/apps/document_comments/__init__.py b/apps/document_comments/__init__.py index ce806690e6..a4cc1b9e2d 100644 --- a/apps/document_comments/__init__.py +++ b/apps/document_comments/__init__.py @@ -5,7 +5,7 @@ from django.conf import settings from django.contrib.comments.models import Comment from django.contrib.contenttypes import generic -from navigation.api import bind_links, register_model_list_columns, Link +from navigation.api import bind_links, register_model_list_columns from common.utils import encapsulate from acls.api import class_permissions from documents.models import Document @@ -15,8 +15,7 @@ if 'django.contrib.comments' not in settings.INSTALLED_APPS: from .permissions import (PERMISSION_COMMENT_CREATE, PERMISSION_COMMENT_DELETE, PERMISSION_COMMENT_VIEW) -from .links import (comment_delete, comment_multiple_delete, comment_add, - comments_for_document) +from .links import (comment_delete, comment_add, comments_for_document) register_model_list_columns(Comment, [ { diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py index ef34e1e25a..be0fbb85d3 100644 --- a/apps/document_indexing/__init__.py +++ b/apps/document_indexing/__init__.py @@ -2,18 +2,15 @@ from __future__ import absolute_import import logging -from django.db.models.signals import pre_save, post_save, pre_delete from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ -from django.dispatch import receiver from django.db.models.signals import post_save, pre_delete, post_delete from navigation.api import (register_top_menu, register_sidebar_template, bind_links, Link) from main.api import register_maintenance_links -from documents.models import Document, DocumentVersion -from documents.permissions import PERMISSION_DOCUMENT_VIEW +from documents.models import Document from metadata.models import DocumentMetadata from project_setup.api import register_setup @@ -22,14 +19,7 @@ from .api import update_indexes, delete_indexes from .links import (index_setup, index_setup_list, index_setup_create, index_setup_edit, index_setup_delete, index_setup_view, template_node_create, template_node_edit, template_node_delete, - index_list, index_parent, document_index_list, rebuild_index_instances) -from .permissions import (PERMISSION_DOCUMENT_INDEXING_VIEW, - PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES, - PERMISSION_DOCUMENT_INDEXING_SETUP, - PERMISSION_DOCUMENT_INDEXING_CREATE, - PERMISSION_DOCUMENT_INDEXING_EDIT, - PERMISSION_DOCUMENT_INDEXING_DELETE -) + index_parent, document_index_list, rebuild_index_instances) logger = logging.getLogger(__name__) @@ -70,7 +60,7 @@ def document_metadata_index_update(sender, **kwargs): def document_metadata_index_delete(sender, **kwargs): # TODO: save result in index log delete_indexes(kwargs['instance'].document) - + @receiver(post_delete, dispatch_uid='document_metadata_index_post_delete', sender=DocumentMetadata) def document_metadata_index_post_delete(sender, **kwargs): diff --git a/apps/document_signatures/__init__.py b/apps/document_signatures/__init__.py index 226f3d32aa..e4e03435e1 100644 --- a/apps/document_signatures/__init__.py +++ b/apps/document_signatures/__init__.py @@ -7,12 +7,11 @@ try: except ImportError: from StringIO import StringIO -from django.utils.translation import ugettext_lazy as _ #from django.db.models.signals import post_save #from django.dispatch import receiver from documents.models import Document, DocumentVersion -from navigation.api import bind_links, Link +from navigation.api import bind_links from django_gpg.runtime import gpg from django_gpg.exceptions import GPGDecryptionError from acls.api import class_permissions diff --git a/apps/document_signatures/links.py b/apps/document_signatures/links.py index bb8551065b..655d8fb813 100644 --- a/apps/document_signatures/links.py +++ b/apps/document_signatures/links.py @@ -2,7 +2,6 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from documents.models import Document, DocumentVersion from navigation.api import Link from .models import DocumentVersionSignature diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 0fa24e0362..a96836593b 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -20,10 +20,7 @@ from .permissions import (PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VERSION_REVERT, - PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE, - PERMISSION_DOCUMENT_TOOLS) -from .conf.settings import ZOOM_MAX_LEVEL -from .conf.settings import ZOOM_MIN_LEVEL + PERMISSION_DOCUMENT_NEW_VERSION) from .conf import settings as document_settings from .widgets import document_thumbnail from .links import (document_list, document_list_recent, diff --git a/apps/documents/models.py b/apps/documents/models.py index 779221cbb7..6ab459fffc 100644 --- a/apps/documents/models.py +++ b/apps/documents/models.py @@ -547,7 +547,7 @@ class DocumentVersion(models.Model): def rename(self, new_name): new_filename, new_extension = os.path.splitext(new_name) name, extension = os.path.splitext(self.filename) - + # Preserve existing extension if new name doesn't has one if new_extension: extension = new_extension diff --git a/apps/dynamic_search/models.py b/apps/dynamic_search/models.py index 8227c963a0..561741cbc0 100644 --- a/apps/dynamic_search/models.py +++ b/apps/dynamic_search/models.py @@ -2,7 +2,6 @@ from __future__ import absolute_import import datetime -from django.db import connection from django.db import models from django.contrib.auth.models import User from django.core.urlresolvers import reverse diff --git a/apps/history/__init__.py b/apps/history/__init__.py index 14b8362344..fcb0b7edca 100644 --- a/apps/history/__init__.py +++ b/apps/history/__init__.py @@ -3,15 +3,13 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from project_tools.api import register_tool -from navigation.api import (bind_links, register_top_menu, - register_model_list_columns, - register_sidebar_template, Link) +from navigation.api import bind_links, register_model_list_columns from common.utils import encapsulate from .models import History -from .widgets import history_entry_summary, history_entry_type_link +from .widgets import history_entry_type_link from .links import history_list, history_details - + register_tool(history_list) register_model_list_columns(History, [ @@ -26,7 +24,7 @@ register_model_list_columns(History, [ { 'name': _(u'summary'), 'attribute': encapsulate(lambda entry: unicode(entry.get_processed_summary())) - } + } ]) bind_links([History], [history_details]) diff --git a/apps/history/api.py b/apps/history/api.py index c46603da4f..1657fcbbf8 100644 --- a/apps/history/api.py +++ b/apps/history/api.py @@ -5,7 +5,6 @@ import json from django.db import transaction from django.core import serializers -from django.shortcuts import get_object_or_404 from django.db import models from django.db.utils import DatabaseError @@ -17,7 +16,7 @@ class EventNamespace(object): def __init__(self, name, label): self.name = name self.label = label - + class Event(object): @transaction.commit_on_success @@ -37,8 +36,7 @@ class Event(object): history_types_dict[self.namespace.name][self.name] = self except DatabaseError: # Special case for syncdb - transaction.rollback() - + transaction.rollback() def commit(self, source_object=None, data=None): new_history = History(history_type=self.history_type_obj) diff --git a/apps/history/views.py b/apps/history/views.py index 0c2f603f0b..49ba2c2742 100644 --- a/apps/history/views.py +++ b/apps/history/views.py @@ -16,7 +16,7 @@ from acls.models import AccessEntry from .models import History, HistoryType from .forms import HistoryDetailForm from .permissions import PERMISSION_HISTORY_VIEW -from .widgets import history_entry_object_link, history_entry_summary +from .widgets import history_entry_object_link def history_list(request, object_list=None, title=None, extra_context=None): @@ -76,11 +76,11 @@ def history_for_object(request, app_label, module_name, object_id): def history_view(request, object_id): history = get_object_or_404(History, pk=object_id) - + try: Permission.objects.check_permissions(request.user, [PERMISSION_HISTORY_VIEW]) except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_HISTORY_VIEW, request.user, history.content_object) + AccessEntry.objects.check_access(PERMISSION_HISTORY_VIEW, request.user, history.content_object) form = HistoryDetailForm(instance=history, extra_fields=[ {'label': _(u'Date'), 'field': lambda x: x.datetime.date()}, @@ -99,7 +99,7 @@ def history_view(request, object_id): def history_type_list(request, history_type_pk): history_type = get_object_or_404(HistoryType, pk=history_type_pk) - + return history_list( request, object_list=History.objects.filter(history_type=history_type), diff --git a/apps/installation/__init__.py b/apps/installation/__init__.py index 0b43b0fffe..96b893ad56 100644 --- a/apps/installation/__init__.py +++ b/apps/installation/__init__.py @@ -5,13 +5,12 @@ from south.signals import post_migrate from project_tools.api import register_tool from django.dispatch import receiver -from django.db.models.signals import post_save from django.db.utils import DatabaseError from django.db import transaction from .links import installation_details from .models import Installation - + @receiver(post_migrate, dispatch_uid='trigger_first_time') def trigger_first_time(sender, **kwargs): @@ -27,7 +26,7 @@ def check_first_run(): details = Installation.objects.get() except DatabaseError: # Avoid database errors when the app tables haven't been created yet - transaction.rollback() + transaction.rollback() else: if details.is_first_run: details.submit() diff --git a/apps/installation/models.py b/apps/installation/models.py index f4019ba5bb..a53d25ca7a 100644 --- a/apps/installation/models.py +++ b/apps/installation/models.py @@ -15,7 +15,7 @@ except pbs.CommandNotFound: LSB = False else: LSB = True - + from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -34,18 +34,19 @@ FORM_RECEIVER_FIELD = 'entry.0.single' TIMEOUT = 5 FABFILE_MARKER = os.path.join(settings.PROJECT_ROOT, 'fabfile_install') + class Property(object): def __init__(self, name, label, value): self.name = name self.label = label self.value = value - + def __unicode__(self): return unicode(self.value) def __str__(self): return str(self.value) - + class Installation(Singleton): _properties = SortedDict() @@ -64,10 +65,10 @@ class Installation(Singleton): self._properties = SortedDict() if LSB: self.add_property(Property('is_lsb', _(u'LSB OS'), True)) - self.add_property(Property('distributor_id', _(u'Distributor ID'), lsb_release('-i','-s'))) - self.add_property(Property('description', _(u'Description'), lsb_release('-d','-s'))) - self.add_property(Property('release', _(u'Release'), lsb_release('-r','-s'))) - self.add_property(Property('codename', _(u'Codename'), lsb_release('-c','-s'))) + self.add_property(Property('distributor_id', _(u'Distributor ID'), lsb_release('-i', '-s'))) + self.add_property(Property('description', _(u'Description'), lsb_release('-d', '-s'))) + self.add_property(Property('release', _(u'Release'), lsb_release('-r', '-s'))) + self.add_property(Property('codename', _(u'Codename'), lsb_release('-c', '-s'))) self.add_property(Property('sysinfo', _(u'System info'), uname('-a'))) else: self.add_property(Property('is_lsb', _(u'LSB OS'), False)) @@ -81,7 +82,7 @@ class Installation(Singleton): self.add_property(Property('cpus', _(u'Number of CPUs'), psutil.NUM_CPUS)) self.add_property(Property('total_phymem', _(u'Total physical memory'), pretty_size(psutil.TOTAL_PHYMEM))) self.add_property(Property('disk_partitions', _(u'Disk partitions'), '; '.join(['%s %s %s %s' % (partition.device, partition.mountpoint, partition.fstype, partition.opts) for partition in psutil.disk_partitions()]))) - + try: self.add_property(Property('tesseract', _(u'tesseract version'), pbs.tesseract('-v').stderr)) except pbs.CommandNotFound: @@ -94,13 +95,13 @@ class Installation(Singleton): self.add_property(Property('mayan_version', _(u'Mayan EDMS version'), mayan_version)) self.add_property(Property('fabfile', _(u'Installed via fabfile'), os.path.exists(FABFILE_MARKER))) - + try: repo = Repo(settings.PROJECT_ROOT) except: self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), False)) else: - repo.config_reader() + repo.config_reader() headcommit = repo.head.commit self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), True)) self.add_property(Property('repo_remotes', _(u'Repository remotes'), ', '.join([unicode(remote) for remote in repo.remotes]))) @@ -111,13 +112,13 @@ class Installation(Singleton): self.add_property(Property('headcommit_committer', _(u'HEAD commit committer'), headcommit.committer)) self.add_property(Property('headcommit_committed_date', _(u'HEAD commit committed date'), time.asctime(time.gmtime(headcommit.committed_date)))) self.add_property(Property('headcommit_message', _(u'HEAD commit message'), headcommit.message)) - + def __getattr__(self, name): self.set_properties() try: return self._properties[name] except KeyError: - raise AttributeError, name + raise AttributeError def submit(self): try: @@ -164,7 +165,7 @@ class Installation(Singleton): 'headcommit_message': unicode(self.headcommit_message), } ) - + requests.post(FORM_SUBMIT_URL, data={'formkey': FORM_KEY, FORM_RECEIVER_FIELD: dumps(dictionary)}, timeout=TIMEOUT) except (requests.exceptions.Timeout, requests.exceptions.ConnectionError): pass @@ -174,6 +175,5 @@ class Installation(Singleton): finally: lock.release() - class Meta: verbose_name = verbose_name_plural = _(u'installation details') diff --git a/apps/installation/views.py b/apps/installation/views.py index 716f2284a6..59db18b9f8 100644 --- a/apps/installation/views.py +++ b/apps/installation/views.py @@ -3,7 +3,6 @@ from __future__ import absolute_import from django.shortcuts import render_to_response from django.template import RequestContext from django.utils.translation import ugettext_lazy as _ -from django.core.exceptions import PermissionDenied from permissions.models import Permission @@ -15,11 +14,11 @@ def installation_details(request): Permission.objects.check_permissions(request.user, [PERMISSION_INSTALLATION_DETAILS]) paragraphs = [] - + for name, instance in Installation().get_properties().items(): paragraphs.append('%s: %s' % (unicode(instance.label), instance.value)) - + return render_to_response('generic_template.html', { 'paragraphs': paragraphs, 'title': _(u'Installation environment details') - }, context_instance=RequestContext(request)) + }, context_instance=RequestContext(request)) diff --git a/apps/linking/__init__.py b/apps/linking/__init__.py index 5c2eecd90e..bdfa038750 100644 --- a/apps/linking/__init__.py +++ b/apps/linking/__init__.py @@ -1,19 +1,15 @@ from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ - -from navigation.api import bind_links, register_sidebar_template, Link +from navigation.api import bind_links, register_sidebar_template from project_setup.api import register_setup -from documents.permissions import PERMISSION_DOCUMENT_VIEW from documents.models import Document from acls.api import class_permissions from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL from .models import SmartLink, SmartLinkCondition from .permissions import (PERMISSION_SMART_LINK_VIEW, - PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, - PERMISSION_SMART_LINK_EDIT) -from .links import (smart_link_instance_view_link, smart_link_instances_for_document, + PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT) +from .links import (smart_link_instances_for_document, smart_link_setup, smart_link_list, smart_link_create, smart_link_edit, smart_link_delete, smart_link_condition_list, smart_link_condition_create, smart_link_condition_edit, smart_link_condition_delete, smart_link_acl_list) diff --git a/apps/linking/links.py b/apps/linking/links.py index 3d219fdfb6..23bcb24895 100644 --- a/apps/linking/links.py +++ b/apps/linking/links.py @@ -4,11 +4,10 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import Link from documents.permissions import PERMISSION_DOCUMENT_VIEW -from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL +from acls.permissions import ACLS_VIEW_ACL -from .permissions import (PERMISSION_SMART_LINK_VIEW, - PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, - PERMISSION_SMART_LINK_EDIT) +from .permissions import (PERMISSION_SMART_LINK_CREATE, + PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT) smart_link_instance_view_link = Link(text=_(u'smart links actions'), view='smart_link_instance_view', sprite='page_link', permissions=[PERMISSION_DOCUMENT_VIEW]) smart_link_instances_for_document = Link(text=_(u'smart links'), view='smart_link_instances_for_document', args='object.pk', sprite='page_link', permissions=[PERMISSION_DOCUMENT_VIEW]) diff --git a/apps/linking/views.py b/apps/linking/views.py index ab85947403..66d481fa20 100644 --- a/apps/linking/views.py +++ b/apps/linking/views.py @@ -24,7 +24,7 @@ from .models import SmartLink, SmartLinkCondition from .conf.settings import SHOW_EMPTY_SMART_LINKS from .forms import (SmartLinkInstanceForm, SmartLinkForm, SmartLinkConditionForm) -from . import smart_link_instance_view_link +from .links import smart_link_instance_view_link from .permissions import (PERMISSION_SMART_LINK_VIEW, PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT) diff --git a/apps/mailer/__init__.py b/apps/mailer/__init__.py index c7f7db7222..183a47b5fa 100644 --- a/apps/mailer/__init__.py +++ b/apps/mailer/__init__.py @@ -1,7 +1,5 @@ from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ - from navigation.api import bind_links from documents.models import Document from acls.api import class_permissions diff --git a/apps/mailer/forms.py b/apps/mailer/forms.py index 35253f5f91..3c53142c7c 100644 --- a/apps/mailer/forms.py +++ b/apps/mailer/forms.py @@ -16,8 +16,7 @@ class DocumentMailForm(forms.Form): else: self.fields['subject'].initial = settings.LINK_SUBJECT_TEMPLATE self.fields['body'].initial = settings.LINK_BODY_TEMPLATE - - + email = forms.EmailField(label=_(u'Email address')) - subject = forms.CharField(label=_(u'Subject'), required=False)#, initial=_(u'Link for document: {{ document }}')) - body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False)#, initial=_(u'To access this document click on the following link: {{ link }}')) + subject = forms.CharField(label=_(u'Subject'), required=False) + body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False) diff --git a/apps/mailer/views.py b/apps/mailer/views.py index 69df01079b..5d3c588cef 100644 --- a/apps/mailer/views.py +++ b/apps/mailer/views.py @@ -79,7 +79,7 @@ def send_document_link(request, document_id=None, document_id_list=None, as_atta else: messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % { 'document': document, 'error': exc}) - + else: if as_attachment: messages.success(request, _(u'Successfully sent document via email.')) diff --git a/apps/main/__init__.py b/apps/main/__init__.py index 96d4328c47..4768137a0a 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -1,10 +1,8 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from django.conf import settings from navigation.api import Link, register_top_menu -from project_setup.api import register_setup from project_tools.api import register_tool from .conf.settings import SIDE_BAR_SEARCH, DISABLE_HOME_VIEW diff --git a/apps/main/utils.py b/apps/main/utils.py index 3da538a774..dbb9c3e931 100644 --- a/apps/main/utils.py +++ b/apps/main/utils.py @@ -1,8 +1,8 @@ from navigation.api import register_multi_item_links from documents.links import document_multiple_clear_transformations, document_multiple_delete, document_multiple_download -from metadata import metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove -from ocr import submit_document_multiple +from metadata.links import metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove +from ocr.links import submit_document_multiple def register_multi_items_links(): diff --git a/apps/metadata/__init__.py b/apps/metadata/__init__.py index 0fa05b98f8..7c57741578 100644 --- a/apps/metadata/__init__.py +++ b/apps/metadata/__init__.py @@ -2,11 +2,10 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from navigation.api import (bind_links, register_multi_item_links, - register_sidebar_template, Link, register_model_list_columns) +from navigation.api import (bind_links, register_sidebar_template, + register_model_list_columns) from common.utils import encapsulate from documents.models import Document, DocumentType -from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT from project_setup.api import register_setup from acls.api import class_permissions @@ -15,8 +14,7 @@ from .models import MetadataType, MetadataSet from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW) -from .links import (metadata_edit, metadata_view, metadata_multiple_edit, - metadata_add, metadata_multiple_add, metadata_remove, metadata_multiple_remove, +from .links import (metadata_edit, metadata_view, metadata_add, metadata_remove, setup_metadata_type_list, setup_metadata_type_edit, setup_metadata_type_delete, setup_metadata_type_create, setup_metadata_set_list, setup_metadata_set_edit, setup_metadata_set_delete, setup_metadata_set_create, setup_metadata_set_members, diff --git a/apps/metadata/views.py b/apps/metadata/views.py index a3f915228c..064bcd6d26 100644 --- a/apps/metadata/views.py +++ b/apps/metadata/views.py @@ -150,7 +150,7 @@ def metadata_add(request, document_id=None, document_id_list=None): else: messages.warning(request, _(u'Metadata type: %(metadata_type)s already present in document %(document)s.') % { 'metadata_type': metadata_type, 'document': document}) - + document.mark_indexable() if len(documents) == 1: @@ -513,7 +513,6 @@ def setup_metadata_set_delete(request, metadata_set_id): 'metadata_set': metadata_set, 'error': e}) return HttpResponseRedirect(previous) - context = { 'object_name': _(u'metadata set'), 'delete_view': True, diff --git a/apps/navigation/templatetags/navigation_tags.py b/apps/navigation/templatetags/navigation_tags.py index 142d193a8f..d4f00e5ce2 100644 --- a/apps/navigation/templatetags/navigation_tags.py +++ b/apps/navigation/templatetags/navigation_tags.py @@ -91,6 +91,7 @@ def get_multi_item_links(parser, token): return GetNavigationLinks(menu_name=menu_name, links_dict=multi_object_navigation, var_name=var_name) +# TODO: Fix flake8 warning apps/navigation/templatetags/navigation_tags.py:98: W802 undefined name 'get_context_object_navigation_links' @register.inclusion_tag('generic_form_instance.html', takes_context=True) def get_multi_item_links_form(context): logger.debug('starting') diff --git a/apps/ocr/__init__.py b/apps/ocr/__init__.py index 9fa029b239..bbdbcc5df8 100644 --- a/apps/ocr/__init__.py +++ b/apps/ocr/__init__.py @@ -9,7 +9,7 @@ from django.db.models.signals import post_save, post_syncdb from django.dispatch import receiver from django.db.utils import DatabaseError -from navigation.api import bind_links, register_multi_item_links, Link +from navigation.api import bind_links, register_multi_item_links from documents.models import Document, DocumentVersion from main.api import register_maintenance_links from project_tools.api import register_tool @@ -26,8 +26,7 @@ from . import models as ocr_models logger = logging.getLogger(__name__) -from .links import (submit_document, submit_document_multiple, - re_queue_document, re_queue_multiple_document, queue_document_delete, +from .links import (submit_document, re_queue_multiple_document, queue_document_multiple_delete, document_queue_disable, document_queue_enable, all_document_ocr_cleanup, queue_document_list, ocr_tool_link, setup_queue_transformation_list, diff --git a/apps/ocr/models.py b/apps/ocr/models.py index 895ad38999..8a77d12928 100644 --- a/apps/ocr/models.py +++ b/apps/ocr/models.py @@ -15,10 +15,9 @@ from documents.models import Document from converter.api import get_available_transformations_choices from sources.managers import SourceTransformationManager -from .literals import (DOCUMENTQUEUE_STATE_STOPPED, - DOCUMENTQUEUE_STATE_CHOICES, QUEUEDOCUMENT_STATE_PENDING, - QUEUEDOCUMENT_STATE_CHOICES, QUEUEDOCUMENT_STATE_PROCESSING, - DOCUMENTQUEUE_STATE_ACTIVE) +from .literals import (DOCUMENTQUEUE_STATE_CHOICES, + QUEUEDOCUMENT_STATE_PENDING, QUEUEDOCUMENT_STATE_CHOICES, + QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_ACTIVE) from .managers import DocumentQueueManager from .exceptions import ReQueueError diff --git a/apps/permissions/__init__.py b/apps/permissions/__init__.py index 801ee91868..d8c351536a 100644 --- a/apps/permissions/__init__.py +++ b/apps/permissions/__init__.py @@ -3,7 +3,6 @@ from __future__ import absolute_import from django.contrib.auth.models import User from django.db.models.signals import post_save from django.core.exceptions import ObjectDoesNotExist -from django.utils.translation import ugettext_lazy as _ from navigation.api import bind_links, register_multi_item_links from project_setup.api import register_setup diff --git a/apps/permissions/managers.py b/apps/permissions/managers.py index 2284f55e01..25037f2065 100644 --- a/apps/permissions/managers.py +++ b/apps/permissions/managers.py @@ -2,11 +2,6 @@ import logging from django.db import models from django.contrib.contenttypes.models import ContentType -from django.db import transaction -from django.core.exceptions import PermissionDenied -from django.shortcuts import get_object_or_404 -from django.db.utils import IntegrityError -from django.core.exceptions import ImproperlyConfigured from common.models import AnonymousUserSingleton diff --git a/apps/permissions/views.py b/apps/permissions/views.py index 6e8673de12..742a2c0e58 100644 --- a/apps/permissions/views.py +++ b/apps/permissions/views.py @@ -16,17 +16,16 @@ from django.contrib.auth.models import User, Group from django.utils.simplejson import loads from common.views import assign_remove -from common.utils import generate_choices_w_labels, encapsulate, get_object_name +from common.utils import encapsulate, get_object_name from common.widgets import two_state_template from common.models import AnonymousUserSingleton from acls.classes import EncapsulatedObject -from .models import Role, Permission, PermissionHolder, RoleMember +from .models import Role, Permission from .forms import RoleForm, RoleForm_view from .permissions import (PERMISSION_ROLE_VIEW, PERMISSION_ROLE_EDIT, PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE, PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE) -from .widgets import role_permission_link def role_list(request): diff --git a/apps/project_setup/api.py b/apps/project_setup/api.py index 7535981277..db7f0183ac 100644 --- a/apps/project_setup/api.py +++ b/apps/project_setup/api.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -from elementtree.ElementTree import Element, SubElement +from elementtree.ElementTree import SubElement from . import setup_menu diff --git a/apps/project_tools/api.py b/apps/project_tools/api.py index 634d6590d9..e04946a8b2 100644 --- a/apps/project_tools/api.py +++ b/apps/project_tools/api.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -from elementtree.ElementTree import Element, SubElement +from elementtree.ElementTree import SubElement from . import tool_menu diff --git a/apps/scheduler/views.py b/apps/scheduler/views.py index 9f106d6fef..597632eca7 100644 --- a/apps/scheduler/views.py +++ b/apps/scheduler/views.py @@ -3,7 +3,6 @@ from __future__ import absolute_import from django.shortcuts import render_to_response from django.template import RequestContext from django.utils.translation import ugettext_lazy as _ -from django.core.exceptions import PermissionDenied from permissions.models import Permission from common.utils import encapsulate diff --git a/apps/smart_settings/__init__.py b/apps/smart_settings/__init__.py index cb4c8f36d7..d483e386ff 100644 --- a/apps/smart_settings/__init__.py +++ b/apps/smart_settings/__init__.py @@ -1,7 +1,5 @@ from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ - from project_setup.api import register_setup from .links import check_settings diff --git a/apps/smart_settings/views.py b/apps/smart_settings/views.py index b2109e7580..c51eeb0ee1 100644 --- a/apps/smart_settings/views.py +++ b/apps/smart_settings/views.py @@ -20,11 +20,11 @@ def setting_list(request, namespace_name=None, object_list=None, title=None, ext namespace_links.append( Link(text=namespace.label, view='setting_list', args=[u'"%s"' % namespace.name], sprite=getattr(namespace, 'sprite') or 'cog', condition=is_superuser, children_view_regex=[r'^setting_']) ) - + if namespace_name: object_list = [setting for setting in settings[namespace_name] if setting.hidden == False] title = _(u'settings for the %s module') % namespaces[namespace_name] - + context = { 'title': title if title else _(u'settings'), 'object_list': object_list if not (object_list is None) else [setting for setting in settings_list if setting.hidden == False], @@ -47,7 +47,7 @@ def setting_list(request, namespace_name=None, object_list=None, title=None, ext } } } - + if extra_context: context.update(extra_context) diff --git a/apps/sources/__init__.py b/apps/sources/__init__.py index d336f0b4bb..4daa0ccd04 100644 --- a/apps/sources/__init__.py +++ b/apps/sources/__init__.py @@ -3,11 +3,9 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from navigation.api import (bind_links, - register_model_list_columns, Link) + register_model_list_columns) from common.utils import encapsulate from project_setup.api import register_setup -from documents.permissions import (PERMISSION_DOCUMENT_NEW_VERSION, - PERMISSION_DOCUMENT_CREATE) from scheduler.api import register_interval_job from documents.models import Document @@ -15,18 +13,15 @@ from .staging import StagingFile from .models import (WebForm, StagingFolder, SourceTransformation, WatchFolder, POP3Email, IMAPEmail) from .widgets import staging_file_thumbnail -from .permissions import (PERMISSION_SOURCES_SETUP_VIEW, - PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_DELETE, - PERMISSION_SOURCES_SETUP_CREATE) from .tasks import task_fetch_pop3_emails, task_fetch_imap_emails from .conf.settings import EMAIL_PROCESSING_INTERVAL -from .links import (staging_file_preview, staging_file_delete, setup_sources, +from .links import (staging_file_delete, setup_sources, setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_source_edit, setup_source_delete, setup_source_create, setup_source_log_list, setup_source_transformation_list, setup_source_transformation_create, setup_source_transformation_edit, setup_source_transformation_delete, - source_list, upload_version, document_create_multiple) + upload_version, document_create_multiple) bind_links([StagingFile], [staging_file_delete]) diff --git a/apps/sources/conf/settings.py b/apps/sources/conf/settings.py index 25e53e75d5..87dc85e5ea 100644 --- a/apps/sources/conf/settings.py +++ b/apps/sources/conf/settings.py @@ -1,16 +1,14 @@ """Configuration options for the sources app""" -import os from django.utils.translation import ugettext_lazy as _ -from django.conf import settings from smart_settings.api import Setting, SettingNamespace namespace = SettingNamespace('sources', _(u'Sources'), module='sources.conf.settings') -POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL +POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL DEFAULT_EMAIL_PROCESSING_INTERVAL = 60 -DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store +DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store Setting( namespace=namespace, diff --git a/apps/sources/managers.py b/apps/sources/managers.py index 750c2dc932..b9a7d74b91 100644 --- a/apps/sources/managers.py +++ b/apps/sources/managers.py @@ -38,11 +38,11 @@ class SourceLogManager(models.Manager): to_delete = self.model.objects.filter(content_type=content_type, object_id=source.pk).order_by('-creation_datetime')[LOG_SIZE:] for recent_to_delete in to_delete: recent_to_delete.delete() - + def get_for_source(self, source): content_type = ContentType.objects.get_for_model(source) return self.model.objects.filter(content_type=content_type, object_id=source.pk).order_by('-creation_datetime') - + def get_latest_for(self, source): content_type = ContentType.objects.get_for_model(source) return self.model.objects.filter(content_type=content_type, object_id=source.pk).latest().creation_datetime diff --git a/apps/sources/models.py b/apps/sources/models.py index cc33a03f7b..dec26130fb 100644 --- a/apps/sources/models.py +++ b/apps/sources/models.py @@ -21,7 +21,6 @@ from django.contrib.contenttypes import generic from django.core.exceptions import ValidationError from django.db import transaction from django.core.files import File -from django.core.files.base import ContentFile from converter.api import get_available_transformations_choices from converter.literals import DIMENSION_SEPARATOR @@ -38,9 +37,9 @@ from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL, SOURCE_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES, SOURCE_UNCOMPRESS_CHOICE_Y, POP3_PORT, POP3_SSL_PORT, - SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL, + SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL, IMAP_PORT, IMAP_SSL_PORT, - SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL, + SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL, IMAP_DEFAULT_MAILBOX) from .compressed_file import CompressedFile, NotACompressedFile from .conf.settings import POP3_TIMEOUT @@ -169,14 +168,14 @@ class SourceLog(models.Model): source = generic.GenericForeignKey('content_type', 'object_id') creation_datetime = models.DateTimeField(verbose_name=_(u'date time')) status = models.TextField(verbose_name=_(u'status')) - + objects = SourceLogManager() - + def save(self, *args, **kwargs): if not self.pk: self.creation_datetime = datetime.datetime.now() return super(SourceLog, self).save(*args, **kwargs) - + class Meta: verbose_name = _(u'source log') verbose_name_plural = _(u'sources logs') @@ -194,8 +193,8 @@ class InteractiveBaseModel(BaseModel): class Meta(BaseModel.Meta): abstract = True - - + + class PseudoFile(File): def __init__(self, file, name): self.name = name @@ -203,8 +202,8 @@ class PseudoFile(File): self.file.seek(0, os.SEEK_END) self.size = self.file.tell() self.file.seek(0) - - + + class Attachment(File): def __init__(self, part, name): self.name = name @@ -251,7 +250,7 @@ class EmailBaseModel(IntervalBaseModel): counter += 1 logger.debug('filename: %s' % filename) - + document_file = Attachment(part, name=filename) source.upload_file(document_file, expand=(source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y), document_type=source.document_type) @@ -274,7 +273,7 @@ class POP3Email(EmailBaseModel): else: difference = datetime.datetime.now() - last_check initial_trigger = False - + if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger: try: logger.debug('Starting POP3 email fetch') @@ -293,28 +292,28 @@ class POP3Email(EmailBaseModel): mailbox.user(self.username) mailbox.pass_(self.password) messages_info = mailbox.list() - + logger.debug('messages_info:') logger.debug(messages_info) logger.debug('messages count: %s' % len(messages_info[1])) - + for message_info in messages_info[1]: message_number, message_size = message_info.split() logger.debug('message_number: %s' % message_number) logger.debug('message_size: %s' % message_size) - + complete_message = '\n'.join(mailbox.retr(message_number)[1]) EmailBaseModel.process_message(source=self, message=complete_message) mailbox.dele(message_number) - + mailbox.quit() SourceLog.objects.save_status(source=self, status='Successful connection.') except Exception, exc: logger.error('Unhandled exception: %s' % exc) SourceLog.objects.save_status(source=self, status='Error: %s' % exc) - + class Meta(EmailBaseModel.Meta): verbose_name = _(u'POP email') verbose_name_plural = _(u'POP email') @@ -322,7 +321,7 @@ class POP3Email(EmailBaseModel): class IMAPEmail(EmailBaseModel): source_type = SOURCE_CHOICE_IMAP_EMAIL - + mailbox = models.CharField(max_length=64, blank=True, verbose_name=_(u'mailbox'), help_text=_(u'Mail from which to check for messages with attached documents. If none is specified, the default mailbox is %s') % IMAP_DEFAULT_MAILBOX) # http://www.doughellmann.com/PyMOTW/imaplib/ @@ -336,7 +335,7 @@ class IMAPEmail(EmailBaseModel): else: difference = datetime.datetime.now() - last_check initial_trigger = False - + if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger: try: logger.debug('Starting IMAP email fetch') @@ -353,7 +352,7 @@ class IMAPEmail(EmailBaseModel): mailbox.login(self.username, self.password) mailbox.select(self.mailbox or IMAP_DEFAULT_MAILBOX) - + status, data = mailbox.search(None, 'NOT', 'DELETED') if data: messages_info = data[0].split() @@ -369,7 +368,7 @@ class IMAPEmail(EmailBaseModel): mailbox.close() mailbox.logout() SourceLog.objects.save_status(source=self, status='Successful connection.') - + except Exception, exc: logger.error('Unhandled exception: %s' % exc) SourceLog.objects.save_status(source=self, status='Error: %s' % exc) diff --git a/apps/sources/tasks.py b/apps/sources/tasks.py index 19e5683671..1758825c13 100644 --- a/apps/sources/tasks.py +++ b/apps/sources/tasks.py @@ -1,12 +1,7 @@ from __future__ import absolute_import -from datetime import timedelta, datetime -import platform import logging -from django.db.models import Q - -from job_processor.api import process_job from lock_manager import Lock, LockError from .models import POP3Email, IMAPEmail @@ -20,7 +15,7 @@ def task_fetch_single_pop3_email(pop3_email): try: lock_id = u'task_fetch_pop3_email-%d' % pop3_email.pk logger.debug('trying to acquire lock: %s' % lock_id) - lock = Lock.acquire_lock(lock_id, POP3_TIMEOUT + 60) # Lock expiration = POP3 timeout + 60 seconds + lock = Lock.acquire_lock(lock_id, POP3_TIMEOUT + 60) # Lock expiration = POP3 timeout + 60 seconds logger.debug('acquired lock: %s' % lock_id) try: pop3_email.fetch_mail() @@ -31,7 +26,7 @@ def task_fetch_single_pop3_email(pop3_email): except LockError: logger.error('unable to obtain lock') pass - + def task_fetch_pop3_emails(): logger.debug('executing') @@ -57,7 +52,7 @@ def task_fetch_single_imap_email(imap_email): except LockError: logger.error('unable to obtain lock') pass - + def task_fetch_imap_emails(): logger.debug('executing') diff --git a/apps/sources/urls.py b/apps/sources/urls.py index db63b39c2f..333b687b91 100644 --- a/apps/sources/urls.py +++ b/apps/sources/urls.py @@ -35,6 +35,6 @@ urlpatterns = patterns('sources.views', url(r'^setup/interactive/(?P\w+)/(?P\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), url(r'^setup/interactive/source/transformation/(?P\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'), url(r'^setup/interactive/source/transformation/(?P\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'), - - url(r'^setup/source/(?P\w+)/(?P\d+)/log/list/$', 'setup_source_log_list', (), 'setup_source_log_list'), + + url(r'^setup/source/(?P\w+)/(?P\d+)/log/list/$', 'setup_source_log_list', (), 'setup_source_log_list'), ) diff --git a/apps/sources/views.py b/apps/sources/views.py index b75a2b4fc1..3e8aa2511a 100644 --- a/apps/sources/views.py +++ b/apps/sources/views.py @@ -73,7 +73,7 @@ def get_active_tab_links(document=None): staging_folders = StagingFolder.objects.filter(enabled=True) for staging_folder in staging_folders: tab_links.append(get_tab_link_for_source(staging_folder, document)) - + return { 'tab_links': tab_links, SOURCE_CHOICE_WEB_FORM: web_forms, @@ -480,7 +480,7 @@ def setup_source_edit(request, source_type, source_id): elif source_type == SOURCE_CHOICE_IMAP_EMAIL: cls = IMAPEmail form_class = IMAPEmailSetupForm - + source = get_object_or_404(cls, pk=source_id) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) @@ -623,7 +623,7 @@ def setup_source_log_list(request, source_type, source_pk): cls = POP3Email elif source_type == SOURCE_CHOICE_IMAP_EMAIL: cls = IMAPEmail - + source = get_object_or_404(cls, pk=source_pk) context = { @@ -659,7 +659,7 @@ def setup_source_transformation_list(request, source_type, source_id): cls = POP3Email elif source_type == SOURCE_CHOICE_IMAP_EMAIL: cls = IMAPEmail - + source = get_object_or_404(cls, pk=source_id) context = { @@ -765,7 +765,7 @@ def setup_source_transformation_create(request, source_type, source_id): cls = POP3Email elif source_type == SOURCE_CHOICE_IMAP_EMAIL: cls = IMAPEmail - + source = get_object_or_404(cls, pk=source_id) redirect_view = reverse('setup_source_transformation_list', args=[source.source_type, source.pk]) diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index de1847f2ae..7602464414 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -7,16 +7,15 @@ from navigation.api import (bind_links, register_top_menu, from common.utils import encapsulate from documents.models import Document from acls.api import class_permissions -from acls.permissions import ACLS_VIEW_ACL from taggit.models import Tag from taggit.managers import TaggableManager from .widgets import (get_tags_inline_widget_simple, single_tag_widget) -from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH, +from .permissions import (PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT, PERMISSION_TAG_VIEW) -from .links import (tag_list, tag_create, tag_attach, tag_document_remove, +from .links import (tag_list, tag_create, tag_attach, tag_document_remove_multiple, tag_document_list, tag_delete, tag_edit, tag_tagged_item_list, tag_multiple_delete, tag_acl_list) diff --git a/apps/tags/links.py b/apps/tags/links.py index 51d575993d..2b9a2f986e 100644 --- a/apps/tags/links.py +++ b/apps/tags/links.py @@ -6,8 +6,7 @@ from navigation.api import Link from acls.permissions import ACLS_VIEW_ACL from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH, - PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT, - PERMISSION_TAG_VIEW) + PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT) tag_list = Link(text=_(u'tag list'), view='tag_list', sprite='tag_blue') tag_create = Link(text=_(u'create new tag'), view='tag_create', sprite='tag_blue_add', permissions=[PERMISSION_TAG_CREATE]) diff --git a/apps/user_management/__init__.py b/apps/user_management/__init__.py index dd3d7caddc..25ff66efc2 100644 --- a/apps/user_management/__init__.py +++ b/apps/user_management/__init__.py @@ -1,6 +1,5 @@ from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User, Group from navigation.api import bind_links, register_multi_item_links diff --git a/settings.py b/settings.py index 432e1bc502..33c4da2e59 100644 --- a/settings.py +++ b/settings.py @@ -165,7 +165,6 @@ INSTALLED_APPS = ( 'mimetype', 'scheduler', 'job_processor', - 'installation', # Mayan EDMS 'storage', 'documents', @@ -180,12 +179,13 @@ INSTALLED_APPS = ( 'document_acls', 'ocr', 'history', - 'main', 'rest_api', 'document_signatures', #'workflows', 'checkouts', - 'bootstrap', + #'bootstrap', + 'main', + 'installation', # Has to be last so the other apps can register it's signals 'signaler', diff --git a/urls.py b/urls.py index 5cc86169c7..844e2f7c05 100644 --- a/urls.py +++ b/urls.py @@ -36,7 +36,7 @@ urlpatterns = patterns('', (r'^checkouts/', include('checkouts.urls')), (r'^installation/', include('installation.urls')), (r'^scheduler/', include('scheduler.urls')), - (r'^bootstrap/', include('bootstrap.urls')), + #(r'^bootstrap/', include('bootstrap.urls')), )