diff --git a/apps/common/forms.py b/apps/common/forms.py index 81d7468d1e..27dd37e334 100644 --- a/apps/common/forms.py +++ b/apps/common/forms.py @@ -86,7 +86,7 @@ class DetailForm(forms.ModelForm): queryset=getattr(field, 'queryset', None), ) self.fields[field_name].help_text = '' - + for field_name, field in self.fields.items(): self.fields[field_name].widget.attrs.update({'readonly': 'readonly'}) diff --git a/apps/common/middleware/login_required_middleware.py b/apps/common/middleware/login_required_middleware.py index 9e701686e1..91af7dc92f 100644 --- a/apps/common/middleware/login_required_middleware.py +++ b/apps/common/middleware/login_required_middleware.py @@ -1,11 +1,11 @@ -from re import compile +import re from django.http import HttpResponseRedirect from django.conf import settings -EXEMPT_URLS = [compile(settings.LOGIN_URL.lstrip('/'))] +EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))] if hasattr(settings, 'LOGIN_EXEMPT_URLS'): - EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS] + EXEMPT_URLS += [re.compile(expr) for expr in settings.LOGIN_EXEMPT_URLS] class LoginRequiredMiddleware: diff --git a/apps/common/middleware/strip_spaces_widdleware.py b/apps/common/middleware/strip_spaces_widdleware.py index c92063be6e..eb75e7f597 100644 --- a/apps/common/middleware/strip_spaces_widdleware.py +++ b/apps/common/middleware/strip_spaces_widdleware.py @@ -4,6 +4,6 @@ from django.utils.html import strip_spaces_between_tags as short class SpacelessMiddleware(object): def process_response(self, request, response): - if 'text/html' in response['Content-Type']: + if u'text/html' in response['Content-Type']: response.content = short(response.content) return response diff --git a/apps/common/utils.py b/apps/common/utils.py index b21c25e8e2..d9a60f4839 100644 --- a/apps/common/utils.py +++ b/apps/common/utils.py @@ -1,4 +1,4 @@ -# -*- coding: iso-8859-1 -*- +# -*- coding: utf-8 -*- import os import re import types @@ -9,7 +9,7 @@ from django.utils.datastructures import MultiValueDict from django.conf import settings -def urlquote(link=None, get={}): +def urlquote(link=None, get=None): u''' This method does both: urlquote() and urlencode() @@ -26,6 +26,9 @@ def urlquote(link=None, get={}): urlquote('/mypath/', {'key': ['value1', 'value2']}) --> '/mypath/?key=value1&key=value2' urlquote({'key': ['value1', 'value2']}) --> 'key=value1&key=value2' ''' + if get is None: + get = [] + assert link or get if isinstance(link, dict): # urlqoute({'key': 'value', 'key2': 'value2'}) --> key=value&key2=value2 @@ -48,7 +51,7 @@ def urlquote(link=None, get={}): return django_urlquote(link) -def return_attrib(obj, attrib, arguments={}): +def return_attrib(obj, attrib, arguments=None): try: if isinstance(attrib, types.FunctionType): return attrib(obj) diff --git a/apps/common/wizard.py b/apps/common/wizard.py index 3548d1a2a5..4a8cc70e61 100644 --- a/apps/common/wizard.py +++ b/apps/common/wizard.py @@ -14,7 +14,7 @@ from django.utils.hashcompat import md5_constructor __all__ = ('security_hash', 'BoundFormWizard') -def security_hash(request, form, exclude=None, *args): +def security_hash_new(form, exclude=None, *args): """Calculates a security hash for the given Form/FormSet instance. This creates a list of the form field names/values in a deterministic @@ -60,7 +60,7 @@ class BoundFormWizard(FormWizard): Subclasses may want to take into account request-specific information, such as the IP address. """ - return security_hash(request, form) + return security_hash_new(form) def render(self, form, request, step, context=None): "Renders the given Form object, returning an HttpResponse." diff --git a/apps/converter/api.py b/apps/converter/api.py index cae89b9d43..b30d41ab38 100644 --- a/apps/converter/api.py +++ b/apps/converter/api.py @@ -12,7 +12,7 @@ from converter.conf.settings import LOW_QUALITY_OPTIONS from converter.conf.settings import HIGH_QUALITY_OPTIONS from converter.conf.settings import GRAPHICS_BACKEND -from exceptions import UnpaperError +from converter.exceptions import UnpaperError #from converter.conf.settings import UNOCONV_PATH from common import TEMPORARY_DIRECTORY @@ -78,8 +78,8 @@ def execute_unoconv(input_filepath, output_filepath, arguments=''): """ -def cache_cleanup(input_filepath, size, quality=QUALITY_DEFAULT, page=0, format=u'jpg', extra_options=u''): - filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options) +def cache_cleanup(input_filepath, size, quality=QUALITY_DEFAULT, page=0, file_format=u'jpg', extra_options=u''): + filepath = create_image_cache_filename(input_filepath, size=size, page=page, file_format=file_format, quality=quality, extra_options=extra_options) try: os.remove(filepath) except OSError: @@ -102,17 +102,17 @@ def create_image_cache_filename(input_filepath, *args, **kwargs): return None -def in_image_cache(input_filepath, size, page=0, format=u'jpg', quality=QUALITY_DEFAULT, extra_options=u'', zoom=100, rotation=0): - output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options, zoom=zoom, rotation=rotation) +def in_image_cache(input_filepath, size, page=0, file_format=u'jpg', quality=QUALITY_DEFAULT, extra_options=u'', zoom=100, rotation=0): + output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, file_format=file_format, quality=quality, extra_options=extra_options, zoom=zoom, rotation=rotation) if os.path.exists(output_filepath): return output_filepath else: return None -def convert(input_filepath, size, quality=QUALITY_DEFAULT, cache=True, page=0, format=u'jpg', extra_options=u'', mimetype=None, extension=None, cleanup_files=True, zoom=100, rotation=0): +def convert(input_filepath, size, quality=QUALITY_DEFAULT, page=0, file_format=u'jpg', extra_options=u'', cleanup_files=True, zoom=100, rotation=0): unoconv_output = None - output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, format=format, quality=quality, extra_options=extra_options, zoom=zoom, rotation=rotation) + output_filepath = create_image_cache_filename(input_filepath, size=size, page=page, file_format=file_format, quality=quality, extra_options=extra_options, zoom=zoom, rotation=rotation) if os.path.exists(output_filepath): return output_filepath ''' @@ -134,11 +134,11 @@ def convert(input_filepath, size, quality=QUALITY_DEFAULT, cache=True, page=0, f if rotation != 0 and rotation != 360: extra_options += u' -rotate %d ' % rotation - + if format == u'jpg': extra_options += u' -quality 85' - - backend.execute_convert(input_filepath=input_arg, arguments=extra_options, output_filepath=u'%s:%s' % (format, output_filepath), quality=quality) + + backend.execute_convert(input_filepath=input_arg, arguments=extra_options, output_filepath=u'%s:%s' % (file_format, output_filepath), quality=quality) finally: if cleanup_files: cleanup(input_filepath) @@ -156,7 +156,7 @@ def get_page_count(input_filepath): return 1 -def convert_document_for_ocr(document, page=0, format='tif'): +def convert_document_for_ocr(document, page=0, file_format=u'tif'): #Extract document file input_filepath = document_save_to_temp_dir(document, document.uuid) @@ -166,7 +166,7 @@ def convert_document_for_ocr(document, page=0, format='tif'): transformation_output_file = u'%s_trans%s%s%s' % (temp_path, page, os.extsep, format) unpaper_input_file = u'%s_unpaper_in%s%spnm' % (temp_path, page, os.extsep) unpaper_output_file = u'%s_unpaper_out%s%spnm' % (temp_path, page, os.extsep) - convert_output_file = u'%s_ocr%s%s%s' % (temp_path, page, os.extsep, format) + convert_output_file = u'%s_ocr%s%s%s' % (temp_path, page, os.extsep, file_format) input_arg = u'%s[%s]' % (input_filepath, page) @@ -195,4 +195,5 @@ def convert_document_for_ocr(document, page=0, format='tif'): cleanup(transformation_output_file) cleanup(unpaper_input_file) cleanup(unpaper_output_file) - return convert_output_file + + return convert_output_file diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index bef3d356c9..0f560d6a48 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -10,9 +10,9 @@ from common.conf import settings as common_settings from main.api import register_diagnostic from permissions.api import register_permissions -from models import Document, DocumentPage, DocumentPageTransformation -from staging import StagingFile -from conf.settings import ENABLE_SINGLE_DOCUMENT_UPLOAD +from documents.models import Document, DocumentPage, DocumentPageTransformation +from documents.staging import StagingFile +from documents.conf.settings import ENABLE_SINGLE_DOCUMENT_UPLOAD PERMISSION_DOCUMENT_CREATE = 'document_create' PERMISSION_DOCUMENT_PROPERTIES_EDIT = 'document_properties_edit' diff --git a/apps/documents/admin.py b/apps/documents/admin.py index 3cf196bbd3..bb0096d824 100644 --- a/apps/documents/admin.py +++ b/apps/documents/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from models import MetadataType, DocumentType, Document, \ +from documents.models import MetadataType, DocumentType, Document, \ DocumentTypeMetadataType, DocumentMetadata, DocumentTypeFilename, \ MetadataIndex, DocumentPage, MetadataGroup, \ MetadataGroupItem, DocumentPageTransformation, RecentDocument @@ -34,7 +34,10 @@ class DocumentTypeFilenameInline(admin.StackedInline): class DocumentTypeAdmin(admin.ModelAdmin): - inlines = [DocumentTypeFilenameInline, DocumentTypeMetadataTypeInline, MetadataIndexInline] + inlines = [ + DocumentTypeFilenameInline, DocumentTypeMetadataTypeInline, + MetadataIndexInline + ] class DocumentMetadataInline(admin.StackedInline): @@ -56,8 +59,10 @@ class DocumentPageInline(admin.StackedInline): class DocumentAdmin(admin.ModelAdmin): - inlines = [DocumentMetadataInline, DocumentMetadataIndexInline, - DocumentPageInline] + inlines = [ + DocumentMetadataInline, DocumentMetadataIndexInline, + DocumentPageInline + ] list_display = ('uuid', 'file_filename', 'file_extension') @@ -85,5 +90,6 @@ admin.site.register(MetadataType, MetadataTypeAdmin) admin.site.register(DocumentType, DocumentTypeAdmin) admin.site.register(Document, DocumentAdmin) admin.site.register(MetadataGroup, MetadataGroupAdmin) -admin.site.register(DocumentPageTransformation, DocumentPageTransformationAdmin) +admin.site.register(DocumentPageTransformation, + DocumentPageTransformationAdmin) admin.site.register(RecentDocument, RecentDocumentAdmin) diff --git a/apps/documents/conf/settings.py b/apps/documents/conf/settings.py index 6dcc4f8b08..23e6003449 100644 --- a/apps/documents/conf/settings.py +++ b/apps/documents/conf/settings.py @@ -19,17 +19,17 @@ def default_checksum(x): def default_uuid(): """unicode(uuid.uuid4())""" return unicode(uuid.uuid4()) - + default_available_functions = { - 'current_date':datetime.datetime.now().date, + 'current_date': datetime.datetime.now().date, } default_available_models = { - 'User':User + 'User': User } available_transformations = { - 'rotate': {'label':_(u'Rotate [degrees]'), 'arguments':[{'name':'degrees'}]} + 'rotate': {'label': _(u'Rotate [degrees]'), 'arguments': [{'name': 'degrees'}]} } available_indexing_functions = { diff --git a/apps/documents/forms.py b/apps/documents/forms.py index 13b51e65c2..f859d1db5b 100644 --- a/apps/documents/forms.py +++ b/apps/documents/forms.py @@ -8,12 +8,12 @@ from django.utils.safestring import mark_safe from django.forms.formsets import formset_factory from django.template.defaultfilters import capfirst -from staging import StagingFile +from documents.staging import StagingFile from common.wizard import BoundFormWizard from common.forms import DetailForm -from models import Document, DocumentType, DocumentTypeMetadataType, \ +from documents.models import Document, DocumentType, DocumentTypeMetadataType, \ DocumentPage, DocumentPageTransformation from documents.conf.settings import AVAILABLE_FUNCTIONS @@ -62,7 +62,9 @@ class DocumentPageForm(DetailForm): 'rotation': rotation }) - page_image = forms.CharField(label=_(u'Page image'), widget=DocumentPageImageWidget()) + page_image = forms.CharField( + label=_(u'Page image'), widget=DocumentPageImageWidget() + ) class DocumentPageForm_text(DetailForm): @@ -72,9 +74,11 @@ class DocumentPageForm_text(DetailForm): content = forms.CharField( label=_(u'Contents'), - widget=forms.widgets.Textarea(attrs={'rows': 18, 'cols': 80, 'readonly': 'readonly'})) - - + widget=forms.widgets.Textarea(attrs={ + 'rows': 18, 'cols': 80, 'readonly': 'readonly' + })) + + class DocumentPageForm_edit(forms.ModelForm): class Meta: model = DocumentPage @@ -88,7 +92,9 @@ class DocumentPageForm_edit(forms.ModelForm): 'page_label', 'content', ] - page_image = forms.CharField(required=False, widget=DocumentPageImageWidget()) + page_image = forms.CharField( + required=False, widget=DocumentPageImageWidget() + ) class ImageWidget(forms.widgets.Widget): @@ -145,7 +151,9 @@ class DocumentForm(forms.ModelForm): model = Document exclude = ('description',) - new_filename = forms.CharField(label=_('New document filename'), required=False) + new_filename = forms.CharField( + label=_('New document filename'), required=False + ) class DocumentPreviewForm(forms.Form): @@ -173,7 +181,9 @@ class DocumentContentForm(forms.Form): contents = forms.CharField( label=_(u'Contents'), - widget=forms.widgets.Textarea(attrs={'rows': 14, 'cols': 80, 'readonly': 'readonly'}) + widget=forms.widgets.Textarea(attrs={ + 'rows': 14, 'cols': 80, 'readonly': 'readonly' + }) ) @@ -193,7 +203,9 @@ class StagingDocumentForm(forms.Form): def __init__(self, *args, **kwargs): super(StagingDocumentForm, self).__init__(*args, **kwargs) try: - self.fields['staging_file_id'].choices = [(staging_file.id, staging_file) for staging_file in StagingFile.get_all()] + self.fields['staging_file_id'].choices = [ + (staging_file.id, staging_file) for staging_file in StagingFile.get_all() + ] except: pass @@ -207,7 +219,9 @@ class StagingDocumentForm(forms.Form): label=_(u'Quick document rename')) staging_file_id = forms.ChoiceField(label=_(u'Staging file')) - new_filename = forms.CharField(label=_('New document filename'), required=False) + new_filename = forms.CharField( + label=_('New document filename'), required=False + ) class DocumentTypeSelectForm(forms.Form): @@ -286,7 +300,9 @@ class DocumentCreateWizard(BoundFormWizard): def render_template(self, request, form, previous_fields, step, context=None): context = {'step_title': self.extra_context['step_titles'][step]} - return super(DocumentCreateWizard, self).render_template(request, form, previous_fields, step, context) + return super(DocumentCreateWizard, self).render_template( + request, form, previous_fields, step, context + ) def parse_params(self, request, *args, **kwargs): self.extra_context = {'step_titles': self.step_titles} @@ -331,7 +347,7 @@ class MetaDataImageWidget(forms.widgets.Widget): 'action': reverse('metadatagroup_view', args=[value['current_document'].pk, value['group'].pk]) }) output.append(u'') - + output.append(u'
') for document in value['group_data']: output.append( @@ -363,7 +379,7 @@ class MetaDataImageWidget(forms.widgets.Widget): ugettext(u'Click on the image for full size view of the first page.')) return mark_safe(u''.join(output)) - + class MetaDataGroupForm(forms.Form): def __init__(self, *args, **kwargs): diff --git a/apps/documents/metadata.py b/apps/documents/metadata.py index a3331912c5..f6fb1f4007 100644 --- a/apps/documents/metadata.py +++ b/apps/documents/metadata.py @@ -6,8 +6,7 @@ from urllib import unquote_plus from django.shortcuts import get_object_or_404 from django.core.exceptions import ObjectDoesNotExist - -from models import DocumentMetadata, MetadataType +from documents.models import DocumentMetadata, MetadataType def decode_metadata_from_url(url_dict): diff --git a/apps/documents/models.py b/apps/documents/models.py index aca6899cb2..e0c015c0bd 100644 --- a/apps/documents/models.py +++ b/apps/documents/models.py @@ -1,9 +1,7 @@ import os from datetime import datetime -import sys import tempfile -from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ from django.db.models import Q @@ -81,7 +79,7 @@ class Document(models.Model): @models.permalink def get_absolute_url(self): - return ('document_view_simple', [self.id]) + return ('document_view_simple', [self.pk]) def get_fullname(self): return os.extsep.join([self.file_filename, self.file_extension]) @@ -276,7 +274,7 @@ class DocumentPage(models.Model): @models.permalink def get_absolute_url(self): - return ('document_page_view', [self.id]) + return ('document_page_view', [self.pk]) class MetadataGroupManager(models.Manager): diff --git a/apps/documents/statistics.py b/apps/documents/statistics.py index 9a9d10d1d7..9c38493297 100644 --- a/apps/documents/statistics.py +++ b/apps/documents/statistics.py @@ -1,27 +1,27 @@ from django.utils.translation import ugettext as _ from common.utils import pretty_size, pretty_size_10 -from permissions.api import check_permissions from documents.conf.settings import STORAGE_BACKEND -from models import Document, DocumentType, DocumentPage +from documents.models import Document, DocumentType, DocumentPage def get_used_size(path, file_list): total_size = 0 for filename in file_list: try: - total_size += STORAGE_BACKEND().size(STORAGE_BACKEND.separator.join([path, filename])) + total_size += STORAGE_BACKEND().size(STORAGE_BACKEND.separator.join([path, filename])) except OSError: pass - + return total_size + def storage_count(path=u'.'): directories, files = STORAGE_BACKEND().listdir(path) total_count = len(files) total_size = get_used_size(path, files) - + for directory in directories: file_count, files_size = storage_count(directory) total_count += file_count @@ -31,31 +31,30 @@ def storage_count(path=u'.'): def get_statistics(): - total_db_documents = Document.objects.only('id',).count() + total_db_documents = Document.objects.only('pk',).count() paragraphs = [ _(u'Document types: %d') % DocumentType.objects.count(), _(u'Documents in database: %d') % total_db_documents, ] - - + try: total_storage_documents, storage_used_space = storage_count() paragraphs.append(_(u'Documents in storage: %d') % total_storage_documents) paragraphs.append(_(u'Space used in storage: %(base_2)s (base 2), %(base_10)s (base 10), %(bytes)d bytes') % { - 'base_2':pretty_size(storage_used_space), - 'base_10':pretty_size_10(storage_used_space), - 'bytes':storage_used_space + 'base_2': pretty_size(storage_used_space), + 'base_10': pretty_size_10(storage_used_space), + 'bytes': storage_used_space }) except NotImplementedError: pass paragraphs.append( - _(u'Document pages in database: %d') % DocumentPage.objects.only('id',).count(), + _(u'Document pages in database: %d') % DocumentPage.objects.only('pk',).count(), ) - + return { - 'title':_(u'Document statistics'), + 'title': _(u'Document statistics'), 'paragraphs': paragraphs } diff --git a/apps/documents/urls.py b/apps/documents/urls.py index c90615c1e0..dbf8e1dd4d 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -1,6 +1,4 @@ from django.conf.urls.defaults import patterns, url -from django.utils.translation import ugettext_lazy as _ -from django.views.generic.create_update import create_object, update_object from documents.conf.settings import PREVIEW_SIZE from documents.conf.settings import THUMBNAIL_SIZE @@ -10,7 +8,6 @@ from documents.conf.settings import ENABLE_SINGLE_DOCUMENT_UPLOAD from converter.api import QUALITY_HIGH - urlpatterns = patterns('documents.views', url(r'^document/list/$', 'document_list', (), 'document_list'), url(r'^document/list/recent/$', 'document_list_recent', (), 'document_list_recent'), @@ -57,7 +54,7 @@ urlpatterns = patterns('documents.views', url(r'^document/page/(?P\d+)/transformation/list/$', 'document_page_transformation_list', (), 'document_page_transformation_list'), url(r'^document/page/(?P\d+)/transformation/create/$', 'document_page_transformation_create', (), 'document_page_transformation_create'), - + url(r'^document/page/transformation/(?P\d+)/edit/$', 'document_page_transformation_edit', (), 'document_page_transformation_edit'), url(r'^document/page/transformation/(?P\d+)/delete/$', 'document_page_transformation_delete', (), 'document_page_transformation_delete'), diff --git a/apps/documents/views.py b/apps/documents/views.py index 07d93ca18f..4fcd853213 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -3,14 +3,13 @@ import urlparse import urllib from django.utils.translation import ugettext as _ -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponseRedirect from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.contrib import messages -from django.views.generic.list_detail import object_detail, object_list +from django.views.generic.list_detail import object_list from django.core.urlresolvers import reverse -from django.views.generic.create_update import create_object, delete_object, update_object -from django.core.files.base import File +from django.views.generic.create_update import delete_object, update_object from django.conf import settings from django.utils.http import urlencode from django.core.exceptions import ObjectDoesNotExist @@ -31,9 +30,7 @@ from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD from documents.conf.settings import USE_STAGING_DIRECTORY from documents.conf.settings import PREVIEW_SIZE from documents.conf.settings import THUMBNAIL_SIZE -from documents.conf.settings import GROUP_MAX_RESULTS from documents.conf.settings import GROUP_SHOW_EMPTY -from documents.conf.settings import DEFAULT_TRANSFORMATIONS from documents.conf.settings import UNCOMPRESS_COMPRESSED_LOCAL_FILES from documents.conf.settings import UNCOMPRESS_COMPRESSED_STAGING_FILES from documents.conf.settings import STORAGE_BACKEND @@ -46,23 +43,22 @@ from documents import PERMISSION_DOCUMENT_CREATE, \ PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_PROPERTIES_EDIT, \ PERMISSION_DOCUMENT_METADATA_EDIT, PERMISSION_DOCUMENT_VIEW, \ PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \ - PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_TOOLS, \ + PERMISSION_DOCUMENT_TRANSFORM, \ PERMISSION_DOCUMENT_EDIT -from forms import DocumentTypeSelectForm, DocumentCreateWizard, \ - MetadataForm, DocumentForm, DocumentForm_edit, DocumentForm_view, \ +from documents.forms import DocumentTypeSelectForm, DocumentCreateWizard, \ + DocumentForm, DocumentForm_edit, DocumentForm_view, \ StagingDocumentForm, DocumentTypeMetadataType, DocumentPreviewForm, \ MetadataFormSet, DocumentPageForm, DocumentPageTransformationForm, \ DocumentContentForm, DocumentPageForm_edit, MetaDataGroupForm, \ DocumentPageForm_text -from metadata import save_metadata_list, \ +from documents.metadata import save_metadata_list, \ decode_metadata_from_url, metadata_repr_as_list -from models import Document, DocumentMetadata, DocumentType, MetadataType, \ - DocumentPage, DocumentPageTransformation, RecentDocument, \ - MetadataGroup -from staging import StagingFile -from utils import document_save_to_temp_dir +from documents.models import Document, DocumentType, DocumentPage, \ + DocumentPageTransformation, RecentDocument, MetadataGroup +from documents.staging import StagingFile +from documents.utils import document_save_to_temp_dir from documents import metadata_group_link PICTURE_ERROR_SMALL = u'picture_error.png' @@ -107,10 +103,10 @@ def document_create_sibling(request, document_id, multiple=True): document = get_object_or_404(Document, pk=document_id) urldata = [] - for id, metadata in enumerate(document.documentmetadata_set.all()): + for pk, metadata in enumerate(document.documentmetadata_set.all()): if hasattr(metadata, 'value'): - urldata.append(('metadata%s_id' % id, metadata.metadata_type_id)) - urldata.append(('metadata%s_value' % id, metadata.value)) + urldata.append(('metadata%s_id' % pk, metadata.metadata_type_id)) + urldata.append(('metadata%s_value' % pk, metadata.value)) if multiple: view = 'upload_multiple_documents_with_type' @@ -314,13 +310,14 @@ def document_view(request, document_id): #If GROUP_SHOW_EMPTY is False, remove empty groups from #dictionary metadata_groups = dict([(group, data) for group, data in metadata_groups.items() if data]) - + if metadata_groups: subtemplates_dict.append( { - 'title':_(u'metadata groups (%s)') % len(metadata_groups.keys()), + 'title': _(u'metadata groups (%s)') % len(metadata_groups.keys()), 'form': MetaDataGroupForm(groups=metadata_groups, current_document=document, links=[ - metadata_group_link]), + metadata_group_link + ]), 'name': 'generic_form_subtemplate.html', 'form_action': reverse('metadatagroup_action'), 'submit_method': 'GET', @@ -332,8 +329,9 @@ def document_view(request, document_id): 'name': 'generic_list_subtemplate.html', 'title': _(u'index links'), 'object_list': document.documentmetadataindex_set.all(), - 'hide_link': True}) - + 'hide_link': True + }) + return render_to_response('generic_detail.html', { 'form_list': form_list, 'object': document, @@ -365,7 +363,8 @@ def document_delete(request, document_id=None, document_id_list=None): messages.success(request, _(u'Document: %s deleted successfully.') % document) except Exception, e: messages.error(request, _(u'Document: %(document)s delete error: %(error)s') % { - 'document': document, 'error': e}) + 'document': document, 'error': e + }) return HttpResponseRedirect(next) @@ -386,11 +385,15 @@ def document_delete(request, document_id=None, document_id_list=None): def document_multiple_delete(request): - return document_delete(request, document_id_list=request.GET.get('id_list', [])) + return document_delete( + request, document_id_list=request.GET.get('id_list', []) + ) def document_edit(request, document_id): - check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_PROPERTIES_EDIT]) + check_permissions( + request.user, 'documents', [PERMISSION_DOCUMENT_PROPERTIES_EDIT] + ) document = get_object_or_404(Document, pk=document_id) @@ -456,7 +459,7 @@ def document_edit_metadata(request, document_id=None, document_id_list=None): metadata = {} for document in documents: RecentDocument.objects.add_document_for_user(request.user, document) - + for item in DocumentTypeMetadataType.objects.filter(document_type=document.document_type): value = document.documentmetadata_set.get(metadata_type=item.metadata_type).value if document.documentmetadata_set.filter(metadata_type=item.metadata_type) else u'' if item.metadata_type in metadata: @@ -548,24 +551,24 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, quality=QUALITY_ pass tranformation_string = ' '.join(transformation_list) - + zoom = int(request.GET.get('zoom', 100)) if zoom < ZOOM_MIN_LEVEL: - zoom = ZOOM_MIN_LEVEL + zoom = ZOOM_MIN_LEVEL if zoom > ZOOM_MAX_LEVEL: - zoom = ZOOM_MAX_LEVEL + zoom = ZOOM_MAX_LEVEL rotation = int(request.GET.get('rotation', 0)) % 360 try: - filepath = in_image_cache(document.checksum, size=size, format=u'jpg', quality=quality, extra_options=tranformation_string, page=page - 1, zoom=zoom, rotation=rotation) + filepath = in_image_cache(document.checksum, size=size, file_format=u'jpg', quality=quality, extra_options=tranformation_string, page=page - 1, zoom=zoom, rotation=rotation) if filepath: return sendfile.sendfile(request, filename=filepath) #Save to a temporary location filepath = document_save_to_temp_dir(document, filename=document.checksum) - output_file = convert(filepath, size=size, format=u'jpg', quality=quality, extra_options=tranformation_string, page=page - 1, zoom=zoom, rotation=rotation) + output_file = convert(filepath, size=size, file_format=u'jpg', quality=quality, extra_options=tranformation_string, page=page - 1, zoom=zoom, rotation=rotation) return sendfile.sendfile(request, filename=output_file) except UnkownConvertError, e: if request.user.is_staff or request.user.is_superuser: @@ -611,9 +614,10 @@ def staging_file_preview(request, staging_file_id): try: output_file, errors = StagingFile.get(staging_file_id).preview() if errors and (request.user.is_staff or request.user.is_superuser): - messages.warning(request, _(u'Error for transformation %(transformation)s:, %(error)s') % - {'transformation': page_transformation.get_transformation_display(), - 'error': e}) + for error in errors: + messages.warning(request, _(u'Staging file transformation error:, %(error)s') % { + 'error': error + }) return sendfile.sendfile(request, filename=output_file) except UnkownConvertError, e: @@ -827,9 +831,9 @@ def document_view_simple(request, document_id): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) document = get_object_or_404(Document.objects.select_related(), pk=document_id) - + RecentDocument.objects.add_document_for_user(request.user, document) - + content_form = DocumentContentForm(document=document) preview_form = DocumentPreviewForm(document=document) @@ -864,19 +868,23 @@ def document_view_simple(request, document_id): #If GROUP_SHOW_EMPTY is False, remove empty groups from #dictionary metadata_groups = dict([(group, data) for group, data in metadata_groups.items() if data]) - + if metadata_groups: subtemplates_dict.append( { - 'title':_(u'metadata groups (%s)') % len(metadata_groups.keys()), - 'form': MetaDataGroupForm(groups=metadata_groups, current_document=document, links=[ - metadata_group_link]), + 'title': _(u'metadata groups (%s)') % len(metadata_groups.keys()), + 'form': MetaDataGroupForm( + groups=metadata_groups, current_document=document, + links=[ + metadata_group_link + ] + ), 'name': 'generic_form_subtemplate.html', 'form_action': reverse('metadatagroup_action'), 'submit_method': 'GET', } ) - + return render_to_response('generic_detail.html', { 'form_list': form_list, 'object': document, @@ -914,7 +922,7 @@ def document_page_view(request, document_page_id): zoom = int(request.GET.get('zoom', 100)) rotation = int(request.GET.get('rotation', 0)) document_page_form = DocumentPageForm(instance=document_page, zoom=zoom, rotation=rotation) - + form_list = [ { 'form': document_page_form, @@ -926,7 +934,7 @@ def document_page_view(request, document_page_id): 'object': document_page, 'web_theme_hide_menus': True, }, context_instance=RequestContext(request)) - + def document_page_text(request, document_page_id): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) @@ -945,8 +953,8 @@ def document_page_text(request, document_page_id): 'object': document_page, 'web_theme_hide_menus': True, }, context_instance=RequestContext(request)) - - + + def document_page_edit(request, document_page_id): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_EDIT]) @@ -983,7 +991,7 @@ def document_page_navigation_next(request, document_page_id): document_page = get_object_or_404(DocumentPage, document=document_page.document, page_number=document_page.page_number + 1) return HttpResponseRedirect(reverse(view, args=[document_page.pk])) - + def document_page_navigation_previous(request, document_page_id): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', '/')).path) @@ -996,7 +1004,7 @@ def document_page_navigation_previous(request, document_page_id): document_page = get_object_or_404(DocumentPage, document=document_page.document, page_number=document_page.page_number - 1) return HttpResponseRedirect(reverse(view, args=[document_page.pk])) - + def document_page_navigation_first(request, document_page_id): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', '/')).path) @@ -1037,7 +1045,7 @@ def transform_page(request, document_page_id, zoom_function=None, rotation_funct # parse_qs return a dictionary whose values are lists zoom = int(urlparse.parse_qs(query).get('zoom', ['100'])[0]) rotation = int(urlparse.parse_qs(query).get('rotation', ['0'])[0]) - + if zoom_function: zoom = zoom_function(zoom) @@ -1056,23 +1064,23 @@ def document_page_zoom_in(request, document_page_id): return transform_page( request, document_page_id, - zoom_function = lambda x: ZOOM_MAX_LEVEL if x + ZOOM_PERCENT_STEP > ZOOM_MAX_LEVEL else x + ZOOM_PERCENT_STEP + zoom_function=lambda x: ZOOM_MAX_LEVEL if x + ZOOM_PERCENT_STEP > ZOOM_MAX_LEVEL else x + ZOOM_PERCENT_STEP ) - + def document_page_zoom_out(request, document_page_id): return transform_page( request, document_page_id, - zoom_function = lambda x: ZOOM_MIN_LEVEL if x - ZOOM_PERCENT_STEP < ZOOM_MIN_LEVEL else x - ZOOM_PERCENT_STEP + zoom_function=lambda x: ZOOM_MIN_LEVEL if x - ZOOM_PERCENT_STEP < ZOOM_MIN_LEVEL else x - ZOOM_PERCENT_STEP ) - - + + def document_page_rotate_right(request, document_page_id): return transform_page( request, document_page_id, - rotation_function = lambda x: (x + ROTATION_STEP) % 360 + rotation_function=lambda x: (x + ROTATION_STEP) % 360 ) @@ -1080,7 +1088,7 @@ def document_page_rotate_left(request, document_page_id): return transform_page( request, document_page_id, - rotation_function = lambda x: (x - ROTATION_STEP) % 360 + rotation_function=lambda x: (x - ROTATION_STEP) % 360 ) @@ -1101,7 +1109,7 @@ def metadatagroup_view(request, document_id, metadata_group_id): metadata_group = get_object_or_404(MetadataGroup, pk=metadata_group_id) object_list, errors = document.get_metadata_groups(metadata_group) - + return render_to_response('generic_list.html', { 'object_list': object_list, 'title': _(u'documents in group: %s, for document: %s') % (metadata_group, document), diff --git a/apps/dynamic_search/api.py b/apps/dynamic_search/api.py index c0721b9bb5..01cb544e55 100644 --- a/apps/dynamic_search/api.py +++ b/apps/dynamic_search/api.py @@ -1,10 +1,13 @@ +# original code from: +# http://www.julienphalip.com/blog/2008/08/16/adding-search-django-site-snap/ + import re import types import datetime from django.db.models import Q -from conf.settings import LIMIT +from dynamic_search.conf.settings import LIMIT search_list = {} @@ -15,29 +18,26 @@ def register(model, text, field_list): else: search_list[model] = {'fields': field_list, 'text': text} -#original code from: -#http://www.julienphalip.com/blog/2008/08/16/adding-search-django-site-snap/ - def normalize_query(query_string, findterms=re.compile(r'"([^"]+)"|(\S+)').findall, normspace=re.compile(r'\s{2,}').sub): - ''' Splits the query string in invidual keywords, getting rid of unecessary spaces + """ Splits the query string in invidual keywords, getting rid of unecessary spaces and grouping quoted words together. Example: >>> normalize_query(' some random words "with quotes " and spaces') ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] - ''' + """ return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] -def get_query(query_string, terms, search_fields): - ''' Returns a query, that is a combination of Q objects. That combination +def get_query(terms, search_fields): + """ + Returns a query, that is a combination of Q objects. That combination aims to search keywords within a model by testing the given search fields. - - ''' + """ queries = [] for term in terms: or_query = None @@ -47,7 +47,7 @@ def get_query(query_string, terms, search_fields): field_name = field elif isinstance(field, types.DictType): comparison = field.get('comparison', u'icontains') - field_name = field.get('field_name', '') + field_name = field.get('field_name', u'') if field_name: q = Q(**{'%s__%s' % (field_name, comparison): term}) @@ -72,7 +72,7 @@ def perform_search(query_string): terms = normalize_query(query_string) for model, data in search_list.items(): - queries = get_query(query_string, terms, data['fields']) + queries = get_query(terms, data['fields']) model_result_ids = None for query in queries: diff --git a/apps/dynamic_search/views.py b/apps/dynamic_search/views.py index 3077f0780b..11896180d2 100644 --- a/apps/dynamic_search/views.py +++ b/apps/dynamic_search/views.py @@ -4,9 +4,9 @@ from django.utils.translation import ugettext as _ from django.contrib import messages from django.conf import settings -from api import perform_search -from forms import SearchForm -from conf.settings import SHOW_OBJECT_TYPE +from dynamic_search.api import perform_search +from dynamic_search.forms import SearchForm +from dynamic_search.conf.settings import SHOW_OBJECT_TYPE def results(request, form=None): diff --git a/apps/filesystem_serving/__init__.py b/apps/filesystem_serving/__init__.py index b52f872283..61818080c1 100644 --- a/apps/filesystem_serving/__init__.py +++ b/apps/filesystem_serving/__init__.py @@ -7,8 +7,8 @@ from permissions.api import register_permissions FILESYSTEM_SERVING_RECREATE_LINKS = 'recreate_links' register_permissions('filesystem_serving', [ - {'name':FILESYSTEM_SERVING_RECREATE_LINKS, 'label':_(u'Recreate filesystem links.')}, + {'name': FILESYSTEM_SERVING_RECREATE_LINKS, 'label':_(u'Recreate filesystem links.')}, ]) -filesystem_serving_recreate_all_links = {'text':_('recreate index links'), 'view':'recreate_all_links', 'famfam':'page_link', 'permissions':{'namespace':'filesystem_serving', 'permissions':[FILESYSTEM_SERVING_RECREATE_LINKS]}} +filesystem_serving_recreate_all_links = {'text': _('recreate index links'), 'view': 'recreate_all_links', 'famfam': 'page_link', 'permissions': {'namespace': 'filesystem_serving', 'permissions': [FILESYSTEM_SERVING_RECREATE_LINKS]}} diff --git a/apps/filesystem_serving/admin.py b/apps/filesystem_serving/admin.py index 246f23d85a..a8ee833907 100644 --- a/apps/filesystem_serving/admin.py +++ b/apps/filesystem_serving/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from models import DocumentMetadataIndex +from filesystem_serving.models import DocumentMetadataIndex + class DocumentMetadataIndexInline(admin.StackedInline): model = DocumentMetadataIndex diff --git a/apps/filesystem_serving/api.py b/apps/filesystem_serving/api.py index 2a75e33533..20e0f421a2 100644 --- a/apps/filesystem_serving/api.py +++ b/apps/filesystem_serving/api.py @@ -1,5 +1,6 @@ import errno import os + from django.template.defaultfilters import slugify from django.utils.translation import ugettext_lazy as _ @@ -10,7 +11,7 @@ from filesystem_serving.conf.settings import FILESERVING_PATH from filesystem_serving.conf.settings import SLUGIFY_PATHS from filesystem_serving.conf.settings import MAX_RENAME_COUNT -from models import DocumentMetadataIndex, Document +from filesystem_serving.models import DocumentMetadataIndex, Document if SLUGIFY_PATHS == False: #Do not slugify path or filenames and extensions diff --git a/apps/filesystem_serving/views.py b/apps/filesystem_serving/views.py index 1a79cb86b3..9f9c83d906 100644 --- a/apps/filesystem_serving/views.py +++ b/apps/filesystem_serving/views.py @@ -4,12 +4,10 @@ from django.shortcuts import render_to_response from django.template import RequestContext from django.contrib import messages - from permissions.api import check_permissions - from filesystem_serving import FILESYSTEM_SERVING_RECREATE_LINKS -from api import do_recreate_all_links +from filesystem_serving.api import do_recreate_all_links def recreate_all_links(request): diff --git a/apps/folders/__init__.py b/apps/folders/__init__.py index f4a1344d60..9c56b6cd14 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -5,7 +5,7 @@ from navigation.api import register_links, register_menu, \ from permissions.api import register_permissions from navigation.api import register_sidebar_template -from models import Folder +from folders.models import Folder folder_list = {'text': _(u'folder list'), 'view': 'folder_list', 'famfam': 'folder'} folder_create = {'text': _('create folder'), 'view': 'folder_create', 'famfam': 'folder_add'} diff --git a/apps/folders/admin.py b/apps/folders/admin.py index 783a5f6623..8304db276d 100644 --- a/apps/folders/admin.py +++ b/apps/folders/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from models import Folder, FolderDocument +from folders.models import Folder, FolderDocument class FolderDocumentInline(admin.StackedInline): @@ -8,10 +8,10 @@ class FolderDocumentInline(admin.StackedInline): extra = 1 classes = ('collapse-open',) allow_add = True - - + + class FolderAdmin(admin.ModelAdmin): inlines = [FolderDocumentInline] - + admin.site.register(Folder, FolderAdmin) diff --git a/apps/folders/forms.py b/apps/folders/forms.py index 5a6c427e02..0d6b98f03b 100644 --- a/apps/folders/forms.py +++ b/apps/folders/forms.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import ugettext as _ -from models import Folder +from folders.models import Folder class FolderForm(forms.ModelForm): @@ -17,9 +17,7 @@ class AddDocumentForm(forms.ModelForm): self.fields['existing_folder'] = forms.ModelChoiceField(required=False, queryset=Folder.objects.filter(user=user)) self.fields['title'].required = False self.fields['title'].label = _(u'New folder') - + class Meta: model = Folder fields = ('title',) - - diff --git a/apps/folders/models.py b/apps/folders/models.py index eeeaa8ead0..d41d25c6e4 100644 --- a/apps/folders/models.py +++ b/apps/folders/models.py @@ -11,7 +11,7 @@ class Folder(models.Model): title = models.CharField(max_length=32, verbose_name=_(u'title'), db_index=True) user = models.ForeignKey(User, verbose_name=_(u'user')) datetime_created = models.DateTimeField(verbose_name=_(u'datetime created')) - + def __unicode__(self): return self.title @@ -29,12 +29,12 @@ class Folder(models.Model): ordering = ('title',) verbose_name = _(u'folder') verbose_name_plural = _(u'folders') - + class FolderDocument(models.Model): folder = models.ForeignKey(Folder, verbose_name=_('folder')) document = models.ForeignKey(Document, verbose_name=_('document')) - + def __unicode__(self): return unicode(self.document) diff --git a/apps/folders/templatetags/folder_tags.py b/apps/folders/templatetags/folder_tags.py index 1083fd6846..99d7c60b3e 100644 --- a/apps/folders/templatetags/folder_tags.py +++ b/apps/folders/templatetags/folder_tags.py @@ -1,19 +1,19 @@ -from django.core.urlresolvers import reverse, NoReverseMatch -from django.template import TemplateSyntaxError, Library, \ - VariableDoesNotExist, Node, Variable +from django.core.urlresolvers import reverse +from django.template import Library + from django.utils.translation import ugettext as _ from folders.forms import AddDocumentForm register = Library() - - + + @register.inclusion_tag('generic_form_subtemplate.html', takes_context=True) def get_add_document_to_folder_form(context): context.update({ 'form': AddDocumentForm(user=context['request'].user), 'request': context['request'], - 'form_action': reverse('folder_add_document' ,args=[context['object'].pk]), + 'form_action': reverse('folder_add_document', args=[context['object'].pk]), 'title': _('Add document to a folder') }) return context diff --git a/apps/folders/views.py b/apps/folders/views.py index 5171ce77a1..487205e60f 100644 --- a/apps/folders/views.py +++ b/apps/folders/views.py @@ -1,19 +1,18 @@ from django.utils.translation import ugettext as _ -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponseRedirect from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.contrib import messages -from django.views.generic.list_detail import object_detail, object_list +from django.views.generic.list_detail import object_list from django.core.urlresolvers import reverse -from django.views.generic.create_update import create_object, delete_object, update_object from django.core.exceptions import PermissionDenied from documents import PERMISSION_DOCUMENT_VIEW from documents.models import Document from permissions.api import check_permissions -from models import Folder, FolderDocument -from forms import FolderForm, AddDocumentForm +from folders.models import Folder, FolderDocument +from folders.forms import FolderForm, AddDocumentForm def folder_list(request): @@ -44,7 +43,7 @@ def folder_create(request): messages.error(request, _(u'A folder named: %s, already exists.') % form.cleaned_data['title']) else: form = FolderForm() - + return render_to_response('generic_form.html', { 'title': _(u'create folder'), 'form': form, @@ -61,7 +60,7 @@ def folder_edit(request, folder_id): if request.method == 'POST': form = FolderForm(request.POST) if form.is_valid(): - folder.title=form.cleaned_data['title'] + folder.title = form.cleaned_data['title'] try: folder.save() messages.success(request, _(u'Folder edited successfully')) @@ -70,7 +69,7 @@ def folder_edit(request, folder_id): messages.error(request, _(u'Error editing folder; %s') % e) else: form = FolderForm(instance=folder) - + return render_to_response('generic_form.html', { 'title': _(u'edit folder: %s') % folder, 'form': form, @@ -115,10 +114,10 @@ def folder_delete(request, folder_id): def folder_view(request, folder_id): folder = get_object_or_404(Folder, pk=folder_id) - + if not request.user.is_staff and not request.user.is_superuser and not request.user == folder.user: raise PermissionDenied - + return render_to_response('generic_list.html', { 'object_list': folder.folderdocument_set.all(), 'extra_columns': [ @@ -137,8 +136,8 @@ def folder_view(request, folder_id): 'object': folder, 'object_name': _(u'folder'), }, context_instance=RequestContext(request)) - - + + def folder_add_document(request, document_id): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) document = get_object_or_404(Document, pk=document_id) @@ -173,7 +172,7 @@ def folder_add_document(request, document_id): def folder_document_remove(request, folder_document_id=None, folder_document_id_list=None): post_action_redirect = None - + if folder_document_id: folder_documents = [get_object_or_404(FolderDocument, pk=folder_document_id)] elif folder_document_id_list: diff --git a/apps/main/views.py b/apps/main/views.py index 5b0a619754..4f1b7f9130 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -29,7 +29,7 @@ def check_settings(request): {'name': 'MAIN_SIDE_BAR_SEARCH', 'value': main_settings.SIDE_BAR_SEARCH, 'description': main_settings.setting_description}, - + {'name': 'DOCUMENTS_METADATA_AVAILABLE_FUNCTIONS', 'value': documents_settings.AVAILABLE_FUNCTIONS}, {'name': 'DOCUMENTS_METADATA_AVAILABLE_MODELS', 'value': documents_settings.AVAILABLE_MODELS}, {'name': 'DOCUMENTS_INDEXING_AVAILABLE_INDEXING_FUNCTIONS', 'value': documents_settings.AVAILABLE_INDEXING_FUNCTIONS}, @@ -151,12 +151,14 @@ def statistics(request): return render_to_response('statistics.html', { 'blocks': blocks, - 'title': _(u'Statistics') }, + 'title': _(u'Statistics') + }, context_instance=RequestContext(request)) def diagnostics_view(request): return render_to_response('diagnostics.html', { 'blocks': diagnostics, - 'title': _(u'Diagnostics') }, + 'title': _(u'Diagnostics') + }, context_instance=RequestContext(request)) diff --git a/apps/navigation/api.py b/apps/navigation/api.py index 633a3fff0f..83f5ce1b24 100644 --- a/apps/navigation/api.py +++ b/apps/navigation/api.py @@ -63,7 +63,7 @@ def register_model_list_columns(model, columns): model_list_columns[model].extend(columns) else: model_list_columns[model] = copy.copy(columns) - + def register_sidebar_template(source_list, template_name): for source in source_list: diff --git a/apps/navigation/templatetags/navigation_tags.py b/apps/navigation/templatetags/navigation_tags.py index a8260137e5..1ef1b16571 100644 --- a/apps/navigation/templatetags/navigation_tags.py +++ b/apps/navigation/templatetags/navigation_tags.py @@ -62,7 +62,7 @@ class NavigationNode(Node): @register.tag def main_navigation(parser, token): - args = token.split_contents() + #args = token.split_contents() # if len(args) != 3 or args[1] != 'as': # raise TemplateSyntaxError("'get_all_states' requires 'as variable' (got %r)" % args) diff --git a/apps/ocr/__init__.py b/apps/ocr/__init__.py index bce1e9a79b..34d0763e6c 100644 --- a/apps/ocr/__init__.py +++ b/apps/ocr/__init__.py @@ -10,8 +10,8 @@ from permissions.api import register_permissions from documents.models import Document from ocr.conf.settings import AUTOMATIC_OCR -from models import DocumentQueue, QueueDocument -from literals import QUEUEDOCUMENT_STATE_PROCESSING, \ +from ocr.models import DocumentQueue, QueueDocument +from ocr.literals import QUEUEDOCUMENT_STATE_PROCESSING, \ QUEUEDOCUMENT_STATE_PENDING, DOCUMENTQUEUE_STATE_STOPPED, \ DOCUMENTQUEUE_STATE_ACTIVE diff --git a/apps/ocr/admin.py b/apps/ocr/admin.py index c3f19c37bd..cdb22c7c5b 100644 --- a/apps/ocr/admin.py +++ b/apps/ocr/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from models import DocumentQueue, QueueDocument +from ocr.models import DocumentQueue, QueueDocument class QueueDocumentInline(admin.StackedInline): diff --git a/apps/ocr/api.py b/apps/ocr/api.py index 0ec18988ad..14c71e8542 100644 --- a/apps/ocr/api.py +++ b/apps/ocr/api.py @@ -15,7 +15,7 @@ from documents.models import DocumentPage from ocr.conf.settings import TESSERACT_PATH from ocr.conf.settings import TESSERACT_LANGUAGE from ocr.conf.settings import PDFTOTEXT_PATH -from exceptions import TesseractError, PdftotextError +from ocr.exceptions import TesseractError, PdftotextError def get_language_backend(): @@ -59,7 +59,7 @@ def run_pdftotext(input_filename, output_filename, page_number=None): if return_code != 0: error_text = proc.stderr.read() raise PdftotextError(error_text) - + def do_document_ocr(document): for page_index, document_page in enumerate(document.documentpage_set.all()): diff --git a/apps/ocr/exceptions.py b/apps/ocr/exceptions.py index cc16c93a19..4bfa8f725a 100644 --- a/apps/ocr/exceptions.py +++ b/apps/ocr/exceptions.py @@ -4,7 +4,7 @@ class AlreadyQueued(Exception): class TesseractError(Exception): pass - - + + class PdftotextError(Exception): pass diff --git a/apps/ocr/lang/eng.py b/apps/ocr/lang/eng.py index 91cdc752ac..07b46d1757 100644 --- a/apps/ocr/lang/eng.py +++ b/apps/ocr/lang/eng.py @@ -1,5 +1,6 @@ import re + def check_word(word): ALL_ALPHANUM = re.compile('([0-9a-z])', re.I) NON_ALPHANUM = re.compile('([^0-9a-z])', re.I) @@ -13,7 +14,7 @@ def check_word(word): if len(word) > 20: return None - #(A) If a string's ratio of alphanumeric characters to total + #(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 @@ -21,18 +22,17 @@ def check_word(word): #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 if TOO_MANY_VOWELS.findall(word): - return None + return None #Removed words with too many consecutie consonants if TOO_MANY_CONSONANTS.findall(word): - return None + return None #Only allow specific single letter words if len(word) == 1 and not SINGLE_LETTER_WORDS.findall(word): return None - + return word - diff --git a/apps/ocr/lang/spa.py b/apps/ocr/lang/spa.py index 149b2d9201..62fc49452e 100644 --- a/apps/ocr/lang/spa.py +++ b/apps/ocr/lang/spa.py @@ -1,6 +1,7 @@ -# -*- coding: iso-8859-1 -*- +# -*- coding: utf-8 -*- import re + def check_word(word): ALL_ALPHANUM = re.compile('([0-9a-záéíóúüñ])', re.I) NON_ALPHANUM = re.compile('([^0-9a-záéíóúüñ])', re.I) @@ -14,7 +15,7 @@ def check_word(word): if len(word) > 20: return None - #(A) If a string’s ratio of alphanumeric characters to total + #(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 @@ -22,18 +23,17 @@ def check_word(word): #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 if TOO_MANY_VOWELS.findall(word): - return None + return None #Removed words with too many consecutie consonants if TOO_MANY_CONSONANTS.findall(word): - return None + return None #Only allow specific single letter words if len(word) == 1 and not SINGLE_LETTER_WORDS.findall(word): return None - + return word - diff --git a/apps/ocr/models.py b/apps/ocr/models.py index e42418b84e..3434a6d4a6 100644 --- a/apps/ocr/models.py +++ b/apps/ocr/models.py @@ -5,10 +5,10 @@ from django.core.exceptions import ObjectDoesNotExist from documents.models import Document -from literals import DOCUMENTQUEUE_STATE_STOPPED, \ +from ocr.literals import DOCUMENTQUEUE_STATE_STOPPED, \ DOCUMENTQUEUE_STATE_CHOICES, QUEUEDOCUMENT_STATE_PENDING, \ QUEUEDOCUMENT_STATE_CHOICES -from exceptions import AlreadyQueued +from ocr.exceptions import AlreadyQueued class DocumentQueueManager(models.Manager): diff --git a/apps/ocr/statistics.py b/apps/ocr/statistics.py index 3d5728b94e..d6ceb9e198 100644 --- a/apps/ocr/statistics.py +++ b/apps/ocr/statistics.py @@ -1,7 +1,6 @@ from django.utils.translation import ugettext as _ - -from models import DocumentQueue, QueueDocument +from ocr.models import DocumentQueue, QueueDocument def get_statistics(): diff --git a/apps/ocr/tasks.py b/apps/ocr/tasks.py index a191f31ac8..1cc4e9eff9 100644 --- a/apps/ocr/tasks.py +++ b/apps/ocr/tasks.py @@ -9,10 +9,10 @@ from celery.task import PeriodicTask from celery.decorators import task from ocr.api import do_document_ocr -from literals import QUEUEDOCUMENT_STATE_PENDING, \ +from ocr.literals import QUEUEDOCUMENT_STATE_PENDING, \ QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_ACTIVE, \ QUEUEDOCUMENT_STATE_ERROR -from models import QueueDocument, DocumentQueue +from ocr.models import QueueDocument, DocumentQueue from ocr.conf.settings import NODE_CONCURRENT_EXECUTION from ocr.conf.settings import REPLICATION_DELAY diff --git a/apps/ocr/views.py b/apps/ocr/views.py index bb7aa13f3c..3386c028a2 100644 --- a/apps/ocr/views.py +++ b/apps/ocr/views.py @@ -14,12 +14,12 @@ from documents.models import Document from ocr import PERMISSION_OCR_DOCUMENT, PERMISSION_OCR_DOCUMENT_DELETE, \ PERMISSION_OCR_QUEUE_ENABLE_DISABLE, PERMISSION_OCR_CLEAN_ALL_PAGES -from models import DocumentQueue, QueueDocument -from literals import QUEUEDOCUMENT_STATE_PENDING, \ +from ocr.models import DocumentQueue, QueueDocument +from ocr.literals import QUEUEDOCUMENT_STATE_PENDING, \ QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_STOPPED, \ DOCUMENTQUEUE_STATE_ACTIVE -from exceptions import AlreadyQueued -from api import clean_pages +from ocr.exceptions import AlreadyQueued +from ocr.api import clean_pages def _display_thumbnail(ocr_document): @@ -65,15 +65,13 @@ def queue_document_list(request, queue_name='default'): ) -def queue_document_delete(request, queue_document_id=None, queue_document_id_list=[]): +def queue_document_delete(request, queue_document_id=None, queue_document_id_list=None): check_permissions(request.user, 'ocr', [PERMISSION_OCR_DOCUMENT_DELETE]) if queue_document_id: queue_documents = [get_object_or_404(QueueDocument, pk=queue_document_id)] - post_redirect = None elif queue_document_id_list: queue_documents = [get_object_or_404(QueueDocument, pk=queue_document_id) for queue_document_id in queue_document_id_list.split(',')] - post_redirect = None else: messages.error(request, _(u'Must provide at least one queue document.')) return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) @@ -138,15 +136,13 @@ def submit_document_to_queue(request, document, post_submit_redirect=None): return HttpResponseRedirect(post_submit_redirect) -def re_queue_document(request, queue_document_id=None, queue_document_id_list=[]): +def re_queue_document(request, queue_document_id=None, queue_document_id_list=None): check_permissions(request.user, 'ocr', [PERMISSION_OCR_DOCUMENT]) if queue_document_id: queue_documents = [get_object_or_404(QueueDocument, pk=queue_document_id)] - post_redirect = None elif queue_document_id_list: queue_documents = [get_object_or_404(QueueDocument, pk=queue_document_id) for queue_document_id in queue_document_id_list.split(',')] - post_redirect = None else: messages.error(request, _(u'Must provide at least one queue document.')) return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) diff --git a/apps/permissions/__init__.py b/apps/permissions/__init__.py index 62aabdc89e..5f123b3e09 100644 --- a/apps/permissions/__init__.py +++ b/apps/permissions/__init__.py @@ -6,7 +6,7 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import register_links, register_menu from permissions.conf.settings import DEFAULT_ROLES -from models import Role +from permissions.models import Role PERMISSION_ROLE_VIEW = 'role_view' PERMISSION_ROLE_EDIT = 'role_edit' diff --git a/apps/permissions/admin.py b/apps/permissions/admin.py index 8fd827998e..1728199d71 100644 --- a/apps/permissions/admin.py +++ b/apps/permissions/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from models import Permission, PermissionHolder, Role, RoleMember +from permissions.models import Permission, PermissionHolder, Role, RoleMember + class PermissionHolderInline(admin.StackedInline): model = PermissionHolder @@ -24,8 +25,7 @@ class RoleMemberInline(admin.StackedInline): class RoleAdmin(admin.ModelAdmin): inlines = [RoleMemberInline] - + admin.site.register(Permission, PermissionAdmin) admin.site.register(Role, RoleAdmin) - diff --git a/apps/permissions/api.py b/apps/permissions/api.py index 95731f98f3..15fa2a253f 100644 --- a/apps/permissions/api.py +++ b/apps/permissions/api.py @@ -11,7 +11,7 @@ from permissions import PERMISSION_ROLE_VIEW, PERMISSION_ROLE_EDIT, \ PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE, \ PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE -from models import Permission, Role +from permissions.models import Permission, Role def register_permissions(namespace, permissions): @@ -66,7 +66,7 @@ def check_requester(requester, permission_holder): #TODO: a role may contain groups, make recursive def check_elements(requester, requester_list): - ct = ContentType.objects.get_for_model(requester) + #ct = ContentType.objects.get_for_model(requester) for requester_object in requester_list: if requester == requester_object: return True diff --git a/apps/permissions/forms.py b/apps/permissions/forms.py index ae8ac4c384..f988339e17 100644 --- a/apps/permissions/forms.py +++ b/apps/permissions/forms.py @@ -1,10 +1,9 @@ -from django.conf import settings from django import forms from django.utils.translation import ugettext_lazy as _ from common.forms import DetailForm -from models import Role, RoleMember +from permissions.models import Role class RoleForm(forms.ModelForm): @@ -24,6 +23,6 @@ class ChoiceForm(forms.Form): super(ChoiceForm, self).__init__(*args, **kwargs) self.fields['selection'].choices = choices self.fields['selection'].label = label - self.fields['selection'].widget.attrs.update({'size':14}) + self.fields['selection'].widget.attrs.update({'size': 14}) selection = forms.MultipleChoiceField() diff --git a/apps/permissions/models.py b/apps/permissions/models.py index 6b9a2edef3..2319cf7c5d 100644 --- a/apps/permissions/models.py +++ b/apps/permissions/models.py @@ -7,7 +7,7 @@ from django.contrib.contenttypes import generic class PermissionManager(models.Manager): def get_for_holder(self, holder): ct = ContentType.objects.get_for_model(holder) - return [Permission.objects.get(id=id) for id in PermissionHolder.objects.filter(holder_type=ct, holder_id=holder.id).values_list('permission_id', flat=True)] + return [Permission.objects.get(pk=pk) for pk in PermissionHolder.objects.filter(holder_type=ct, holder_id=holder.pk).values_list('permission_id', flat=True)] class Permission(models.Model): @@ -56,7 +56,7 @@ class Role(models.Model): role_member, created = RoleMember.objects.get_or_create( role=self, member_type=ContentType.objects.get_for_model(member), - member_id=member.id) + member_id=member.pk) def __unicode__(self): return self.label diff --git a/apps/permissions/views.py b/apps/permissions/views.py index 0e439744c8..ca241e7d1e 100644 --- a/apps/permissions/views.py +++ b/apps/permissions/views.py @@ -10,12 +10,12 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.contrib.auth.models import User -from models import Role, Permission, PermissionHolder, RoleMember -from forms import RoleForm, RoleForm_view, ChoiceForm +from permissions.models import Role, Permission, PermissionHolder, RoleMember +from permissions.forms import RoleForm, RoleForm_view, ChoiceForm from permissions import PERMISSION_ROLE_VIEW, PERMISSION_ROLE_EDIT, \ PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE, PERMISSION_PERMISSION_GRANT, \ PERMISSION_PERMISSION_REVOKE -from api import check_permissions +from permissions.api import check_permissions def role_list(request): diff --git a/apps/storage/backends/gridfsstorage.py b/apps/storage/backends/gridfsstorage.py index c7b9106f33..bb1c2f74a1 100644 --- a/apps/storage/backends/gridfsstorage.py +++ b/apps/storage/backends/gridfsstorage.py @@ -6,19 +6,17 @@ from django.utils.encoding import force_unicode from pymongo import Connection from gridfs import GridFS - from storage.conf import settings class GridFSStorage(Storage): separator = u'/' - + def __init__(self, *args, **kwargs): self.db = Connection(host=settings.GRIDFS_HOST, port=settings.GRIDFS_PORT)[settings.GRIDFS_DATABASE_NAME] self.fs = GridFS(self.db) - def save(self, name, content): #TODO: if exists add _ plus a counter while True: @@ -37,7 +35,7 @@ class GridFSStorage(Storage): newfile.write(chunk) finally: newfile.close() - except Exception, e:#OSError, e: + except Exception, e: # OSError, e: # if e.errno == errno.EEXIST: # # Ooops, the file exists. We need a new file name. # name = self.get_available_name(name) @@ -51,34 +49,28 @@ class GridFSStorage(Storage): return name - def open(self, name, *args, **kwars): return self.fs.get_last_version(name) - def delete(self, name): oid = self.fs.get_last_version(name)._id self.fs.delete(oid) - def exists(self, name): - return self.fs.exists(filename=name) - + return self.fs.exists(filename=name) def path(self, name): return force_unicode(name) - def size(self, name): return self.fs.get_last_version(name).length - - - def move(self, old_file_name, name, chunk_size=1024*64): + + def move(self, old_file_name, name, chunk_size=1024 * 64): # first open the old file, so that it won't go away old_file = open(old_file_name, 'rb') try: newfile = self.fs.new_file(filename=name) - + try: current_chunk = None while current_chunk != '': @@ -92,10 +84,9 @@ class GridFSStorage(Storage): try: os.remove(old_file_name) except OSError, e: - # Certain operating systems (Cygwin and Windows) - # fail when deleting opened files, ignore it. (For the + # Certain operating systems (Cygwin and Windows) + # fail when deleting opened files, ignore it. (For the # systems where this happens, temporary files will be auto-deleted # on close anyway.) if getattr(e, 'winerror', 0) != 32 and getattr(e, 'errno', 0) != 13: raise - diff --git a/apps/web_theme/templatetags/styling.py b/apps/web_theme/templatetags/styling.py index a9b7adf5c4..8e77be88fc 100644 --- a/apps/web_theme/templatetags/styling.py +++ b/apps/web_theme/templatetags/styling.py @@ -1,7 +1,5 @@ -from django import forms -from django.template import TemplateSyntaxError, Library, \ - VariableDoesNotExist, Node, Variable -from django.conf import settings +from django import forms +from django.template import Library, Node, Variable register = Library() @@ -9,21 +7,20 @@ register = Library() class StylingNode(Node): def __init__(self, form_name, *args, **kwargs): self.form_name = form_name - + def render(self, context): form = Variable(self.form_name).resolve(context) for field_name, field in form.fields.items(): if isinstance(field.widget, forms.widgets.TextInput): - field.widget.attrs['class'] = 'text_field' + field.widget.attrs['class'] = u'text_field' elif isinstance(field.widget, forms.widgets.PasswordInput): - field.widget.attrs['class'] = 'text_field' + field.widget.attrs['class'] = u'text_field' elif isinstance(field.widget, forms.widgets.Textarea): - field.widget.attrs['class'] = 'text_area' + field.widget.attrs['class'] = u'text_area' context[self.form_name] = form - return '' - + return '' @register.tag diff --git a/apps/web_theme/templatetags/theme_tags.py b/apps/web_theme/templatetags/theme_tags.py index d599c1e4c8..ae1e3cbe36 100644 --- a/apps/web_theme/templatetags/theme_tags.py +++ b/apps/web_theme/templatetags/theme_tags.py @@ -1,12 +1,7 @@ -import types import re from django.conf import settings -from django.core.urlresolvers import reverse, NoReverseMatch -from django.core.urlresolvers import RegexURLResolver, RegexURLPattern, Resolver404, get_resolver -from django.template import TemplateSyntaxError, Library, \ - VariableDoesNotExist, Node, Variable -from django.utils.text import unescape_string_literal +from django.template import Library, Node, TemplateSyntaxError from web_theme.conf import settings as web_theme_settings @@ -29,25 +24,25 @@ def get_theme(parser, token): # Splitting by None == splitting by spaces. tag_name, arg = token.contents.split(None, 1) except ValueError: - raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0] + raise TemplateSyntaxError('%r tag requires arguments' % token.contents.split()[0]) #m = re.search(r'(.*?) as (\w+)', arg) m = re.search(r'as (\w+)', arg) if not m: - raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag_name + raise TemplateSyntaxError('%r tag had invalid arguments' % tag_name) #format_string, var_name = m.groups() var_name = m.groups() - + #if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")): # raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name - return GetThemeNode(var_name) + return GetThemeNode(var_name) class LoginRedirectNode(Node): def render(self, context): context['LOGIN_REDIRECT_URL'] = getattr(settings, 'LOGIN_REDIRECT_URL', '/') return '' - + @register.tag def get_login_redirect_url(parser, token): diff --git a/settings.py b/settings.py index 34fc09bf4f..48876b083d 100644 --- a/settings.py +++ b/settings.py @@ -23,7 +23,7 @@ MANAGERS = ADMINS DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': os.path.join(PROJECT_ROOT, '%s.sqlite' % PROJECT_NAME), # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. @@ -250,7 +250,7 @@ BROKER_PORT = 5672 BROKER_USER = "guest" BROKER_PASSWORD = "guest" BROKER_VHOST = "/" -CELERYBEAT_SCHEDULER='djcelery.schedulers.DatabaseScheduler' +CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' #======== End of user configuration options ======= #--------- Web theme --------------- WEB_THEME_ENABLE_SCROLL_JS = False @@ -263,7 +263,7 @@ LOGIN_REDIRECT_URL = '/' LOGIN_EXEMPT_URLS = ( r'^favicon\.ico$', r'^about\.html$', - r'^legal/', # allow the entire /legal/* subsection + r'^legal/', # allow the entire /legal/* subsection r'^%s-site_media/' % PROJECT_NAME, r'^accounts/register/$', @@ -305,7 +305,7 @@ if DEVELOPMENT: try: import django_extensions - INSTALLED_APPS +=('django_extensions',) + INSTALLED_APPS += ('django_extensions',) except ImportError: #print 'django_extensions is not installed' pass @@ -322,6 +322,6 @@ if DEVELOPMENT: WSGI_AUTO_RELOAD = True if 'debug_toolbar' in INSTALLED_APPS: MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',) - DEBUG_TOOLBAR_CONFIG={ - 'INTERCEPT_REDIRECTS' : False, + DEBUG_TOOLBAR_CONFIG = { + 'INTERCEPT_REDIRECTS': False, } diff --git a/urls.py b/urls.py index 0fcee5753a..bc98f75e20 100644 --- a/urls.py +++ b/urls.py @@ -1,8 +1,6 @@ -from django.conf.urls.defaults import * +from django.conf.urls.defaults import patterns, include, url from django.contrib import admin from django.conf import settings -from django.conf.urls.defaults import * -from django.views.defaults import page_not_found, server_error admin.autodiscover() @@ -21,6 +19,7 @@ urlpatterns = patterns('', (r'^sentry/', include('sentry.urls')), ) + def handler500(request): """ 500 error handler which includes ``request`` in the context. @@ -31,21 +30,19 @@ def handler500(request): from django.template import Context, loader from django.http import HttpResponseServerError - t = loader.get_template('500.html') # You need to create a 500.html template. + t = loader.get_template('500.html') # You need to create a 500.html template. return HttpResponseServerError(t.render(Context({ 'request': request, }))) - + if settings.DEVELOPMENT: urlpatterns += patterns('', (r'^%s-site_media/(?P.*)$' % settings.PROJECT_NAME, 'django.views.static.serve', - {'document_root':'site_media', 'show_indexes':True}), + {'document_root': 'site_media', 'show_indexes': True}), ) if 'rosetta' in settings.INSTALLED_APPS: urlpatterns += patterns('', url(r'^rosetta/', include('rosetta.urls'), name='rosetta'), ) - -