Import and PEP8 cleanups

This commit is contained in:
Roberto Rosario
2012-07-26 22:42:36 -04:00
parent 24bf20b9d7
commit eecf7c7751
69 changed files with 173 additions and 253 deletions

View File

@@ -6,7 +6,7 @@ from project_setup.api import register_setup
from .classes import (AccessHolder, AccessObjectClass, ClassAccessHolder,
AccessObject)
from .links import (acl_list, acl_detail, acl_grant, acl_revoke,
from .links import (acl_detail, acl_grant, acl_revoke,
acl_holder_new, acl_setup_valid_classes, acl_class_list,
acl_class_acl_list, acl_class_acl_detail, acl_class_new_holder_for,
acl_class_grant, acl_class_revoke)

View File

@@ -76,7 +76,7 @@ class AccessEntryManager(models.Manager):
actor = AnonymousUserSingleton.objects.passthru_check(actor)
try:
content_type=ContentType.objects.get_for_model(obj)
content_type = ContentType.objects.get_for_model(obj)
except AttributeError:
# Object doesn't have a content type, therefore allow access
return True

View File

@@ -1,8 +1,8 @@
from __future__ import absolute_import
from project_setup.api import register_setup
from navigation.api import bind_links#, register_sidebar_template
from navigation.api import bind_links
from .links import database_bootstrap, bootstrap_execute, erase_database_link
from .api import BootstrapSimple, BootstrapPermit

View File

@@ -7,7 +7,6 @@ from django.contrib.auth.models import User, Group
from permissions.models import Role
from documents.models import DocumentType, DocumentTypeFilename, Document
from metadata.models import MetadataType, MetadataSet
from metadata.api import save_metadata_list
from document_indexing.models import Index, IndexTemplateNode
from sources.models import WebForm, StagingFolder
from ocr.models import QueueDocument, QueueTransformation, DocumentQueue
@@ -90,11 +89,11 @@ def nuke_database():
# Delete all foders
for obj in Folder.objects.all():
obj.delete()
obj.delete()
# Delete all recent searches
for obj in RecentSearch.objects.all():
obj.delete()
obj.delete()
# Clear the entire key ring (public and private keys)
gpg.delete_all_keys()
@@ -107,21 +106,21 @@ class BootstrapBase(object):
def __unicode__(self):
return unicode(self.label)
class BootstrapSimple(BootstrapBase):
name = 'simple'
label = _(u'Simple')
description = _(u'A simple setup providing an uploaded date metadata and index plus an alphabetic index based on document filenames.')
def execute(self):
# Create metadata types
upload_date = MetadataType.objects.create(name='upload_date', title=ugettext(u'Upload date'), default='current_date()')
# Create a segmented date index
index = Index.objects.create(name='date_tree', title=ugettext(u'Segmented date index'), enabled=True)
template_root = index.template_root
# Create index template
node1 = IndexTemplateNode.objects.create(parent=template_root, index=index, expression='metadata.upload_date[0:4]', enabled=True, link_documents=False)
node2 = IndexTemplateNode.objects.create(parent=node1, index=index, expression='metadata.upload_date[5:7]', enabled=True, link_documents=False)
@@ -132,7 +131,7 @@ class BootstrapPermit(BootstrapBase):
name = 'permits'
label = _(u'Permits')
description = _(u'A setup for handling permits and related documents.')
def execute(self):
# Create document types
form = DocumentType.objects.create(name=ugettext(u'Form'))
@@ -142,17 +141,17 @@ class BootstrapPermit(BootstrapBase):
blueprint = DocumentType.objects.create(name=ugettext(u'Blueprint'))
DocumentTypeFilename.objects.create(document_type=blueprint, filename=ugettext(u'Floorplan'))
DocumentTypeFilename.objects.create(document_type=blueprint, filename=ugettext(u'Plot plan'))
# Create metadata types
date = MetadataType.objects.create(name='date', title=ugettext(u'Date'), default='current_date()')
client = MetadataType.objects.create(name='client', title=ugettext(u'Client'))
permit = MetadataType.objects.create(name='permit', title=ugettext(u'Permit number'))
project = MetadataType.objects.create(name='project', title=ugettext(u'Project'))
user = MetadataType.objects.create(name='user', title=ugettext(u'User'), lookup='sorted([user.get_full_name() or user for user in User.objects.all() if user.is_active])')
# Create a segmented date index
index = Index.objects.create(name='main_index', title=ugettext(u'Permit index'), enabled=True)
# Create index template
per_permit = IndexTemplateNode.objects.create(parent=index.template_root, index=index, expression='\'%s\'' % ugettext(u'Per permit'), enabled=True, link_documents=False)
per_permit_child = IndexTemplateNode.objects.create(parent=per_permit, index=index, expression='metadata.permit', enabled=True, link_documents=True)
@@ -170,7 +169,7 @@ class BootstrapPermit(BootstrapBase):
per_client = IndexTemplateNode.objects.create(parent=index.template_root, index=index, expression='\'%s\'' % ugettext(u'Per client'), enabled=True, link_documents=False)
per_client_child = IndexTemplateNode.objects.create(parent=per_client, index=index, expression='metadata.client', enabled=True, link_documents=True)
for bootstrap in [BootstrapSimple(), BootstrapPermit()]:
bootstrap_options[bootstrap.name] = bootstrap

View File

@@ -2,8 +2,10 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE
from navigation.api import Link
database_bootstrap = {'text': _(u'bootstrap database'), 'view': 'bootstrap_type_list', 'icon': 'database_lightning.png', 'permissions': [PERMISSION_BOOTSTRAP_EXECUTE]}
bootstrap_execute = {'text': _(u'execute'), 'view': 'bootstrap_execute', 'args': 'object.name', 'sprite': 'database_lightning.png', 'permissions': [PERMISSION_BOOTSTRAP_EXECUTE]}
erase_database_link = {'text': _(u'erase database'), 'view': 'erase_database_view', 'icon': 'radioactivity.png', 'permissions': [PERMISSION_NUKE_DATABASE]}
from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE
database_bootstrap = Link(text=_(u'bootstrap database'), view='bootstrap_type_list', icon='database_lightning.png', permissions=[PERMISSION_BOOTSTRAP_EXECUTE])
bootstrap_execute = Link(text=_(u'execute'), view='bootstrap_execute', args='object.name', sprite='database_lightning.png', permissions=[PERMISSION_BOOTSTRAP_EXECUTE])
erase_database_link = Link(text=_(u'erase database'), view='erase_database_view', icon='radioactivity.png', permissions=[PERMISSION_NUKE_DATABASE])

View File

@@ -8,4 +8,3 @@ namespace = PermissionNamespace('bootstrap', _(u'Database bootstrap'))
PERMISSION_BOOTSTRAP_EXECUTE = Permission.objects.register(namespace, 'bootstrap_execute', _(u'Execute document bootstraps'))
PERMISSION_NUKE_DATABASE = Permission.objects.register(namespace, 'nuke_database', _(u'Erase the entire database and document storage'))

View File

@@ -2,7 +2,7 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.contrib import messages
from django.core.urlresolvers import reverse
@@ -10,12 +10,12 @@ from django.core.urlresolvers import reverse
from permissions.models import Permission
from .api import bootstrap_options, nuke_database
from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE
from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE
def bootstrap_type_list(request):
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE])
context = {
'object_list': bootstrap_options.values(),
'title': _(u'database bootstrap setups'),
@@ -32,7 +32,7 @@ def bootstrap_type_list(request):
def bootstrap_execute(request, bootstrap_name):
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE])
bootstrap = bootstrap_options[bootstrap_name]
post_action_redirect = reverse('bootstrap_type_list')
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
@@ -90,4 +90,4 @@ def erase_database_view(request):
context['message'] = _(u'All documents, sources, metadata, metadata types, set, tags, indexes and logs will be lost irreversibly!')
return render_to_response('generic_confirm.html', context,
context_instance=RequestContext(request))
context_instance=RequestContext(request))

View File

@@ -2,13 +2,10 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation.api import (bind_links, register_top_menu,
register_model_list_columns,
register_sidebar_template, Link)
from navigation.api import bind_links, register_top_menu
from scheduler.api import register_interval_job
from documents.models import Document
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from acls.api import class_permissions
from .permissions import (PERMISSION_DOCUMENT_CHECKOUT,
@@ -37,6 +34,6 @@ class_permissions(Document, [
PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE
])
CHECK_EXPIRED_CHECK_OUTS_INTERVAL=60 # Lowest check out expiration allowed
CHECK_EXPIRED_CHECK_OUTS_INTERVAL = 60 # Lowest check out expiration allowed
register_interval_job('task_check_expired_check_outs', _(u'Check expired check out documents and checks them in.'), task_check_expired_check_outs, seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL)
initialize_document_checkout_extra_methods()

View File

@@ -3,7 +3,8 @@ class DocumentNotCheckedOut(Exception):
Raised when trying to checkin a document that is not checkedout
"""
pass
class DocumentAlreadyCheckedOut(Exception):
"""
Raised when trying to checkout an already checkedout document

View File

@@ -1,7 +1,6 @@
from __future__ import absolute_import
from django import forms
from django.utils.translation import ugettext_lazy as _
from .models import DocumentCheckout
from .exceptions import DocumentAlreadyCheckedOut
@@ -17,7 +16,7 @@ class DocumentCheckoutForm(forms.ModelForm):
widgets = {
'document': forms.widgets.HiddenInput(),
}
}
def clean_document(self):
document = self.cleaned_data['document']

View File

@@ -2,7 +2,6 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from navigation.api import Link
from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE)

View File

@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
class DocumentCheckoutManager(models.Manager):
def checked_out_documents(self):
return Document.objects.filter(pk__in=self.model.objects.all().values_list('document__pk', flat=True))
def expired_check_outs(self):
expired_list = Document.objects.filter(pk__in=self.model.objects.filter(expiration_datetime__lte=datetime.datetime.now()).values_list('document__pk', flat=True))
logger.debug('expired_list: %s' % expired_list)
@@ -37,7 +37,7 @@ class DocumentCheckoutManager(models.Manager):
return True
else:
return False
def check_in_document(self, document, user=None):
try:
document_checkout = self.model.objects.get(document=document)
@@ -51,9 +51,9 @@ class DocumentCheckoutManager(models.Manager):
history_document_checked_in.commit(source_object=document, data={'user': user, 'document': document})
else:
history_document_auto_checked_in.commit(source_object=document, data={'document': document})
document_checkout.delete()
def document_checkout_info(self, document):
try:
return self.model.objects.get(document=document)
@@ -93,7 +93,6 @@ class DocumentCheckoutManager(models.Manager):
# Last resort check if original user enabled restriction
return not checkout_info.block_new_version
else:
return True
return True
else:
return True
return True

View File

@@ -3,7 +3,7 @@ from __future__ import absolute_import
import logging
import datetime
from django.db import models, IntegrityError
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
@@ -11,7 +11,6 @@ from django.contrib.contenttypes import generic
from documents.models import Document
from .managers import DocumentCheckoutManager
from .exceptions import DocumentAlreadyCheckedOut
from .events import history_document_checked_out
logger = logging.getLogger(__name__)
@@ -33,9 +32,9 @@ class DocumentCheckout(models.Model):
#block_metadata
#block_editing
#block tag add/remove
objects = DocumentCheckoutManager()
def __unicode__(self):
return unicode(self.document)
@@ -45,11 +44,11 @@ class DocumentCheckout(models.Model):
result = super(DocumentCheckout, self).save(*args, **kwargs)
history_document_checked_out.commit(source_object=self.document, data={'user': self.user_object, 'document': self.document})
return result
@models.permalink
def get_absolute_url(self):
return ('checkout_info', [self.document.pk])
return ('checkout_info', [self.document.pk])
class Meta:
verbose_name = _(u'document checkout')
verbose_name_plural = _(u'document checkouts')

View File

@@ -10,4 +10,3 @@ PERMISSION_DOCUMENT_CHECKOUT = Permission.objects.register(namespace, 'checkout_
PERMISSION_DOCUMENT_CHECKIN = Permission.objects.register(namespace, 'checkin_document', _(u'Check in documents'))
PERMISSION_DOCUMENT_CHECKIN_OVERRIDE = Permission.objects.register(namespace, 'checkin_document_override', _(u'Forcefully check in documents'))
PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE = Permission.objects.register(namespace, 'checkout_restrictions_override', _(u'Allow overriding check out restrictions'))

View File

@@ -21,7 +21,6 @@ from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHEC
PERMISSION_DOCUMENT_CHECKIN_OVERRIDE)
from .forms import DocumentCheckoutForm
from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut
from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS
from .widgets import checkout_widget
@@ -56,12 +55,12 @@ def checkout_info(request, document_pk):
paragraphs.append(_(u'Check out time: %s') % checkout_info.checkout_datetime)
paragraphs.append(_(u'Check out expiration: %s') % checkout_info.expiration_datetime)
paragraphs.append(_(u'New versions allowed: %s') % (_(u'yes') if not checkout_info.block_new_version else _(u'no')))
return render_to_response('generic_template.html', {
'paragraphs': paragraphs,
'object': document,
'title': _(u'Check out details for document: %s') % document
}, context_instance=RequestContext(request))
}, context_instance=RequestContext(request))
def checkout_document(request, document_pk):
@@ -70,7 +69,7 @@ def checkout_document(request, document_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKOUT])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKOUT, request.user, document)
if request.method == 'POST':
form = DocumentCheckoutForm(data=request.POST, initial={'document': document})
try:
@@ -94,7 +93,7 @@ def checkout_document(request, document_pk):
'form': form,
'object': document,
'title': _(u'Check out document: %s') % document
}, context_instance=RequestContext(request))
}, context_instance=RequestContext(request))
def checkin_document(request, document_pk):

View File

@@ -8,7 +8,7 @@ from django.utils.safestring import mark_safe
from django.conf import settings
from django.core import validators
from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS
from .literals import STATE_ICONS, STATE_LABELS
def checkout_widget(document):
@@ -27,9 +27,9 @@ class SplitDeltaWidget(forms.widgets.MultiWidget):
"""
def __init__(self, attrs=None):
widgets = (
forms.widgets.TextInput(attrs={'maxlength': 3, 'style':'width: 5em;', 'placeholder': _(u'Days')}),
forms.widgets.TextInput(attrs={'maxlength': 4, 'style':'width: 5em;', 'placeholder': _(u'Hours')}),
forms.widgets.TextInput(attrs={'maxlength': 5, 'style':'width: 5em;', 'placeholder': _(u'Minutes')}),
forms.widgets.TextInput(attrs={'maxlength': 3, 'style': 'width: 5em;', 'placeholder': _(u'Days')}),
forms.widgets.TextInput(attrs={'maxlength': 4, 'style': 'width: 5em;', 'placeholder': _(u'Hours')}),
forms.widgets.TextInput(attrs={'maxlength': 5, 'style': 'width: 5em;', 'placeholder': _(u'Minutes')}),
)
super(SplitDeltaWidget, self).__init__(widgets, attrs)
@@ -49,7 +49,7 @@ class SplitHiddenDeltaWidget(forms.widgets.SplitDateTimeWidget):
is_hidden = True
def __init__(self, attrs=None):
super(SplitHiddenDeltaWidget, self).__init__(attrs, date_format, time_format)
super(SplitHiddenDeltaWidget, self).__init__(attrs)
for widget in self.widgets:
widget.input_type = 'hidden'
widget.is_hidden = True
@@ -73,15 +73,15 @@ class SplitTimeDeltaField(forms.MultiValueField):
fields = (
forms.IntegerField(min_value=0,
error_messages={'invalid': errors['invalid_days']},
localize=localize
localize=localize
),
forms.IntegerField(min_value=0,
error_messages={'invalid': errors['invalid_hours']},
localize=localize
localize=localize
),
forms.IntegerField(min_value=0,
error_messages={'invalid': errors['invalid_minutes']},
localize=localize
localize=localize
),
)
super(SplitTimeDeltaField, self).__init__(fields, *args, **kwargs)
@@ -91,7 +91,7 @@ class SplitTimeDeltaField(forms.MultiValueField):
def compress(self, data_list):
if data_list == [0, 0, 0]:
raise forms.ValidationError(self.error_messages['invalid_timedelta'])
if data_list:
# Raise a validation error if time or date is empty
# (possible if SplitDateTimeField has required=False).
@@ -100,8 +100,8 @@ class SplitTimeDeltaField(forms.MultiValueField):
if data_list[1] in validators.EMPTY_VALUES:
raise forms.ValidationError(self.error_messages['invalid_hours'])
if data_list[2] in validators.EMPTY_VALUES:
raise forms.ValidationError(self.error_messages['invalid_minutes'])
raise forms.ValidationError(self.error_messages['invalid_minutes'])
timedelta = datetime.timedelta(days=data_list[0], hours=data_list[1], minutes=data_list[2])
return datetime.datetime.now() + timedelta
return None

View File

@@ -7,7 +7,6 @@ from south.signals import post_migrate
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import models as auth_models
from django.contrib.auth.models import User
from django.contrib.auth.management import create_superuser
from django.dispatch import receiver
from django.conf import settings
from django.db.models.signals import post_save

View File

@@ -1,5 +1,4 @@
from django.template import Library
from django.utils.importlib import import_module
from common.models import AutoAdminSingleton

View File

@@ -1,7 +1,6 @@
from __future__ import absolute_import
import os
import subprocess
import hashlib
import logging

View File

@@ -6,11 +6,9 @@ import logging
from mimetype.api import get_mimetype
from common.conf.settings import TEMPORARY_DIRECTORY
from common.utils import id_generator
from .conf.settings import LIBREOFFICE_PATH
from .exceptions import (OfficeConversionError,
OfficeBackendError, UnknownFileFormat)
from .exceptions import OfficeBackendError, UnknownFileFormat
CACHED_FILE_SUFFIX = u'_office_converter'

View File

@@ -1,14 +1,10 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation.api import bind_links, Link
from navigation.api import bind_links
from project_setup.api import register_setup
from hkp import Key as KeyServerKey
from .api import Key
from .permissions import (PERMISSION_KEY_VIEW, PERMISSION_KEY_DELETE,
PERMISSION_KEYSERVER_QUERY, PERMISSION_KEY_RECEIVE)
from .links import (private_keys, public_keys, key_delete, key_query,
key_receive, key_setup)

View File

@@ -325,7 +325,7 @@ class GPG(object):
# Delete secret keys first
for key in Key.get_all(self, secret=True):
self.delete_key(key)
# Delete public keys
for key in Key.get_all(self, secret=False):
self.delete_key(key)

View File

@@ -13,7 +13,7 @@ from common.utils import encapsulate
from .api import Key
from .runtime import gpg
from .exceptions import KeyFetchingError, KeyImportError
from .exceptions import KeyImportError
from .forms import KeySearchForm
from .permissions import (PERMISSION_KEY_VIEW, PERMISSION_KEY_DELETE,
PERMISSION_KEYSERVER_QUERY, PERMISSION_KEY_RECEIVE)

View File

@@ -5,7 +5,7 @@ from django.conf import settings
from django.contrib.comments.models import Comment
from django.contrib.contenttypes import generic
from navigation.api import bind_links, register_model_list_columns, Link
from navigation.api import bind_links, register_model_list_columns
from common.utils import encapsulate
from acls.api import class_permissions
from documents.models import Document
@@ -15,8 +15,7 @@ if 'django.contrib.comments' not in settings.INSTALLED_APPS:
from .permissions import (PERMISSION_COMMENT_CREATE,
PERMISSION_COMMENT_DELETE, PERMISSION_COMMENT_VIEW)
from .links import (comment_delete, comment_multiple_delete, comment_add,
comments_for_document)
from .links import (comment_delete, comment_add, comments_for_document)
register_model_list_columns(Comment, [
{

View File

@@ -2,18 +2,15 @@ from __future__ import absolute_import
import logging
from django.db.models.signals import pre_save, post_save, pre_delete
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
from django.dispatch import receiver
from django.db.models.signals import post_save, pre_delete, post_delete
from navigation.api import (register_top_menu, register_sidebar_template,
bind_links, Link)
from main.api import register_maintenance_links
from documents.models import Document, DocumentVersion
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from documents.models import Document
from metadata.models import DocumentMetadata
from project_setup.api import register_setup
@@ -22,14 +19,7 @@ from .api import update_indexes, delete_indexes
from .links import (index_setup, index_setup_list, index_setup_create,
index_setup_edit, index_setup_delete, index_setup_view,
template_node_create, template_node_edit, template_node_delete,
index_list, index_parent, document_index_list, rebuild_index_instances)
from .permissions import (PERMISSION_DOCUMENT_INDEXING_VIEW,
PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES,
PERMISSION_DOCUMENT_INDEXING_SETUP,
PERMISSION_DOCUMENT_INDEXING_CREATE,
PERMISSION_DOCUMENT_INDEXING_EDIT,
PERMISSION_DOCUMENT_INDEXING_DELETE
)
index_parent, document_index_list, rebuild_index_instances)
logger = logging.getLogger(__name__)
@@ -70,7 +60,7 @@ def document_metadata_index_update(sender, **kwargs):
def document_metadata_index_delete(sender, **kwargs):
# TODO: save result in index log
delete_indexes(kwargs['instance'].document)
@receiver(post_delete, dispatch_uid='document_metadata_index_post_delete', sender=DocumentMetadata)
def document_metadata_index_post_delete(sender, **kwargs):

View File

@@ -7,12 +7,11 @@ try:
except ImportError:
from StringIO import StringIO
from django.utils.translation import ugettext_lazy as _
#from django.db.models.signals import post_save
#from django.dispatch import receiver
from documents.models import Document, DocumentVersion
from navigation.api import bind_links, Link
from navigation.api import bind_links
from django_gpg.runtime import gpg
from django_gpg.exceptions import GPGDecryptionError
from acls.api import class_permissions

View File

@@ -2,7 +2,6 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from documents.models import Document, DocumentVersion
from navigation.api import Link
from .models import DocumentVersionSignature

View File

@@ -20,10 +20,7 @@ from .permissions import (PERMISSION_DOCUMENT_PROPERTIES_EDIT,
PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_DELETE,
PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_TRANSFORM,
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VERSION_REVERT,
PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE,
PERMISSION_DOCUMENT_TOOLS)
from .conf.settings import ZOOM_MAX_LEVEL
from .conf.settings import ZOOM_MIN_LEVEL
PERMISSION_DOCUMENT_NEW_VERSION)
from .conf import settings as document_settings
from .widgets import document_thumbnail
from .links import (document_list, document_list_recent,

View File

@@ -547,7 +547,7 @@ class DocumentVersion(models.Model):
def rename(self, new_name):
new_filename, new_extension = os.path.splitext(new_name)
name, extension = os.path.splitext(self.filename)
# Preserve existing extension if new name doesn't has one
if new_extension:
extension = new_extension

View File

@@ -2,7 +2,6 @@ from __future__ import absolute_import
import datetime
from django.db import connection
from django.db import models
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse

View File

@@ -3,15 +3,13 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from project_tools.api import register_tool
from navigation.api import (bind_links, register_top_menu,
register_model_list_columns,
register_sidebar_template, Link)
from navigation.api import bind_links, register_model_list_columns
from common.utils import encapsulate
from .models import History
from .widgets import history_entry_summary, history_entry_type_link
from .widgets import history_entry_type_link
from .links import history_list, history_details
register_tool(history_list)
register_model_list_columns(History, [
@@ -26,7 +24,7 @@ register_model_list_columns(History, [
{
'name': _(u'summary'),
'attribute': encapsulate(lambda entry: unicode(entry.get_processed_summary()))
}
}
])
bind_links([History], [history_details])

View File

@@ -5,7 +5,6 @@ import json
from django.db import transaction
from django.core import serializers
from django.shortcuts import get_object_or_404
from django.db import models
from django.db.utils import DatabaseError
@@ -17,7 +16,7 @@ class EventNamespace(object):
def __init__(self, name, label):
self.name = name
self.label = label
class Event(object):
@transaction.commit_on_success
@@ -37,8 +36,7 @@ class Event(object):
history_types_dict[self.namespace.name][self.name] = self
except DatabaseError:
# Special case for syncdb
transaction.rollback()
transaction.rollback()
def commit(self, source_object=None, data=None):
new_history = History(history_type=self.history_type_obj)

View File

@@ -16,7 +16,7 @@ from acls.models import AccessEntry
from .models import History, HistoryType
from .forms import HistoryDetailForm
from .permissions import PERMISSION_HISTORY_VIEW
from .widgets import history_entry_object_link, history_entry_summary
from .widgets import history_entry_object_link
def history_list(request, object_list=None, title=None, extra_context=None):
@@ -76,11 +76,11 @@ def history_for_object(request, app_label, module_name, object_id):
def history_view(request, object_id):
history = get_object_or_404(History, pk=object_id)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_HISTORY_VIEW])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_HISTORY_VIEW, request.user, history.content_object)
AccessEntry.objects.check_access(PERMISSION_HISTORY_VIEW, request.user, history.content_object)
form = HistoryDetailForm(instance=history, extra_fields=[
{'label': _(u'Date'), 'field': lambda x: x.datetime.date()},
@@ -99,7 +99,7 @@ def history_view(request, object_id):
def history_type_list(request, history_type_pk):
history_type = get_object_or_404(HistoryType, pk=history_type_pk)
return history_list(
request,
object_list=History.objects.filter(history_type=history_type),

View File

@@ -5,13 +5,12 @@ from south.signals import post_migrate
from project_tools.api import register_tool
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.db.utils import DatabaseError
from django.db import transaction
from .links import installation_details
from .models import Installation
@receiver(post_migrate, dispatch_uid='trigger_first_time')
def trigger_first_time(sender, **kwargs):
@@ -27,7 +26,7 @@ def check_first_run():
details = Installation.objects.get()
except DatabaseError:
# Avoid database errors when the app tables haven't been created yet
transaction.rollback()
transaction.rollback()
else:
if details.is_first_run:
details.submit()

View File

@@ -15,7 +15,7 @@ except pbs.CommandNotFound:
LSB = False
else:
LSB = True
from django.db import models
from django.utils.translation import ugettext_lazy as _
@@ -34,18 +34,19 @@ FORM_RECEIVER_FIELD = 'entry.0.single'
TIMEOUT = 5
FABFILE_MARKER = os.path.join(settings.PROJECT_ROOT, 'fabfile_install')
class Property(object):
def __init__(self, name, label, value):
self.name = name
self.label = label
self.value = value
def __unicode__(self):
return unicode(self.value)
def __str__(self):
return str(self.value)
class Installation(Singleton):
_properties = SortedDict()
@@ -64,10 +65,10 @@ class Installation(Singleton):
self._properties = SortedDict()
if LSB:
self.add_property(Property('is_lsb', _(u'LSB OS'), True))
self.add_property(Property('distributor_id', _(u'Distributor ID'), lsb_release('-i','-s')))
self.add_property(Property('description', _(u'Description'), lsb_release('-d','-s')))
self.add_property(Property('release', _(u'Release'), lsb_release('-r','-s')))
self.add_property(Property('codename', _(u'Codename'), lsb_release('-c','-s')))
self.add_property(Property('distributor_id', _(u'Distributor ID'), lsb_release('-i', '-s')))
self.add_property(Property('description', _(u'Description'), lsb_release('-d', '-s')))
self.add_property(Property('release', _(u'Release'), lsb_release('-r', '-s')))
self.add_property(Property('codename', _(u'Codename'), lsb_release('-c', '-s')))
self.add_property(Property('sysinfo', _(u'System info'), uname('-a')))
else:
self.add_property(Property('is_lsb', _(u'LSB OS'), False))
@@ -81,7 +82,7 @@ class Installation(Singleton):
self.add_property(Property('cpus', _(u'Number of CPUs'), psutil.NUM_CPUS))
self.add_property(Property('total_phymem', _(u'Total physical memory'), pretty_size(psutil.TOTAL_PHYMEM)))
self.add_property(Property('disk_partitions', _(u'Disk partitions'), '; '.join(['%s %s %s %s' % (partition.device, partition.mountpoint, partition.fstype, partition.opts) for partition in psutil.disk_partitions()])))
try:
self.add_property(Property('tesseract', _(u'tesseract version'), pbs.tesseract('-v').stderr))
except pbs.CommandNotFound:
@@ -94,13 +95,13 @@ class Installation(Singleton):
self.add_property(Property('mayan_version', _(u'Mayan EDMS version'), mayan_version))
self.add_property(Property('fabfile', _(u'Installed via fabfile'), os.path.exists(FABFILE_MARKER)))
try:
repo = Repo(settings.PROJECT_ROOT)
except:
self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), False))
else:
repo.config_reader()
repo.config_reader()
headcommit = repo.head.commit
self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), True))
self.add_property(Property('repo_remotes', _(u'Repository remotes'), ', '.join([unicode(remote) for remote in repo.remotes])))
@@ -111,13 +112,13 @@ class Installation(Singleton):
self.add_property(Property('headcommit_committer', _(u'HEAD commit committer'), headcommit.committer))
self.add_property(Property('headcommit_committed_date', _(u'HEAD commit committed date'), time.asctime(time.gmtime(headcommit.committed_date))))
self.add_property(Property('headcommit_message', _(u'HEAD commit message'), headcommit.message))
def __getattr__(self, name):
self.set_properties()
try:
return self._properties[name]
except KeyError:
raise AttributeError, name
raise AttributeError
def submit(self):
try:
@@ -164,7 +165,7 @@ class Installation(Singleton):
'headcommit_message': unicode(self.headcommit_message),
}
)
requests.post(FORM_SUBMIT_URL, data={'formkey': FORM_KEY, FORM_RECEIVER_FIELD: dumps(dictionary)}, timeout=TIMEOUT)
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError):
pass
@@ -174,6 +175,5 @@ class Installation(Singleton):
finally:
lock.release()
class Meta:
verbose_name = verbose_name_plural = _(u'installation details')

View File

@@ -3,7 +3,6 @@ from __future__ import absolute_import
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import PermissionDenied
from permissions.models import Permission
@@ -15,11 +14,11 @@ def installation_details(request):
Permission.objects.check_permissions(request.user, [PERMISSION_INSTALLATION_DETAILS])
paragraphs = []
for name, instance in Installation().get_properties().items():
paragraphs.append('%s: %s' % (unicode(instance.label), instance.value))
return render_to_response('generic_template.html', {
'paragraphs': paragraphs,
'title': _(u'Installation environment details')
}, context_instance=RequestContext(request))
}, context_instance=RequestContext(request))

View File

@@ -1,19 +1,15 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation.api import bind_links, register_sidebar_template, Link
from navigation.api import bind_links, register_sidebar_template
from project_setup.api import register_setup
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from documents.models import Document
from acls.api import class_permissions
from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL
from .models import SmartLink, SmartLinkCondition
from .permissions import (PERMISSION_SMART_LINK_VIEW,
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
PERMISSION_SMART_LINK_EDIT)
from .links import (smart_link_instance_view_link, smart_link_instances_for_document,
PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT)
from .links import (smart_link_instances_for_document,
smart_link_setup, smart_link_list, smart_link_create, smart_link_edit,
smart_link_delete, smart_link_condition_list, smart_link_condition_create,
smart_link_condition_edit, smart_link_condition_delete, smart_link_acl_list)

View File

@@ -4,11 +4,10 @@ from django.utils.translation import ugettext_lazy as _
from navigation.api import Link
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL
from acls.permissions import ACLS_VIEW_ACL
from .permissions import (PERMISSION_SMART_LINK_VIEW,
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
PERMISSION_SMART_LINK_EDIT)
from .permissions import (PERMISSION_SMART_LINK_CREATE,
PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT)
smart_link_instance_view_link = Link(text=_(u'smart links actions'), view='smart_link_instance_view', sprite='page_link', permissions=[PERMISSION_DOCUMENT_VIEW])
smart_link_instances_for_document = Link(text=_(u'smart links'), view='smart_link_instances_for_document', args='object.pk', sprite='page_link', permissions=[PERMISSION_DOCUMENT_VIEW])

View File

@@ -24,7 +24,7 @@ from .models import SmartLink, SmartLinkCondition
from .conf.settings import SHOW_EMPTY_SMART_LINKS
from .forms import (SmartLinkInstanceForm, SmartLinkForm,
SmartLinkConditionForm)
from . import smart_link_instance_view_link
from .links import smart_link_instance_view_link
from .permissions import (PERMISSION_SMART_LINK_VIEW,
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
PERMISSION_SMART_LINK_EDIT)

View File

@@ -1,7 +1,5 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation.api import bind_links
from documents.models import Document
from acls.api import class_permissions

View File

@@ -16,8 +16,7 @@ class DocumentMailForm(forms.Form):
else:
self.fields['subject'].initial = settings.LINK_SUBJECT_TEMPLATE
self.fields['body'].initial = settings.LINK_BODY_TEMPLATE
email = forms.EmailField(label=_(u'Email address'))
subject = forms.CharField(label=_(u'Subject'), required=False)#, initial=_(u'Link for document: {{ document }}'))
body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False)#, initial=_(u'To access this document click on the following link: <a href="{{ link }}">{{ link }}</a>'))
subject = forms.CharField(label=_(u'Subject'), required=False)
body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False)

View File

@@ -79,7 +79,7 @@ def send_document_link(request, document_id=None, document_id_list=None, as_atta
else:
messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % {
'document': document, 'error': exc})
else:
if as_attachment:
messages.success(request, _(u'Successfully sent document via email.'))

View File

@@ -1,10 +1,8 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from navigation.api import Link, register_top_menu
from project_setup.api import register_setup
from project_tools.api import register_tool
from .conf.settings import SIDE_BAR_SEARCH, DISABLE_HOME_VIEW

View File

@@ -1,8 +1,8 @@
from navigation.api import register_multi_item_links
from documents.links import document_multiple_clear_transformations, document_multiple_delete, document_multiple_download
from metadata import metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove
from ocr import submit_document_multiple
from metadata.links import metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove
from ocr.links import submit_document_multiple
def register_multi_items_links():

View File

@@ -2,11 +2,10 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation.api import (bind_links, register_multi_item_links,
register_sidebar_template, Link, register_model_list_columns)
from navigation.api import (bind_links, register_sidebar_template,
register_model_list_columns)
from common.utils import encapsulate
from documents.models import Document, DocumentType
from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT
from project_setup.api import register_setup
from acls.api import class_permissions
@@ -15,8 +14,7 @@ from .models import MetadataType, MetadataSet
from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_DOCUMENT_VIEW)
from .links import (metadata_edit, metadata_view, metadata_multiple_edit,
metadata_add, metadata_multiple_add, metadata_remove, metadata_multiple_remove,
from .links import (metadata_edit, metadata_view, metadata_add, metadata_remove,
setup_metadata_type_list, setup_metadata_type_edit, setup_metadata_type_delete,
setup_metadata_type_create, setup_metadata_set_list, setup_metadata_set_edit,
setup_metadata_set_delete, setup_metadata_set_create, setup_metadata_set_members,

View File

@@ -150,7 +150,7 @@ def metadata_add(request, document_id=None, document_id_list=None):
else:
messages.warning(request, _(u'Metadata type: %(metadata_type)s already present in document %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
document.mark_indexable()
if len(documents) == 1:
@@ -513,7 +513,6 @@ def setup_metadata_set_delete(request, metadata_set_id):
'metadata_set': metadata_set, 'error': e})
return HttpResponseRedirect(previous)
context = {
'object_name': _(u'metadata set'),
'delete_view': True,

View File

@@ -91,6 +91,7 @@ def get_multi_item_links(parser, token):
return GetNavigationLinks(menu_name=menu_name, links_dict=multi_object_navigation, var_name=var_name)
# TODO: Fix flake8 warning apps/navigation/templatetags/navigation_tags.py:98: W802 undefined name 'get_context_object_navigation_links'
@register.inclusion_tag('generic_form_instance.html', takes_context=True)
def get_multi_item_links_form(context):
logger.debug('starting')

View File

@@ -9,7 +9,7 @@ from django.db.models.signals import post_save, post_syncdb
from django.dispatch import receiver
from django.db.utils import DatabaseError
from navigation.api import bind_links, register_multi_item_links, Link
from navigation.api import bind_links, register_multi_item_links
from documents.models import Document, DocumentVersion
from main.api import register_maintenance_links
from project_tools.api import register_tool
@@ -26,8 +26,7 @@ from . import models as ocr_models
logger = logging.getLogger(__name__)
from .links import (submit_document, submit_document_multiple,
re_queue_document, re_queue_multiple_document, queue_document_delete,
from .links import (submit_document, re_queue_multiple_document,
queue_document_multiple_delete, document_queue_disable,
document_queue_enable, all_document_ocr_cleanup, queue_document_list,
ocr_tool_link, setup_queue_transformation_list,

View File

@@ -15,10 +15,9 @@ from documents.models import Document
from converter.api import get_available_transformations_choices
from sources.managers import SourceTransformationManager
from .literals import (DOCUMENTQUEUE_STATE_STOPPED,
DOCUMENTQUEUE_STATE_CHOICES, QUEUEDOCUMENT_STATE_PENDING,
QUEUEDOCUMENT_STATE_CHOICES, QUEUEDOCUMENT_STATE_PROCESSING,
DOCUMENTQUEUE_STATE_ACTIVE)
from .literals import (DOCUMENTQUEUE_STATE_CHOICES,
QUEUEDOCUMENT_STATE_PENDING, QUEUEDOCUMENT_STATE_CHOICES,
QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_ACTIVE)
from .managers import DocumentQueueManager
from .exceptions import ReQueueError

View File

@@ -3,7 +3,6 @@ from __future__ import absolute_import
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _
from navigation.api import bind_links, register_multi_item_links
from project_setup.api import register_setup

View File

@@ -2,11 +2,6 @@ import logging
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.db import transaction
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
from django.db.utils import IntegrityError
from django.core.exceptions import ImproperlyConfigured
from common.models import AnonymousUserSingleton

View File

@@ -16,17 +16,16 @@ from django.contrib.auth.models import User, Group
from django.utils.simplejson import loads
from common.views import assign_remove
from common.utils import generate_choices_w_labels, encapsulate, get_object_name
from common.utils import encapsulate, get_object_name
from common.widgets import two_state_template
from common.models import AnonymousUserSingleton
from acls.classes import EncapsulatedObject
from .models import Role, Permission, PermissionHolder, RoleMember
from .models import Role, Permission
from .forms import RoleForm, RoleForm_view
from .permissions import (PERMISSION_ROLE_VIEW, PERMISSION_ROLE_EDIT,
PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE,
PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE)
from .widgets import role_permission_link
def role_list(request):

View File

@@ -1,6 +1,6 @@
from __future__ import absolute_import
from elementtree.ElementTree import Element, SubElement
from elementtree.ElementTree import SubElement
from . import setup_menu

View File

@@ -1,6 +1,6 @@
from __future__ import absolute_import
from elementtree.ElementTree import Element, SubElement
from elementtree.ElementTree import SubElement
from . import tool_menu

View File

@@ -3,7 +3,6 @@ from __future__ import absolute_import
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import PermissionDenied
from permissions.models import Permission
from common.utils import encapsulate

View File

@@ -1,7 +1,5 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from project_setup.api import register_setup
from .links import check_settings

View File

@@ -20,11 +20,11 @@ def setting_list(request, namespace_name=None, object_list=None, title=None, ext
namespace_links.append(
Link(text=namespace.label, view='setting_list', args=[u'"%s"' % namespace.name], sprite=getattr(namespace, 'sprite') or 'cog', condition=is_superuser, children_view_regex=[r'^setting_'])
)
if namespace_name:
object_list = [setting for setting in settings[namespace_name] if setting.hidden == False]
title = _(u'settings for the %s module') % namespaces[namespace_name]
context = {
'title': title if title else _(u'settings'),
'object_list': object_list if not (object_list is None) else [setting for setting in settings_list if setting.hidden == False],
@@ -47,7 +47,7 @@ def setting_list(request, namespace_name=None, object_list=None, title=None, ext
}
}
}
if extra_context:
context.update(extra_context)

View File

@@ -3,11 +3,9 @@ from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation.api import (bind_links,
register_model_list_columns, Link)
register_model_list_columns)
from common.utils import encapsulate
from project_setup.api import register_setup
from documents.permissions import (PERMISSION_DOCUMENT_NEW_VERSION,
PERMISSION_DOCUMENT_CREATE)
from scheduler.api import register_interval_job
from documents.models import Document
@@ -15,18 +13,15 @@ from .staging import StagingFile
from .models import (WebForm, StagingFolder, SourceTransformation,
WatchFolder, POP3Email, IMAPEmail)
from .widgets import staging_file_thumbnail
from .permissions import (PERMISSION_SOURCES_SETUP_VIEW,
PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_DELETE,
PERMISSION_SOURCES_SETUP_CREATE)
from .tasks import task_fetch_pop3_emails, task_fetch_imap_emails
from .conf.settings import EMAIL_PROCESSING_INTERVAL
from .links import (staging_file_preview, staging_file_delete, setup_sources,
from .links import (staging_file_delete, setup_sources,
setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list,
setup_pop3_email_list, setup_imap_email_list, setup_source_edit,
setup_source_delete, setup_source_create, setup_source_log_list,
setup_source_transformation_list, setup_source_transformation_create,
setup_source_transformation_edit, setup_source_transformation_delete,
source_list, upload_version, document_create_multiple)
upload_version, document_create_multiple)
bind_links([StagingFile], [staging_file_delete])

View File

@@ -1,16 +1,14 @@
"""Configuration options for the sources app"""
import os
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from smart_settings.api import Setting, SettingNamespace
namespace = SettingNamespace('sources', _(u'Sources'), module='sources.conf.settings')
POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL
POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL
DEFAULT_EMAIL_PROCESSING_INTERVAL = 60
DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store
DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store
Setting(
namespace=namespace,

View File

@@ -38,11 +38,11 @@ class SourceLogManager(models.Manager):
to_delete = self.model.objects.filter(content_type=content_type, object_id=source.pk).order_by('-creation_datetime')[LOG_SIZE:]
for recent_to_delete in to_delete:
recent_to_delete.delete()
def get_for_source(self, source):
content_type = ContentType.objects.get_for_model(source)
return self.model.objects.filter(content_type=content_type, object_id=source.pk).order_by('-creation_datetime')
def get_latest_for(self, source):
content_type = ContentType.objects.get_for_model(source)
return self.model.objects.filter(content_type=content_type, object_id=source.pk).latest().creation_datetime

View File

@@ -21,7 +21,6 @@ from django.contrib.contenttypes import generic
from django.core.exceptions import ValidationError
from django.db import transaction
from django.core.files import File
from django.core.files.base import ContentFile
from converter.api import get_available_transformations_choices
from converter.literals import DIMENSION_SEPARATOR
@@ -38,9 +37,9 @@ from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL,
SOURCE_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES,
SOURCE_UNCOMPRESS_CHOICE_Y,
POP3_PORT, POP3_SSL_PORT,
SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL,
SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL,
IMAP_PORT, IMAP_SSL_PORT,
SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL,
SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL,
IMAP_DEFAULT_MAILBOX)
from .compressed_file import CompressedFile, NotACompressedFile
from .conf.settings import POP3_TIMEOUT
@@ -169,14 +168,14 @@ class SourceLog(models.Model):
source = generic.GenericForeignKey('content_type', 'object_id')
creation_datetime = models.DateTimeField(verbose_name=_(u'date time'))
status = models.TextField(verbose_name=_(u'status'))
objects = SourceLogManager()
def save(self, *args, **kwargs):
if not self.pk:
self.creation_datetime = datetime.datetime.now()
return super(SourceLog, self).save(*args, **kwargs)
class Meta:
verbose_name = _(u'source log')
verbose_name_plural = _(u'sources logs')
@@ -194,8 +193,8 @@ class InteractiveBaseModel(BaseModel):
class Meta(BaseModel.Meta):
abstract = True
class PseudoFile(File):
def __init__(self, file, name):
self.name = name
@@ -203,8 +202,8 @@ class PseudoFile(File):
self.file.seek(0, os.SEEK_END)
self.size = self.file.tell()
self.file.seek(0)
class Attachment(File):
def __init__(self, part, name):
self.name = name
@@ -251,7 +250,7 @@ class EmailBaseModel(IntervalBaseModel):
counter += 1
logger.debug('filename: %s' % filename)
document_file = Attachment(part, name=filename)
source.upload_file(document_file, expand=(source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y), document_type=source.document_type)
@@ -274,7 +273,7 @@ class POP3Email(EmailBaseModel):
else:
difference = datetime.datetime.now() - last_check
initial_trigger = False
if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
try:
logger.debug('Starting POP3 email fetch')
@@ -293,28 +292,28 @@ class POP3Email(EmailBaseModel):
mailbox.user(self.username)
mailbox.pass_(self.password)
messages_info = mailbox.list()
logger.debug('messages_info:')
logger.debug(messages_info)
logger.debug('messages count: %s' % len(messages_info[1]))
for message_info in messages_info[1]:
message_number, message_size = message_info.split()
logger.debug('message_number: %s' % message_number)
logger.debug('message_size: %s' % message_size)
complete_message = '\n'.join(mailbox.retr(message_number)[1])
EmailBaseModel.process_message(source=self, message=complete_message)
mailbox.dele(message_number)
mailbox.quit()
SourceLog.objects.save_status(source=self, status='Successful connection.')
except Exception, exc:
logger.error('Unhandled exception: %s' % exc)
SourceLog.objects.save_status(source=self, status='Error: %s' % exc)
class Meta(EmailBaseModel.Meta):
verbose_name = _(u'POP email')
verbose_name_plural = _(u'POP email')
@@ -322,7 +321,7 @@ class POP3Email(EmailBaseModel):
class IMAPEmail(EmailBaseModel):
source_type = SOURCE_CHOICE_IMAP_EMAIL
mailbox = models.CharField(max_length=64, blank=True, verbose_name=_(u'mailbox'), help_text=_(u'Mail from which to check for messages with attached documents. If none is specified, the default mailbox is %s') % IMAP_DEFAULT_MAILBOX)
# http://www.doughellmann.com/PyMOTW/imaplib/
@@ -336,7 +335,7 @@ class IMAPEmail(EmailBaseModel):
else:
difference = datetime.datetime.now() - last_check
initial_trigger = False
if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
try:
logger.debug('Starting IMAP email fetch')
@@ -353,7 +352,7 @@ class IMAPEmail(EmailBaseModel):
mailbox.login(self.username, self.password)
mailbox.select(self.mailbox or IMAP_DEFAULT_MAILBOX)
status, data = mailbox.search(None, 'NOT', 'DELETED')
if data:
messages_info = data[0].split()
@@ -369,7 +368,7 @@ class IMAPEmail(EmailBaseModel):
mailbox.close()
mailbox.logout()
SourceLog.objects.save_status(source=self, status='Successful connection.')
except Exception, exc:
logger.error('Unhandled exception: %s' % exc)
SourceLog.objects.save_status(source=self, status='Error: %s' % exc)

View File

@@ -1,12 +1,7 @@
from __future__ import absolute_import
from datetime import timedelta, datetime
import platform
import logging
from django.db.models import Q
from job_processor.api import process_job
from lock_manager import Lock, LockError
from .models import POP3Email, IMAPEmail
@@ -20,7 +15,7 @@ def task_fetch_single_pop3_email(pop3_email):
try:
lock_id = u'task_fetch_pop3_email-%d' % pop3_email.pk
logger.debug('trying to acquire lock: %s' % lock_id)
lock = Lock.acquire_lock(lock_id, POP3_TIMEOUT + 60) # Lock expiration = POP3 timeout + 60 seconds
lock = Lock.acquire_lock(lock_id, POP3_TIMEOUT + 60) # Lock expiration = POP3 timeout + 60 seconds
logger.debug('acquired lock: %s' % lock_id)
try:
pop3_email.fetch_mail()
@@ -31,7 +26,7 @@ def task_fetch_single_pop3_email(pop3_email):
except LockError:
logger.error('unable to obtain lock')
pass
def task_fetch_pop3_emails():
logger.debug('executing')
@@ -57,7 +52,7 @@ def task_fetch_single_imap_email(imap_email):
except LockError:
logger.error('unable to obtain lock')
pass
def task_fetch_imap_emails():
logger.debug('executing')

View File

@@ -35,6 +35,6 @@ urlpatterns = patterns('sources.views',
url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'),
url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'),
url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'),
url(r'^setup/source/(?P<source_type>\w+)/(?P<source_pk>\d+)/log/list/$', 'setup_source_log_list', (), 'setup_source_log_list'),
url(r'^setup/source/(?P<source_type>\w+)/(?P<source_pk>\d+)/log/list/$', 'setup_source_log_list', (), 'setup_source_log_list'),
)

View File

@@ -73,7 +73,7 @@ def get_active_tab_links(document=None):
staging_folders = StagingFolder.objects.filter(enabled=True)
for staging_folder in staging_folders:
tab_links.append(get_tab_link_for_source(staging_folder, document))
return {
'tab_links': tab_links,
SOURCE_CHOICE_WEB_FORM: web_forms,
@@ -480,7 +480,7 @@ def setup_source_edit(request, source_type, source_id):
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
cls = IMAPEmail
form_class = IMAPEmailSetupForm
source = get_object_or_404(cls, pk=source_id)
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
@@ -623,7 +623,7 @@ def setup_source_log_list(request, source_type, source_pk):
cls = POP3Email
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
cls = IMAPEmail
source = get_object_or_404(cls, pk=source_pk)
context = {
@@ -659,7 +659,7 @@ def setup_source_transformation_list(request, source_type, source_id):
cls = POP3Email
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
cls = IMAPEmail
source = get_object_or_404(cls, pk=source_id)
context = {
@@ -765,7 +765,7 @@ def setup_source_transformation_create(request, source_type, source_id):
cls = POP3Email
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
cls = IMAPEmail
source = get_object_or_404(cls, pk=source_id)
redirect_view = reverse('setup_source_transformation_list', args=[source.source_type, source.pk])

View File

@@ -7,16 +7,15 @@ from navigation.api import (bind_links, register_top_menu,
from common.utils import encapsulate
from documents.models import Document
from acls.api import class_permissions
from acls.permissions import ACLS_VIEW_ACL
from taggit.models import Tag
from taggit.managers import TaggableManager
from .widgets import (get_tags_inline_widget_simple, single_tag_widget)
from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH,
from .permissions import (PERMISSION_TAG_ATTACH,
PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT,
PERMISSION_TAG_VIEW)
from .links import (tag_list, tag_create, tag_attach, tag_document_remove,
from .links import (tag_list, tag_create, tag_attach,
tag_document_remove_multiple, tag_document_list, tag_delete, tag_edit,
tag_tagged_item_list, tag_multiple_delete, tag_acl_list)

View File

@@ -6,8 +6,7 @@ from navigation.api import Link
from acls.permissions import ACLS_VIEW_ACL
from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH,
PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT,
PERMISSION_TAG_VIEW)
PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT)
tag_list = Link(text=_(u'tag list'), view='tag_list', sprite='tag_blue')
tag_create = Link(text=_(u'create new tag'), view='tag_create', sprite='tag_blue_add', permissions=[PERMISSION_TAG_CREATE])

View File

@@ -1,6 +1,5 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User, Group
from navigation.api import bind_links, register_multi_item_links

View File

@@ -165,7 +165,6 @@ INSTALLED_APPS = (
'mimetype',
'scheduler',
'job_processor',
'installation',
# Mayan EDMS
'storage',
'documents',
@@ -180,12 +179,13 @@ INSTALLED_APPS = (
'document_acls',
'ocr',
'history',
'main',
'rest_api',
'document_signatures',
#'workflows',
'checkouts',
'bootstrap',
#'bootstrap',
'main',
'installation',
# Has to be last so the other apps can register it's signals
'signaler',

View File

@@ -36,7 +36,7 @@ urlpatterns = patterns('',
(r'^checkouts/', include('checkouts.urls')),
(r'^installation/', include('installation.urls')),
(r'^scheduler/', include('scheduler.urls')),
(r'^bootstrap/', include('bootstrap.urls')),
#(r'^bootstrap/', include('bootstrap.urls')),
)