diff --git a/mayan/apps/checkouts/__init__.py b/mayan/apps/checkouts/__init__.py index cb8c375b71..600e41ff5b 100644 --- a/mayan/apps/checkouts/__init__.py +++ b/mayan/apps/checkouts/__init__.py @@ -5,8 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions from documents.models import Document from history.api import register_history_type -from navigation.api import (register_links, register_top_menu, - register_multi_item_links, register_sidebar_template) +from navigation.api import register_links, register_top_menu from scheduler.api import register_interval_job from .events import (HISTORY_DOCUMENT_CHECKED_OUT, HISTORY_DOCUMENT_CHECKED_IN, diff --git a/mayan/apps/converter/__init__.py b/mayan/apps/converter/__init__.py index 29dcb978fe..272ebb60cd 100644 --- a/mayan/apps/converter/__init__.py +++ b/mayan/apps/converter/__init__.py @@ -9,9 +9,11 @@ from project_tools.api import register_tool from .utils import load_backend from .conf.settings import GRAPHICS_BACKEND + def is_superuser(context): return context['request'].user.is_staff or context['request'].user.is_superuser + formats_list = {'text': _('file formats'), 'view': 'formats_list', 'famfam': 'pictures', 'icon': 'pictures.png', 'condition': is_superuser, 'children_view_regex': [r'formats_list']} register_sidebar_template(['formats_list'], 'converter_file_formats_help.html') diff --git a/mayan/apps/document_acls/links.py b/mayan/apps/document_acls/links.py index 0382ea2744..3c18710808 100644 --- a/mayan/apps/document_acls/links.py +++ b/mayan/apps/document_acls/links.py @@ -2,7 +2,6 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from acls.permissions import ACLS_VIEW_ACL, ACLS_EDIT_ACL -from django.utils.translation import ugettext_lazy as _ +from acls.permissions import ACLS_VIEW_ACL acl_list = {'text': _(u'ACLs'), 'view': 'document_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]} diff --git a/mayan/apps/history/api.py b/mayan/apps/history/api.py index eacf65b257..1a8a8e613a 100644 --- a/mayan/apps/history/api.py +++ b/mayan/apps/history/api.py @@ -25,7 +25,7 @@ def register_history_type(history_type_dict): except DatabaseError: # Special case for syncdb transaction.rollback() - + # Runtime history_types_dict.setdefault(namespace, {}) history_types_dict[namespace][name] = { diff --git a/mayan/apps/history/views.py b/mayan/apps/history/views.py index 0c2f603f0b..a0786435bb 100644 --- a/mayan/apps/history/views.py +++ b/mayan/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()}, @@ -93,13 +93,12 @@ def history_view(request, object_id): return render_to_response('generic_detail.html', { 'title': _(u'details for: %s') % history.get_processed_summary(), 'form': form, - }, - context_instance=RequestContext(request)) + }, context_instance=RequestContext(request)) 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/mayan/apps/history/widgets.py b/mayan/apps/history/widgets.py index 8173ccbe2b..a439a92ebd 100644 --- a/mayan/apps/history/widgets.py +++ b/mayan/apps/history/widgets.py @@ -3,22 +3,20 @@ from django.utils.safestring import mark_safe def history_entry_object_link(entry): return mark_safe(u'%(label)s' % { - 'url': entry.content_object.get_absolute_url() if entry.content_object else u'#', - 'label': unicode(entry.content_object) if entry.content_object else u'' - } + 'url': entry.content_object.get_absolute_url() if entry.content_object else u'#', + 'label': unicode(entry.content_object) if entry.content_object else u''} ) def history_entry_summary(entry): return mark_safe(u'%(label)s' % { 'url': entry.get_absolute_url(), - 'label': unicode(entry.get_processed_summary()) - }) + 'label': unicode(entry.get_processed_summary())} + ) def history_entry_type_link(entry): return mark_safe(u'%(label)s' % { - 'url': entry.history_type.get_absolute_url(), - 'label': unicode(entry.history_type) - } + 'url': entry.history_type.get_absolute_url(), + 'label': unicode(entry.history_type)} ) diff --git a/mayan/apps/installation/__init__.py b/mayan/apps/installation/__init__.py index 160386767e..ea484cf99a 100644 --- a/mayan/apps/installation/__init__.py +++ b/mayan/apps/installation/__init__.py @@ -15,7 +15,7 @@ from project_tools.api import register_tool from .classes import Property, PropertyNamespace from .links import link_menu_link, link_namespace_details, link_namespace_list from .models import Installation - + @receiver(post_migrate, dispatch_uid='trigger_first_time') def trigger_first_time(sender, **kwargs): @@ -31,7 +31,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() @@ -45,7 +45,7 @@ register_model_list_columns(PropertyNamespace, [ { 'name': _(u'items'), 'attribute': encapsulate(lambda entry: len(entry.get_properties())) - } + } ]) register_model_list_columns(Property, [ @@ -56,7 +56,7 @@ register_model_list_columns(Property, [ { 'name': _(u'value'), 'attribute': 'value' - } + } ]) register_links(PropertyNamespace, [link_namespace_details]) diff --git a/mayan/apps/installation/classes.py b/mayan/apps/installation/classes.py index be77a522a6..ff01f5840b 100644 --- a/mayan/apps/installation/classes.py +++ b/mayan/apps/installation/classes.py @@ -2,7 +2,6 @@ from __future__ import absolute_import from collections import namedtuple import os -import sys import pbs @@ -116,7 +115,6 @@ class VirtualEnv(object): else: return Dependency(package, version, standard=True) - def get_packages_info(self, requirements_file=None): if requirements_file: with open(requirements_file) as file_in: @@ -126,7 +124,6 @@ class VirtualEnv(object): for item in pip('freeze').splitlines(): yield self.extract_dependency(item) - def __init__(self): self.requirements_file_path = os.path.join(settings.BASE_DIR, 'requirements', 'production.txt') if not PIP: diff --git a/mayan/apps/installation/views.py b/mayan/apps/installation/views.py index 4f9f17bf8b..c09326f4d9 100644 --- a/mayan/apps/installation/views.py +++ b/mayan/apps/installation/views.py @@ -3,11 +3,10 @@ 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 .classes import Property, PropertyNamespace +from .classes import PropertyNamespace from .permissions import PERMISSION_INSTALLATION_DETAILS from .models import Installation diff --git a/mayan/apps/linking/__init__.py b/mayan/apps/linking/__init__.py index 4c75eb611b..d116e5f667 100644 --- a/mayan/apps/linking/__init__.py +++ b/mayan/apps/linking/__init__.py @@ -6,7 +6,7 @@ from documents.models import Document from navigation.api import register_links, register_sidebar_template from project_setup.api import register_setup -from .links import (smart_link_instance_view_link, smart_link_instances_for_document, +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/mayan/apps/linking/views.py b/mayan/apps/linking/views.py index 0b3aefef1b..0d7e90c924 100644 --- a/mayan/apps/linking/views.py +++ b/mayan/apps/linking/views.py @@ -20,10 +20,10 @@ from documents.views import document_list from documents.permissions import PERMISSION_DOCUMENT_VIEW from permissions.models import Permission -from . import smart_link_instance_view_link from .conf.settings import SHOW_EMPTY_SMART_LINKS from .forms import (SmartLinkInstanceForm, SmartLinkForm, SmartLinkConditionForm) +from .links import smart_link_instance_view_link from .models import SmartLink, SmartLinkCondition from .permissions import (PERMISSION_SMART_LINK_VIEW, PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, diff --git a/mayan/apps/ocr/__init__.py b/mayan/apps/ocr/__init__.py index 988d6c75de..da670a1ef4 100644 --- a/mayan/apps/ocr/__init__.py +++ b/mayan/apps/ocr/__init__.py @@ -20,16 +20,14 @@ from . import models as ocr_models from .conf.settings import (AUTOMATIC_OCR, QUEUE_PROCESSING_INTERVAL) from .exceptions import AlreadyQueued from .links import (submit_document, submit_document_multiple, - re_queue_document, re_queue_multiple_document, queue_document_delete, - queue_document_multiple_delete, document_queue_disable, - document_queue_enable, all_document_ocr_cleanup, queue_document_list, + 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, setup_queue_transformation_create, setup_queue_transformation_edit, setup_queue_transformation_delete) from .models import DocumentQueue, QueueTransformation -from .permissions import (PERMISSION_OCR_DOCUMENT, - PERMISSION_OCR_DOCUMENT_DELETE, PERMISSION_OCR_QUEUE_ENABLE_DISABLE, - PERMISSION_OCR_CLEAN_ALL_PAGES) +from .permissions import PERMISSION_OCR_DOCUMENT from .tasks import task_process_document_queues logger = logging.getLogger(__name__) @@ -72,14 +70,6 @@ def document_post_save(sender, instance, **kwargs): except AlreadyQueued: pass -# Disabled because it appears Django execute signals using the same -# process of the signal emiter effectively blocking the view until -# the OCR process completes which could take several minutes :/ -#@receiver(post_save, dispatch_uid='call_queue', sender=QueueDocument) -#def call_queue(sender, **kwargs): -# if kwargs.get('created', False): -# logger.debug('got call_queue signal: %s' % kwargs) -# task_process_document_queues() @receiver(post_syncdb, dispatch_uid='create_default_queue', sender=ocr_models) def create_default_queue_signal_handler(sender, **kwargs): diff --git a/mayan/apps/ocr/api.py b/mayan/apps/ocr/api.py index 86bd8435ef..4324c45b0e 100644 --- a/mayan/apps/ocr/api.py +++ b/mayan/apps/ocr/api.py @@ -1,9 +1,7 @@ from __future__ import absolute_import -import codecs import os import subprocess -import tempfile import sys from django.utils.importlib import import_module @@ -15,7 +13,7 @@ from documents.models import DocumentPage from .backends import ocr_backend from .conf.settings import UNPAPER_PATH, LANGUAGE -from .exceptions import OCRError, UnpaperError +from .exceptions import UnpaperError from .literals import (DEFAULT_OCR_FILE_FORMAT, UNPAPER_FILE_FORMAT, DEFAULT_OCR_FILE_EXTENSION) from .parsers import parse_document_page @@ -69,13 +67,13 @@ def do_document_ocr(queue_document): unpaper_input = convert(document_filepath, file_format=UNPAPER_FILE_FORMAT, transformations=ocr_transformations) execute_unpaper(input_filepath=unpaper_input, output_filepath=unpaper_output_filepath) - #from PIL import Image, ImageOps - #im = Image.open(document_filepath) - ##if im.mode=='RGBA': - ## im=im.convert('RGB') - ##im = im.convert('L') - #im = ImageOps.grayscale(im) - #im.save(unpaper_output_filepath) + # from PIL import Image, ImageOps + # im = Image.open(document_filepath) + # #if im.mode=='RGBA': + # # im=im.convert('RGB') + # #im = im.convert('L') + # im = ImageOps.grayscale(im) + # im.save(unpaper_output_filepath) # Convert to TIFF pre_ocr_filepath = convert(input_filepath=unpaper_output_filepath, file_format=DEFAULT_OCR_FILE_FORMAT) diff --git a/mayan/apps/ocr/backends/__init__.py b/mayan/apps/ocr/backends/__init__.py index d1bdbeca9d..5425182c08 100644 --- a/mayan/apps/ocr/backends/__init__.py +++ b/mayan/apps/ocr/backends/__init__.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +import sys + from django.utils.importlib import import_module from ..conf.settings import BACKEND diff --git a/mayan/apps/ocr/backends/tesseract.py b/mayan/apps/ocr/backends/tesseract.py index b1bfef03a1..8a448773a3 100644 --- a/mayan/apps/ocr/backends/tesseract.py +++ b/mayan/apps/ocr/backends/tesseract.py @@ -4,14 +4,14 @@ import codecs import os import subprocess import tempfile -import sys from . import BackendBase from ..conf.settings import TESSERACT_PATH +from ..exceptions import OCRError -def Tesseract(BackendBase): - def execute(input_filename, language=None): +class Tesseract(BackendBase): + def execute(self, input_filename, language=None): """ Execute the command line binary of tesseract """ @@ -20,7 +20,7 @@ def Tesseract(BackendBase): ocr_output = os.extsep.join([filepath, u'txt']) command = [unicode(TESSERACT_PATH), unicode(input_filename), unicode(filepath)] - if lang is not None: + if language is not None: command.extend([u'-l', language]) proc = subprocess.Popen(command, close_fds=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) @@ -29,12 +29,12 @@ def Tesseract(BackendBase): error_text = proc.stderr.read() cleanup(filepath) cleanup(ocr_output) - if lang: + if language: # If tesseract gives an error with a language parameter # re-run it with no parameter again - return run_tesseract(input_filename, language=None) + return self.execute(input_filename, language=None) else: - raise TesseractError(error_text) + raise OCRError(error_text) fd = codecs.open(ocr_output, 'r', 'utf-8') text = fd.read().strip() @@ -43,3 +43,14 @@ def Tesseract(BackendBase): os.unlink(filepath) return text + + +# TODO: Reduntant, also in api.py +def cleanup(filename): + """ + Try to remove the given filename, ignoring non-existent files + """ + try: + os.remove(filename) + except OSError: + pass diff --git a/mayan/apps/ocr/lang/eng.py b/mayan/apps/ocr/lang/eng.py index 07b46d1757..8a3eb91407 100644 --- a/mayan/apps/ocr/lang/eng.py +++ b/mayan/apps/ocr/lang/eng.py @@ -10,28 +10,28 @@ def check_word(word): ALL_ALPHA = re.compile('^[a-z]+$', re.I) SINGLE_LETTER_WORDS = re.compile('^[ai]$', re.I) - #(L) If a string is longer than 20 characters, it is garbage + # (L) If a string is longer than 20 characters, it is garbage if len(word) > 20: return None - #(A) If a string's ratio of alphanumeric characters to total - #characters is less than 50%, the string is garbage + # (A) If a string's ratio of alphanumeric characters to total + # characters is less than 50%, the string is garbage if len(ALL_ALPHANUM.findall(word)) < len(word) / 2: return None - #Remove word if all the letters in the word are non alphanumeric + # Remove word if all the letters in the word are non alphanumeric if len(NON_ALPHANUM.findall(word)) == len(word): return None - #Removed words with too many consecutie vowels + # Removed words with too many consecutie vowels if TOO_MANY_VOWELS.findall(word): return None - #Removed words with too many consecutie consonants + # Removed words with too many consecutie consonants if TOO_MANY_CONSONANTS.findall(word): return None - #Only allow specific single letter words + # Only allow specific single letter words if len(word) == 1 and not SINGLE_LETTER_WORDS.findall(word): return None diff --git a/mayan/apps/ocr/lang/rus.py b/mayan/apps/ocr/lang/rus.py index a91d3bf224..f0553ca6d7 100644 --- a/mayan/apps/ocr/lang/rus.py +++ b/mayan/apps/ocr/lang/rus.py @@ -11,28 +11,28 @@ def check_word(word): ALL_ALPHA = re.compile('^[ёйцукенгшщзхъфывапролджэячсмитьбю]+$', re.I) SINGLE_LETTER_WORDS = re.compile('^[уквояси]$', re.I) - #(L) If a string is longer than 25 characters, it is garbage + # (L) If a string is longer than 25 characters, it is garbage if len(word) > 25: return None - #(A) If a string's ratio of alphanumeric characters to total - #characters is less than 50%, the string is garbage + # (A) If a string's ratio of alphanumeric characters to total + # characters is less than 50%, the string is garbage if len(ALL_ALPHANUM.findall(word)) < len(word) / 2: return None - #Remove word if all the letters in the word are non alphanumeric + # Remove word if all the letters in the word are non alphanumeric if len(NON_ALPHANUM.findall(word)) == len(word): return None - #Removed words with too many consecutie vowels + # Removed words with too many consecutie vowels if TOO_MANY_VOWELS.findall(word): return None - #Removed words with too many consecutie consonants + # Removed words with too many consecutie consonants if TOO_MANY_CONSONANTS.findall(word): return None - #Only allow specific single letter words + # Only allow specific single letter words if len(word) == 1 and not SINGLE_LETTER_WORDS.findall(word): return None diff --git a/mayan/apps/ocr/lang/spa.py b/mayan/apps/ocr/lang/spa.py index 62fc49452e..fd29d49f8a 100644 --- a/mayan/apps/ocr/lang/spa.py +++ b/mayan/apps/ocr/lang/spa.py @@ -11,28 +11,28 @@ def check_word(word): ALL_ALPHA = re.compile('^[a-z]+$', re.I) SINGLE_LETTER_WORDS = re.compile('^[aeoóuy]$', re.I) - #(L) If a string is longer than 20 characters, it is garbage + # (L) If a string is longer than 20 characters, it is garbage if len(word) > 20: return None - #(A) If a string’s ratio of alphanumeric characters to total - #characters is less than 50%, the string is garbage + # (A) If a string’s ratio of alphanumeric characters to total + # characters is less than 50%, the string is garbage if len(ALL_ALPHANUM.findall(word)) < len(word) / 2: return None - #Remove word if all the letters in the word are non alphanumeric + # Remove word if all the letters in the word are non alphanumeric if len(NON_ALPHANUM.findall(word)) == len(word): return None - #Removed words with too many consecutie vowels + # Removed words with too many consecutie vowels if TOO_MANY_VOWELS.findall(word): return None - #Removed words with too many consecutie consonants + # Removed words with too many consecutie consonants if TOO_MANY_CONSONANTS.findall(word): return None - #Only allow specific single letter words + # Only allow specific single letter words if len(word) == 1 and not SINGLE_LETTER_WORDS.findall(word): return None diff --git a/mayan/apps/ocr/models.py b/mayan/apps/ocr/models.py index aeebb77e36..d82935d365 100644 --- a/mayan/apps/ocr/models.py +++ b/mayan/apps/ocr/models.py @@ -15,10 +15,9 @@ from converter.api import get_available_transformations_choices from sources.managers import SourceTransformationManager from .exceptions import ReQueueError -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 diff --git a/mayan/apps/ocr/tasks.py b/mayan/apps/ocr/tasks.py index 8725771f54..3cce23a846 100644 --- a/mayan/apps/ocr/tasks.py +++ b/mayan/apps/ocr/tasks.py @@ -10,8 +10,7 @@ from job_processor.api import process_job from lock_manager import Lock, LockError from .api import do_document_ocr -from .conf.settings import (NODE_CONCURRENT_EXECUTION, REPLICATION_DELAY, - QUEUE_PROCESSING_INTERVAL) +from .conf.settings import NODE_CONCURRENT_EXECUTION, REPLICATION_DELAY from .literals import (QUEUEDOCUMENT_STATE_PENDING, QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_ACTIVE, QUEUEDOCUMENT_STATE_ERROR) diff --git a/mayan/apps/ocr/views.py b/mayan/apps/ocr/views.py index de432b5d29..a97873d792 100644 --- a/mayan/apps/ocr/views.py +++ b/mayan/apps/ocr/views.py @@ -18,9 +18,8 @@ from permissions.models import Permission from .api import clean_pages from .exceptions import AlreadyQueued, ReQueueError from .forms import QueueTransformationForm, QueueTransformationForm_create -from .literals import (QUEUEDOCUMENT_STATE_PENDING, - QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_STOPPED, - DOCUMENTQUEUE_STATE_ACTIVE) +from .literals import (QUEUEDOCUMENT_STATE_PROCESSING, + DOCUMENTQUEUE_STATE_STOPPED, DOCUMENTQUEUE_STATE_ACTIVE) from .models import DocumentQueue, QueueDocument, QueueTransformation from .permissions import (PERMISSION_OCR_DOCUMENT, PERMISSION_OCR_DOCUMENT_DELETE, PERMISSION_OCR_QUEUE_ENABLE_DISABLE, @@ -144,10 +143,12 @@ def submit_document_to_queue(request, document, post_submit_redirect=None): try: document_queue = DocumentQueue.objects.queue_document(document) messages.success(request, _(u'Document: %(document)s was added to the OCR queue: %(queue)s.') % { - 'document': document, 'queue': document_queue.label}) + 'document': document, 'queue': document_queue.label} + ) except AlreadyQueued: messages.warning(request, _(u'Document: %(document)s is already queued.') % { - 'document': document}) + 'document': document} + ) except Exception, e: messages.error(request, e) @@ -317,7 +318,7 @@ def setup_queue_transformation_list(request, document_queue_id): {'name': _(u'order'), 'attribute': 'order'}, {'name': _(u'transformation'), 'attribute': encapsulate(lambda x: x.get_transformation_display())}, {'name': _(u'arguments'), 'attribute': 'arguments'} - ], + ], 'hide_link': True, 'hide_object': True, } @@ -355,8 +356,7 @@ def setup_queue_transformation_edit(request, transformation_id): {'object': 'transformation', 'name': _(u'transformation')} ], 'next': next, - }, - context_instance=RequestContext(request)) + }, context_instance=RequestContext(request)) def setup_queue_transformation_delete(request, transformation_id): @@ -389,8 +389,7 @@ def setup_queue_transformation_delete(request, transformation_id): }, 'previous': previous, 'form_icon': u'shape_square_delete.png', - }, - context_instance=RequestContext(request)) + }, context_instance=RequestContext(request)) def setup_queue_transformation_create(request, document_queue_id): diff --git a/mayan/apps/permissions/__init__.py b/mayan/apps/permissions/__init__.py index a3523e0d66..adf0308b44 100644 --- a/mayan/apps/permissions/__init__.py +++ b/mayan/apps/permissions/__init__.py @@ -1,8 +1,8 @@ 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.db.models.signals import post_save from navigation.api import register_links, register_multi_item_links from project_setup.api import register_setup diff --git a/mayan/apps/permissions/cleanup.py b/mayan/apps/permissions/cleanup.py index a74115ad24..edcaba9c1e 100644 --- a/mayan/apps/permissions/cleanup.py +++ b/mayan/apps/permissions/cleanup.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -from .models import Role, PermissionHolder +from .models import Role def cleanup(): diff --git a/mayan/apps/permissions/managers.py b/mayan/apps/permissions/managers.py index 3db2ad66a1..537acedbe9 100644 --- a/mayan/apps/permissions/managers.py +++ b/mayan/apps/permissions/managers.py @@ -2,15 +2,9 @@ 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 - logger = logging.getLogger(__name__) diff --git a/mayan/apps/permissions/models.py b/mayan/apps/permissions/models.py index a308195842..8918c35cd6 100644 --- a/mayan/apps/permissions/models.py +++ b/mayan/apps/permissions/models.py @@ -2,13 +2,13 @@ from __future__ import absolute_import import logging -from django.db import models -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ugettext -from django.contrib.contenttypes.models import ContentType -from django.contrib.contenttypes import generic from django.contrib.auth.models import User +from django.contrib.contenttypes import generic +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import PermissionDenied +from django.db import models +from django.utils.translation import ugettext +from django.utils.translation import ugettext_lazy as _ from common.models import AnonymousUserSingleton @@ -70,14 +70,13 @@ class PermissionManager(object): except KeyError: raise Permission.DoesNotExist - def __init__(self, model): self.model = model class Permission(object): _stored_permissions_cache = {} - + DoesNotExist = PermissionDoesNotExists def __init__(self, namespace, name, label): @@ -236,7 +235,7 @@ class Role(models.Model): def remove_member(self, member): member = AnonymousUserSingleton.objects.passthru_check(member) - member_type=ContentType.objects.get_for_model(member) + member_type = ContentType.objects.get_for_model(member) role_member = RoleMember.objects.get(role=self, member_type=member_type, member_id=member.pk) role_member.delete() @@ -261,7 +260,6 @@ class RoleMember(models.Model): objects = RoleMemberManager() class Meta: - #ordering = ('label',) verbose_name = _(u'role member') verbose_name_plural = _(u'role members') diff --git a/mayan/apps/permissions/registry.py b/mayan/apps/permissions/registry.py index 37b05e0f42..19066cf192 100644 --- a/mayan/apps/permissions/registry.py +++ b/mayan/apps/permissions/registry.py @@ -2,7 +2,6 @@ from __future__ import absolute_import from .cleanup import cleanup - bootstrap_models = [ { 'name': 'role', diff --git a/mayan/apps/permissions/runtime.py b/mayan/apps/permissions/runtime.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mayan/apps/permissions/views.py b/mayan/apps/permissions/views.py index 0f1d1087a7..75b828b5da 100644 --- a/mayan/apps/permissions/views.py +++ b/mayan/apps/permissions/views.py @@ -1,32 +1,31 @@ from __future__ import absolute_import -import operator import itertools +import operator -from django.utils.translation import ugettext_lazy as _ +from django.contrib import messages +from django.contrib.auth.models import User, Group +from django.contrib.contenttypes.models import ContentType +from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect, Http404 from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext -from django.contrib import messages -from common.backport.generic.list_detail import object_list -from django.core.urlresolvers import reverse -from common.backport.generic.create_update import create_object, delete_object, update_object -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.models import User, Group from django.utils.simplejson import loads +from django.utils.translation import ugettext_lazy as _ -from common.views import assign_remove -from common.utils import generate_choices_w_labels, encapsulate, get_object_name -from common.widgets import two_state_template -from common.models import AnonymousUserSingleton from acls.classes import EncapsulatedObject +from common.backport.generic.list_detail import object_list +from common.backport.generic.create_update import create_object, delete_object, update_object +from common.models import AnonymousUserSingleton +from common.views import assign_remove +from common.utils import encapsulate, get_object_name +from common.widgets import two_state_template -from .models import Role, Permission, PermissionHolder, RoleMember from .forms import RoleForm, RoleForm_view +from .models import Role, Permission 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): @@ -49,7 +48,6 @@ def role_permissions(request, role_id): role = get_object_or_404(Role, pk=role_id) form = RoleForm_view(instance=role) - role_permissions_list = Permission.objects.get_for_holder(role) subtemplates_list = [ { 'name': u'generic_list_subtemplate.html', @@ -60,7 +58,7 @@ def role_permissions(request, role_id): {'name': _(u'namespace'), 'attribute': encapsulate(lambda x: x.namespace)}, {'name': _(u'name'), 'attribute': encapsulate(lambda x: x.label)}, { - 'name':_(u'has permission'), + 'name': _(u'has permission'), 'attribute': encapsulate(lambda x: two_state_template(x.requester_has_this(role))), }, ], @@ -90,7 +88,8 @@ def role_edit(request, role_id): return update_object(request, template_name='generic_form.html', form_class=RoleForm, object_id=role_id, extra_context={ - 'object_name': _(u'role')}) + 'object_name': _(u'role')} + ) def role_create(request): @@ -129,7 +128,7 @@ def permission_grant(request): items = [] for item_properties in items_property_list: - #permission = get_object_or_404(Permission, pk=item_properties['permission_id']) + # permission = get_object_or_404(Permission, pk=item_properties['permission_id']) try: permission = Permission.objects.get({'pk': item_properties['permission_id']}) except Permission.DoesNotExist: @@ -192,7 +191,7 @@ def permission_revoke(request): items = [] for item_properties in items_property_list: - #permission = get_object_or_404(Permission, pk=item_properties['permission_id']) + # permission = get_object_or_404(Permission, pk=item_properties['permission_id']) try: permission = Permission.objects.get({'pk': item_properties['permission_id']}) except Permission.DoesNotExist: @@ -280,7 +279,7 @@ def get_role_members(role, separate=False): def get_non_role_members(role): - #non members = all users - members - staff - super users + # non members = all users - members - staff - super users member_users, member_groups, member_anonymous = get_role_members(role, separate=True) staff_users = User.objects.filter(is_staff=True) @@ -300,7 +299,7 @@ def get_non_role_members(role): if anonymous: non_members.append((_(u'Special'), _as_choice_list(list(anonymous)))) - #non_holder_list.append((_(u'Special'), _as_choice_list([AnonymousUserSingleton.objects.get()]))) + # non_holder_list.append((_(u'Special'), _as_choice_list([AnonymousUserSingleton.objects.get()]))) return non_members @@ -321,9 +320,9 @@ def role_members(request, role_id): return assign_remove( request, - #left_list=lambda: generate_choices_w_labels(get_non_role_members(role)), + # left_list=lambda: generate_choices_w_labels(get_non_role_members(role)), left_list=lambda: get_non_role_members(role), - #right_list=lambda: generate_choices_w_labels(get_role_members(role)), + # right_list=lambda: generate_choices_w_labels(get_role_members(role)), right_list=lambda: get_role_members(role), add_method=lambda x: add_role_member(role, x), remove_method=lambda x: remove_role_member(role, x), diff --git a/mayan/apps/permissions/widgets.py b/mayan/apps/permissions/widgets.py index 5fa9e462c9..8f2594be17 100644 --- a/mayan/apps/permissions/widgets.py +++ b/mayan/apps/permissions/widgets.py @@ -1,7 +1,7 @@ -from django.utils.translation import ugettext -from django.utils.safestring import mark_safe from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext def role_permission_link(requester, permission, permission_list): diff --git a/mayan/apps/project_setup/__init__.py b/mayan/apps/project_setup/__init__.py index 3603ee11cf..a88480e966 100644 --- a/mayan/apps/project_setup/__init__.py +++ b/mayan/apps/project_setup/__init__.py @@ -1,7 +1,5 @@ from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ - from navigation.api import register_top_menu from .links import link_setup diff --git a/mayan/apps/project_setup/views.py b/mayan/apps/project_setup/views.py index 8ab0426572..b1ae3507ee 100644 --- a/mayan/apps/project_setup/views.py +++ b/mayan/apps/project_setup/views.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -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.utils.translation import ugettext_lazy as _ diff --git a/mayan/apps/rest_api/resources.py b/mayan/apps/rest_api/resources.py index 971161133e..6686a0539c 100644 --- a/mayan/apps/rest_api/resources.py +++ b/mayan/apps/rest_api/resources.py @@ -2,8 +2,7 @@ from django.core.urlresolvers import reverse from rest_framework import serializers -from converter.exceptions import UnknownFileFormat, UnkownConvertError -from documents.models import Document, DocumentType +from documents.models import Document class DocumentResourceSimple(serializers.HyperlinkedModelSerializer): diff --git a/mayan/apps/rest_api/views.py b/mayan/apps/rest_api/views.py index c6f48d72b7..460743b12c 100644 --- a/mayan/apps/rest_api/views.py +++ b/mayan/apps/rest_api/views.py @@ -2,16 +2,12 @@ import logging -from django.core.urlresolvers import reverse from django.shortcuts import get_object_or_404 -from django.utils.translation import ugettext_lazy as _ from converter.exceptions import UnknownFileFormat, UnkownConvertError from documents.models import Document, DocumentVersion, DocumentPage from rest_framework import generics -from rest_framework import permissions -from rest_framework import serializers from rest_framework.response import Response from rest_framework.reverse import reverse