Import and PEP8 cleanups
This commit is contained in:
@@ -6,7 +6,7 @@ from project_setup.api import register_setup
|
|||||||
from .classes import (AccessHolder, AccessObjectClass, ClassAccessHolder,
|
from .classes import (AccessHolder, AccessObjectClass, ClassAccessHolder,
|
||||||
AccessObject)
|
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_holder_new, acl_setup_valid_classes, acl_class_list,
|
||||||
acl_class_acl_list, acl_class_acl_detail, acl_class_new_holder_for,
|
acl_class_acl_list, acl_class_acl_detail, acl_class_new_holder_for,
|
||||||
acl_class_grant, acl_class_revoke)
|
acl_class_grant, acl_class_revoke)
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ class AccessEntryManager(models.Manager):
|
|||||||
|
|
||||||
actor = AnonymousUserSingleton.objects.passthru_check(actor)
|
actor = AnonymousUserSingleton.objects.passthru_check(actor)
|
||||||
try:
|
try:
|
||||||
content_type=ContentType.objects.get_for_model(obj)
|
content_type = ContentType.objects.get_for_model(obj)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# Object doesn't have a content type, therefore allow access
|
# Object doesn't have a content type, therefore allow access
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from project_setup.api import register_setup
|
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 .links import database_bootstrap, bootstrap_execute, erase_database_link
|
||||||
from .api import BootstrapSimple, BootstrapPermit
|
from .api import BootstrapSimple, BootstrapPermit
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ from django.contrib.auth.models import User, Group
|
|||||||
from permissions.models import Role
|
from permissions.models import Role
|
||||||
from documents.models import DocumentType, DocumentTypeFilename, Document
|
from documents.models import DocumentType, DocumentTypeFilename, Document
|
||||||
from metadata.models import MetadataType, MetadataSet
|
from metadata.models import MetadataType, MetadataSet
|
||||||
from metadata.api import save_metadata_list
|
|
||||||
from document_indexing.models import Index, IndexTemplateNode
|
from document_indexing.models import Index, IndexTemplateNode
|
||||||
from sources.models import WebForm, StagingFolder
|
from sources.models import WebForm, StagingFolder
|
||||||
from ocr.models import QueueDocument, QueueTransformation, DocumentQueue
|
from ocr.models import QueueDocument, QueueTransformation, DocumentQueue
|
||||||
@@ -90,11 +89,11 @@ def nuke_database():
|
|||||||
|
|
||||||
# Delete all foders
|
# Delete all foders
|
||||||
for obj in Folder.objects.all():
|
for obj in Folder.objects.all():
|
||||||
obj.delete()
|
obj.delete()
|
||||||
|
|
||||||
# Delete all recent searches
|
# Delete all recent searches
|
||||||
for obj in RecentSearch.objects.all():
|
for obj in RecentSearch.objects.all():
|
||||||
obj.delete()
|
obj.delete()
|
||||||
|
|
||||||
# Clear the entire key ring (public and private keys)
|
# Clear the entire key ring (public and private keys)
|
||||||
gpg.delete_all_keys()
|
gpg.delete_all_keys()
|
||||||
@@ -107,21 +106,21 @@ class BootstrapBase(object):
|
|||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.label)
|
return unicode(self.label)
|
||||||
|
|
||||||
|
|
||||||
class BootstrapSimple(BootstrapBase):
|
class BootstrapSimple(BootstrapBase):
|
||||||
name = 'simple'
|
name = 'simple'
|
||||||
label = _(u'Simple')
|
label = _(u'Simple')
|
||||||
description = _(u'A simple setup providing an uploaded date metadata and index plus an alphabetic index based on document filenames.')
|
description = _(u'A simple setup providing an uploaded date metadata and index plus an alphabetic index based on document filenames.')
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
# Create metadata types
|
# Create metadata types
|
||||||
upload_date = MetadataType.objects.create(name='upload_date', title=ugettext(u'Upload date'), default='current_date()')
|
upload_date = MetadataType.objects.create(name='upload_date', title=ugettext(u'Upload date'), default='current_date()')
|
||||||
|
|
||||||
# Create a segmented date index
|
# Create a segmented date index
|
||||||
index = Index.objects.create(name='date_tree', title=ugettext(u'Segmented date index'), enabled=True)
|
index = Index.objects.create(name='date_tree', title=ugettext(u'Segmented date index'), enabled=True)
|
||||||
template_root = index.template_root
|
template_root = index.template_root
|
||||||
|
|
||||||
# Create index template
|
# Create index template
|
||||||
node1 = IndexTemplateNode.objects.create(parent=template_root, index=index, expression='metadata.upload_date[0:4]', enabled=True, link_documents=False)
|
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)
|
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'
|
name = 'permits'
|
||||||
label = _(u'Permits')
|
label = _(u'Permits')
|
||||||
description = _(u'A setup for handling permits and related documents.')
|
description = _(u'A setup for handling permits and related documents.')
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
# Create document types
|
# Create document types
|
||||||
form = DocumentType.objects.create(name=ugettext(u'Form'))
|
form = DocumentType.objects.create(name=ugettext(u'Form'))
|
||||||
@@ -142,17 +141,17 @@ class BootstrapPermit(BootstrapBase):
|
|||||||
blueprint = DocumentType.objects.create(name=ugettext(u'Blueprint'))
|
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'Floorplan'))
|
||||||
DocumentTypeFilename.objects.create(document_type=blueprint, filename=ugettext(u'Plot plan'))
|
DocumentTypeFilename.objects.create(document_type=blueprint, filename=ugettext(u'Plot plan'))
|
||||||
|
|
||||||
# Create metadata types
|
# Create metadata types
|
||||||
date = MetadataType.objects.create(name='date', title=ugettext(u'Date'), default='current_date()')
|
date = MetadataType.objects.create(name='date', title=ugettext(u'Date'), default='current_date()')
|
||||||
client = MetadataType.objects.create(name='client', title=ugettext(u'Client'))
|
client = MetadataType.objects.create(name='client', title=ugettext(u'Client'))
|
||||||
permit = MetadataType.objects.create(name='permit', title=ugettext(u'Permit number'))
|
permit = MetadataType.objects.create(name='permit', title=ugettext(u'Permit number'))
|
||||||
project = MetadataType.objects.create(name='project', title=ugettext(u'Project'))
|
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])')
|
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
|
# Create a segmented date index
|
||||||
index = Index.objects.create(name='main_index', title=ugettext(u'Permit index'), enabled=True)
|
index = Index.objects.create(name='main_index', title=ugettext(u'Permit index'), enabled=True)
|
||||||
|
|
||||||
# Create index template
|
# 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 = 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)
|
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 = 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)
|
per_client_child = IndexTemplateNode.objects.create(parent=per_client, index=index, expression='metadata.client', enabled=True, link_documents=True)
|
||||||
|
|
||||||
|
|
||||||
for bootstrap in [BootstrapSimple(), BootstrapPermit()]:
|
for bootstrap in [BootstrapSimple(), BootstrapPermit()]:
|
||||||
bootstrap_options[bootstrap.name] = bootstrap
|
bootstrap_options[bootstrap.name] = bootstrap
|
||||||
|
|||||||
@@ -2,8 +2,10 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
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]}
|
from .permissions import PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_NUKE_DATABASE
|
||||||
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]}
|
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])
|
||||||
|
|||||||
@@ -8,4 +8,3 @@ namespace = PermissionNamespace('bootstrap', _(u'Database bootstrap'))
|
|||||||
|
|
||||||
PERMISSION_BOOTSTRAP_EXECUTE = Permission.objects.register(namespace, 'bootstrap_execute', _(u'Execute document bootstraps'))
|
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'))
|
PERMISSION_NUKE_DATABASE = Permission.objects.register(namespace, 'nuke_database', _(u'Erase the entire database and document storage'))
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.http import HttpResponseRedirect
|
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.template import RequestContext
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
@@ -10,12 +10,12 @@ from django.core.urlresolvers import reverse
|
|||||||
from permissions.models import Permission
|
from permissions.models import Permission
|
||||||
|
|
||||||
from .api import bootstrap_options, nuke_database
|
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):
|
def bootstrap_type_list(request):
|
||||||
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE])
|
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE])
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'object_list': bootstrap_options.values(),
|
'object_list': bootstrap_options.values(),
|
||||||
'title': _(u'database bootstrap setups'),
|
'title': _(u'database bootstrap setups'),
|
||||||
@@ -32,7 +32,7 @@ def bootstrap_type_list(request):
|
|||||||
def bootstrap_execute(request, bootstrap_name):
|
def bootstrap_execute(request, bootstrap_name):
|
||||||
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE])
|
Permission.objects.check_permissions(request.user, [PERMISSION_BOOTSTRAP_EXECUTE])
|
||||||
bootstrap = bootstrap_options[bootstrap_name]
|
bootstrap = bootstrap_options[bootstrap_name]
|
||||||
|
|
||||||
post_action_redirect = reverse('bootstrap_type_list')
|
post_action_redirect = reverse('bootstrap_type_list')
|
||||||
|
|
||||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
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!')
|
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,
|
return render_to_response('generic_confirm.html', context,
|
||||||
context_instance=RequestContext(request))
|
context_instance=RequestContext(request))
|
||||||
|
|||||||
@@ -2,13 +2,10 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from navigation.api import (bind_links, register_top_menu,
|
from navigation.api import bind_links, register_top_menu
|
||||||
register_model_list_columns,
|
|
||||||
register_sidebar_template, Link)
|
|
||||||
from scheduler.api import register_interval_job
|
from scheduler.api import register_interval_job
|
||||||
|
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from documents.permissions import PERMISSION_DOCUMENT_VIEW
|
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
|
|
||||||
from .permissions import (PERMISSION_DOCUMENT_CHECKOUT,
|
from .permissions import (PERMISSION_DOCUMENT_CHECKOUT,
|
||||||
@@ -37,6 +34,6 @@ class_permissions(Document, [
|
|||||||
PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE
|
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)
|
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()
|
initialize_document_checkout_extra_methods()
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ class DocumentNotCheckedOut(Exception):
|
|||||||
Raised when trying to checkin a document that is not checkedout
|
Raised when trying to checkin a document that is not checkedout
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class DocumentAlreadyCheckedOut(Exception):
|
class DocumentAlreadyCheckedOut(Exception):
|
||||||
"""
|
"""
|
||||||
Raised when trying to checkout an already checkedout document
|
Raised when trying to checkout an already checkedout document
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
from .models import DocumentCheckout
|
from .models import DocumentCheckout
|
||||||
from .exceptions import DocumentAlreadyCheckedOut
|
from .exceptions import DocumentAlreadyCheckedOut
|
||||||
@@ -17,7 +16,7 @@ class DocumentCheckoutForm(forms.ModelForm):
|
|||||||
|
|
||||||
widgets = {
|
widgets = {
|
||||||
'document': forms.widgets.HiddenInput(),
|
'document': forms.widgets.HiddenInput(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def clean_document(self):
|
def clean_document(self):
|
||||||
document = self.cleaned_data['document']
|
document = self.cleaned_data['document']
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from documents.permissions import PERMISSION_DOCUMENT_VIEW
|
|
||||||
from navigation.api import Link
|
from navigation.api import Link
|
||||||
|
|
||||||
from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE)
|
from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
|
|||||||
class DocumentCheckoutManager(models.Manager):
|
class DocumentCheckoutManager(models.Manager):
|
||||||
def checked_out_documents(self):
|
def checked_out_documents(self):
|
||||||
return Document.objects.filter(pk__in=self.model.objects.all().values_list('document__pk', flat=True))
|
return Document.objects.filter(pk__in=self.model.objects.all().values_list('document__pk', flat=True))
|
||||||
|
|
||||||
def expired_check_outs(self):
|
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))
|
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)
|
logger.debug('expired_list: %s' % expired_list)
|
||||||
@@ -37,7 +37,7 @@ class DocumentCheckoutManager(models.Manager):
|
|||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def check_in_document(self, document, user=None):
|
def check_in_document(self, document, user=None):
|
||||||
try:
|
try:
|
||||||
document_checkout = self.model.objects.get(document=document)
|
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})
|
history_document_checked_in.commit(source_object=document, data={'user': user, 'document': document})
|
||||||
else:
|
else:
|
||||||
history_document_auto_checked_in.commit(source_object=document, data={'document': document})
|
history_document_auto_checked_in.commit(source_object=document, data={'document': document})
|
||||||
|
|
||||||
document_checkout.delete()
|
document_checkout.delete()
|
||||||
|
|
||||||
def document_checkout_info(self, document):
|
def document_checkout_info(self, document):
|
||||||
try:
|
try:
|
||||||
return self.model.objects.get(document=document)
|
return self.model.objects.get(document=document)
|
||||||
@@ -93,7 +93,6 @@ class DocumentCheckoutManager(models.Manager):
|
|||||||
# Last resort check if original user enabled restriction
|
# Last resort check if original user enabled restriction
|
||||||
return not checkout_info.block_new_version
|
return not checkout_info.block_new_version
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from __future__ import absolute_import
|
|||||||
import logging
|
import logging
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from django.db import models, IntegrityError
|
from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.contrib.contenttypes import generic
|
from django.contrib.contenttypes import generic
|
||||||
@@ -11,7 +11,6 @@ from django.contrib.contenttypes import generic
|
|||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
|
|
||||||
from .managers import DocumentCheckoutManager
|
from .managers import DocumentCheckoutManager
|
||||||
from .exceptions import DocumentAlreadyCheckedOut
|
|
||||||
from .events import history_document_checked_out
|
from .events import history_document_checked_out
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -33,9 +32,9 @@ class DocumentCheckout(models.Model):
|
|||||||
#block_metadata
|
#block_metadata
|
||||||
#block_editing
|
#block_editing
|
||||||
#block tag add/remove
|
#block tag add/remove
|
||||||
|
|
||||||
objects = DocumentCheckoutManager()
|
objects = DocumentCheckoutManager()
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.document)
|
return unicode(self.document)
|
||||||
|
|
||||||
@@ -45,11 +44,11 @@ class DocumentCheckout(models.Model):
|
|||||||
result = super(DocumentCheckout, self).save(*args, **kwargs)
|
result = super(DocumentCheckout, self).save(*args, **kwargs)
|
||||||
history_document_checked_out.commit(source_object=self.document, data={'user': self.user_object, 'document': self.document})
|
history_document_checked_out.commit(source_object=self.document, data={'user': self.user_object, 'document': self.document})
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@models.permalink
|
@models.permalink
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return ('checkout_info', [self.document.pk])
|
return ('checkout_info', [self.document.pk])
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _(u'document checkout')
|
verbose_name = _(u'document checkout')
|
||||||
verbose_name_plural = _(u'document checkouts')
|
verbose_name_plural = _(u'document checkouts')
|
||||||
|
|||||||
@@ -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 = 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_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'))
|
PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE = Permission.objects.register(namespace, 'checkout_restrictions_override', _(u'Allow overriding check out restrictions'))
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHEC
|
|||||||
PERMISSION_DOCUMENT_CHECKIN_OVERRIDE)
|
PERMISSION_DOCUMENT_CHECKIN_OVERRIDE)
|
||||||
from .forms import DocumentCheckoutForm
|
from .forms import DocumentCheckoutForm
|
||||||
from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut
|
from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut
|
||||||
from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS
|
|
||||||
from .widgets import checkout_widget
|
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 time: %s') % checkout_info.checkout_datetime)
|
||||||
paragraphs.append(_(u'Check out expiration: %s') % checkout_info.expiration_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')))
|
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', {
|
return render_to_response('generic_template.html', {
|
||||||
'paragraphs': paragraphs,
|
'paragraphs': paragraphs,
|
||||||
'object': document,
|
'object': document,
|
||||||
'title': _(u'Check out details for document: %s') % document
|
'title': _(u'Check out details for document: %s') % document
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def checkout_document(request, document_pk):
|
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])
|
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKOUT])
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKOUT, request.user, document)
|
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKOUT, request.user, document)
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = DocumentCheckoutForm(data=request.POST, initial={'document': document})
|
form = DocumentCheckoutForm(data=request.POST, initial={'document': document})
|
||||||
try:
|
try:
|
||||||
@@ -94,7 +93,7 @@ def checkout_document(request, document_pk):
|
|||||||
'form': form,
|
'form': form,
|
||||||
'object': document,
|
'object': document,
|
||||||
'title': _(u'Check out document: %s') % document
|
'title': _(u'Check out document: %s') % document
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def checkin_document(request, document_pk):
|
def checkin_document(request, document_pk):
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from django.utils.safestring import mark_safe
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core import validators
|
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):
|
def checkout_widget(document):
|
||||||
@@ -27,9 +27,9 @@ class SplitDeltaWidget(forms.widgets.MultiWidget):
|
|||||||
"""
|
"""
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
widgets = (
|
widgets = (
|
||||||
forms.widgets.TextInput(attrs={'maxlength': 3, 'style':'width: 5em;', 'placeholder': _(u'Days')}),
|
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': 4, 'style': 'width: 5em;', 'placeholder': _(u'Hours')}),
|
||||||
forms.widgets.TextInput(attrs={'maxlength': 5, 'style':'width: 5em;', 'placeholder': _(u'Minutes')}),
|
forms.widgets.TextInput(attrs={'maxlength': 5, 'style': 'width: 5em;', 'placeholder': _(u'Minutes')}),
|
||||||
)
|
)
|
||||||
super(SplitDeltaWidget, self).__init__(widgets, attrs)
|
super(SplitDeltaWidget, self).__init__(widgets, attrs)
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ class SplitHiddenDeltaWidget(forms.widgets.SplitDateTimeWidget):
|
|||||||
is_hidden = True
|
is_hidden = True
|
||||||
|
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
super(SplitHiddenDeltaWidget, self).__init__(attrs, date_format, time_format)
|
super(SplitHiddenDeltaWidget, self).__init__(attrs)
|
||||||
for widget in self.widgets:
|
for widget in self.widgets:
|
||||||
widget.input_type = 'hidden'
|
widget.input_type = 'hidden'
|
||||||
widget.is_hidden = True
|
widget.is_hidden = True
|
||||||
@@ -73,15 +73,15 @@ class SplitTimeDeltaField(forms.MultiValueField):
|
|||||||
fields = (
|
fields = (
|
||||||
forms.IntegerField(min_value=0,
|
forms.IntegerField(min_value=0,
|
||||||
error_messages={'invalid': errors['invalid_days']},
|
error_messages={'invalid': errors['invalid_days']},
|
||||||
localize=localize
|
localize=localize
|
||||||
),
|
),
|
||||||
forms.IntegerField(min_value=0,
|
forms.IntegerField(min_value=0,
|
||||||
error_messages={'invalid': errors['invalid_hours']},
|
error_messages={'invalid': errors['invalid_hours']},
|
||||||
localize=localize
|
localize=localize
|
||||||
),
|
),
|
||||||
forms.IntegerField(min_value=0,
|
forms.IntegerField(min_value=0,
|
||||||
error_messages={'invalid': errors['invalid_minutes']},
|
error_messages={'invalid': errors['invalid_minutes']},
|
||||||
localize=localize
|
localize=localize
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
super(SplitTimeDeltaField, self).__init__(fields, *args, **kwargs)
|
super(SplitTimeDeltaField, self).__init__(fields, *args, **kwargs)
|
||||||
@@ -91,7 +91,7 @@ class SplitTimeDeltaField(forms.MultiValueField):
|
|||||||
def compress(self, data_list):
|
def compress(self, data_list):
|
||||||
if data_list == [0, 0, 0]:
|
if data_list == [0, 0, 0]:
|
||||||
raise forms.ValidationError(self.error_messages['invalid_timedelta'])
|
raise forms.ValidationError(self.error_messages['invalid_timedelta'])
|
||||||
|
|
||||||
if data_list:
|
if data_list:
|
||||||
# Raise a validation error if time or date is empty
|
# Raise a validation error if time or date is empty
|
||||||
# (possible if SplitDateTimeField has required=False).
|
# (possible if SplitDateTimeField has required=False).
|
||||||
@@ -100,8 +100,8 @@ class SplitTimeDeltaField(forms.MultiValueField):
|
|||||||
if data_list[1] in validators.EMPTY_VALUES:
|
if data_list[1] in validators.EMPTY_VALUES:
|
||||||
raise forms.ValidationError(self.error_messages['invalid_hours'])
|
raise forms.ValidationError(self.error_messages['invalid_hours'])
|
||||||
if data_list[2] in validators.EMPTY_VALUES:
|
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])
|
timedelta = datetime.timedelta(days=data_list[0], hours=data_list[1], minutes=data_list[2])
|
||||||
return datetime.datetime.now() + timedelta
|
return datetime.datetime.now() + timedelta
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ from south.signals import post_migrate
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.auth import models as auth_models
|
from django.contrib.auth import models as auth_models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.auth.management import create_superuser
|
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db.models.signals import post_save
|
from django.db.models.signals import post_save
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from django.template import Library
|
from django.template import Library
|
||||||
from django.utils.importlib import import_module
|
|
||||||
|
|
||||||
from common.models import AutoAdminSingleton
|
from common.models import AutoAdminSingleton
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,9 @@ import logging
|
|||||||
|
|
||||||
from mimetype.api import get_mimetype
|
from mimetype.api import get_mimetype
|
||||||
from common.conf.settings import TEMPORARY_DIRECTORY
|
from common.conf.settings import TEMPORARY_DIRECTORY
|
||||||
from common.utils import id_generator
|
|
||||||
|
|
||||||
from .conf.settings import LIBREOFFICE_PATH
|
from .conf.settings import LIBREOFFICE_PATH
|
||||||
from .exceptions import (OfficeConversionError,
|
from .exceptions import OfficeBackendError, UnknownFileFormat
|
||||||
OfficeBackendError, UnknownFileFormat)
|
|
||||||
|
|
||||||
CACHED_FILE_SUFFIX = u'_office_converter'
|
CACHED_FILE_SUFFIX = u'_office_converter'
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from navigation.api import bind_links
|
||||||
|
|
||||||
from navigation.api import bind_links, Link
|
|
||||||
from project_setup.api import register_setup
|
from project_setup.api import register_setup
|
||||||
from hkp import Key as KeyServerKey
|
from hkp import Key as KeyServerKey
|
||||||
|
|
||||||
from .api import Key
|
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,
|
from .links import (private_keys, public_keys, key_delete, key_query,
|
||||||
key_receive, key_setup)
|
key_receive, key_setup)
|
||||||
|
|
||||||
|
|||||||
@@ -325,7 +325,7 @@ class GPG(object):
|
|||||||
# Delete secret keys first
|
# Delete secret keys first
|
||||||
for key in Key.get_all(self, secret=True):
|
for key in Key.get_all(self, secret=True):
|
||||||
self.delete_key(key)
|
self.delete_key(key)
|
||||||
|
|
||||||
# Delete public keys
|
# Delete public keys
|
||||||
for key in Key.get_all(self, secret=False):
|
for key in Key.get_all(self, secret=False):
|
||||||
self.delete_key(key)
|
self.delete_key(key)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from common.utils import encapsulate
|
|||||||
|
|
||||||
from .api import Key
|
from .api import Key
|
||||||
from .runtime import gpg
|
from .runtime import gpg
|
||||||
from .exceptions import KeyFetchingError, KeyImportError
|
from .exceptions import KeyImportError
|
||||||
from .forms import KeySearchForm
|
from .forms import KeySearchForm
|
||||||
from .permissions import (PERMISSION_KEY_VIEW, PERMISSION_KEY_DELETE,
|
from .permissions import (PERMISSION_KEY_VIEW, PERMISSION_KEY_DELETE,
|
||||||
PERMISSION_KEYSERVER_QUERY, PERMISSION_KEY_RECEIVE)
|
PERMISSION_KEYSERVER_QUERY, PERMISSION_KEY_RECEIVE)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from django.conf import settings
|
|||||||
from django.contrib.comments.models import Comment
|
from django.contrib.comments.models import Comment
|
||||||
from django.contrib.contenttypes import generic
|
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 common.utils import encapsulate
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
@@ -15,8 +15,7 @@ if 'django.contrib.comments' not in settings.INSTALLED_APPS:
|
|||||||
|
|
||||||
from .permissions import (PERMISSION_COMMENT_CREATE,
|
from .permissions import (PERMISSION_COMMENT_CREATE,
|
||||||
PERMISSION_COMMENT_DELETE, PERMISSION_COMMENT_VIEW)
|
PERMISSION_COMMENT_DELETE, PERMISSION_COMMENT_VIEW)
|
||||||
from .links import (comment_delete, comment_multiple_delete, comment_add,
|
from .links import (comment_delete, comment_add, comments_for_document)
|
||||||
comments_for_document)
|
|
||||||
|
|
||||||
register_model_list_columns(Comment, [
|
register_model_list_columns(Comment, [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,18 +2,15 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from django.db.models.signals import pre_save, post_save, pre_delete
|
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils.translation import ugettext_lazy as _
|
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 django.db.models.signals import post_save, pre_delete, post_delete
|
||||||
|
|
||||||
from navigation.api import (register_top_menu, register_sidebar_template,
|
from navigation.api import (register_top_menu, register_sidebar_template,
|
||||||
bind_links, Link)
|
bind_links, Link)
|
||||||
|
|
||||||
from main.api import register_maintenance_links
|
from main.api import register_maintenance_links
|
||||||
from documents.models import Document, DocumentVersion
|
from documents.models import Document
|
||||||
from documents.permissions import PERMISSION_DOCUMENT_VIEW
|
|
||||||
from metadata.models import DocumentMetadata
|
from metadata.models import DocumentMetadata
|
||||||
from project_setup.api import register_setup
|
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,
|
from .links import (index_setup, index_setup_list, index_setup_create,
|
||||||
index_setup_edit, index_setup_delete, index_setup_view,
|
index_setup_edit, index_setup_delete, index_setup_view,
|
||||||
template_node_create, template_node_edit, template_node_delete,
|
template_node_create, template_node_edit, template_node_delete,
|
||||||
index_list, index_parent, document_index_list, rebuild_index_instances)
|
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
|
|
||||||
)
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -70,7 +60,7 @@ def document_metadata_index_update(sender, **kwargs):
|
|||||||
def document_metadata_index_delete(sender, **kwargs):
|
def document_metadata_index_delete(sender, **kwargs):
|
||||||
# TODO: save result in index log
|
# TODO: save result in index log
|
||||||
delete_indexes(kwargs['instance'].document)
|
delete_indexes(kwargs['instance'].document)
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_delete, dispatch_uid='document_metadata_index_post_delete', sender=DocumentMetadata)
|
@receiver(post_delete, dispatch_uid='document_metadata_index_post_delete', sender=DocumentMetadata)
|
||||||
def document_metadata_index_post_delete(sender, **kwargs):
|
def document_metadata_index_post_delete(sender, **kwargs):
|
||||||
|
|||||||
@@ -7,12 +7,11 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
#from django.db.models.signals import post_save
|
#from django.db.models.signals import post_save
|
||||||
#from django.dispatch import receiver
|
#from django.dispatch import receiver
|
||||||
|
|
||||||
from documents.models import Document, DocumentVersion
|
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.runtime import gpg
|
||||||
from django_gpg.exceptions import GPGDecryptionError
|
from django_gpg.exceptions import GPGDecryptionError
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from documents.models import Document, DocumentVersion
|
|
||||||
from navigation.api import Link
|
from navigation.api import Link
|
||||||
|
|
||||||
from .models import DocumentVersionSignature
|
from .models import DocumentVersionSignature
|
||||||
|
|||||||
@@ -20,10 +20,7 @@ from .permissions import (PERMISSION_DOCUMENT_PROPERTIES_EDIT,
|
|||||||
PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_DELETE,
|
PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_DELETE,
|
||||||
PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_TRANSFORM,
|
PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_TRANSFORM,
|
||||||
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VERSION_REVERT,
|
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VERSION_REVERT,
|
||||||
PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE,
|
PERMISSION_DOCUMENT_NEW_VERSION)
|
||||||
PERMISSION_DOCUMENT_TOOLS)
|
|
||||||
from .conf.settings import ZOOM_MAX_LEVEL
|
|
||||||
from .conf.settings import ZOOM_MIN_LEVEL
|
|
||||||
from .conf import settings as document_settings
|
from .conf import settings as document_settings
|
||||||
from .widgets import document_thumbnail
|
from .widgets import document_thumbnail
|
||||||
from .links import (document_list, document_list_recent,
|
from .links import (document_list, document_list_recent,
|
||||||
|
|||||||
@@ -547,7 +547,7 @@ class DocumentVersion(models.Model):
|
|||||||
def rename(self, new_name):
|
def rename(self, new_name):
|
||||||
new_filename, new_extension = os.path.splitext(new_name)
|
new_filename, new_extension = os.path.splitext(new_name)
|
||||||
name, extension = os.path.splitext(self.filename)
|
name, extension = os.path.splitext(self.filename)
|
||||||
|
|
||||||
# Preserve existing extension if new name doesn't has one
|
# Preserve existing extension if new name doesn't has one
|
||||||
if new_extension:
|
if new_extension:
|
||||||
extension = new_extension
|
extension = new_extension
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from django.db import connection
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
|||||||
@@ -3,15 +3,13 @@ from __future__ import absolute_import
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from project_tools.api import register_tool
|
from project_tools.api import register_tool
|
||||||
from navigation.api import (bind_links, register_top_menu,
|
from navigation.api import bind_links, register_model_list_columns
|
||||||
register_model_list_columns,
|
|
||||||
register_sidebar_template, Link)
|
|
||||||
from common.utils import encapsulate
|
from common.utils import encapsulate
|
||||||
|
|
||||||
from .models import History
|
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
|
from .links import history_list, history_details
|
||||||
|
|
||||||
register_tool(history_list)
|
register_tool(history_list)
|
||||||
|
|
||||||
register_model_list_columns(History, [
|
register_model_list_columns(History, [
|
||||||
@@ -26,7 +24,7 @@ register_model_list_columns(History, [
|
|||||||
{
|
{
|
||||||
'name': _(u'summary'),
|
'name': _(u'summary'),
|
||||||
'attribute': encapsulate(lambda entry: unicode(entry.get_processed_summary()))
|
'attribute': encapsulate(lambda entry: unicode(entry.get_processed_summary()))
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
bind_links([History], [history_details])
|
bind_links([History], [history_details])
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import json
|
|||||||
|
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.core import serializers
|
from django.core import serializers
|
||||||
from django.shortcuts import get_object_or_404
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.utils import DatabaseError
|
from django.db.utils import DatabaseError
|
||||||
|
|
||||||
@@ -17,7 +16,7 @@ class EventNamespace(object):
|
|||||||
def __init__(self, name, label):
|
def __init__(self, name, label):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.label = label
|
self.label = label
|
||||||
|
|
||||||
|
|
||||||
class Event(object):
|
class Event(object):
|
||||||
@transaction.commit_on_success
|
@transaction.commit_on_success
|
||||||
@@ -37,8 +36,7 @@ class Event(object):
|
|||||||
history_types_dict[self.namespace.name][self.name] = self
|
history_types_dict[self.namespace.name][self.name] = self
|
||||||
except DatabaseError:
|
except DatabaseError:
|
||||||
# Special case for syncdb
|
# Special case for syncdb
|
||||||
transaction.rollback()
|
transaction.rollback()
|
||||||
|
|
||||||
|
|
||||||
def commit(self, source_object=None, data=None):
|
def commit(self, source_object=None, data=None):
|
||||||
new_history = History(history_type=self.history_type_obj)
|
new_history = History(history_type=self.history_type_obj)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ from acls.models import AccessEntry
|
|||||||
from .models import History, HistoryType
|
from .models import History, HistoryType
|
||||||
from .forms import HistoryDetailForm
|
from .forms import HistoryDetailForm
|
||||||
from .permissions import PERMISSION_HISTORY_VIEW
|
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):
|
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):
|
def history_view(request, object_id):
|
||||||
history = get_object_or_404(History, pk=object_id)
|
history = get_object_or_404(History, pk=object_id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.objects.check_permissions(request.user, [PERMISSION_HISTORY_VIEW])
|
Permission.objects.check_permissions(request.user, [PERMISSION_HISTORY_VIEW])
|
||||||
except PermissionDenied:
|
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=[
|
form = HistoryDetailForm(instance=history, extra_fields=[
|
||||||
{'label': _(u'Date'), 'field': lambda x: x.datetime.date()},
|
{'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):
|
def history_type_list(request, history_type_pk):
|
||||||
history_type = get_object_or_404(HistoryType, pk=history_type_pk)
|
history_type = get_object_or_404(HistoryType, pk=history_type_pk)
|
||||||
|
|
||||||
return history_list(
|
return history_list(
|
||||||
request,
|
request,
|
||||||
object_list=History.objects.filter(history_type=history_type),
|
object_list=History.objects.filter(history_type=history_type),
|
||||||
|
|||||||
@@ -5,13 +5,12 @@ from south.signals import post_migrate
|
|||||||
from project_tools.api import register_tool
|
from project_tools.api import register_tool
|
||||||
|
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.db.models.signals import post_save
|
|
||||||
from django.db.utils import DatabaseError
|
from django.db.utils import DatabaseError
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
|
||||||
from .links import installation_details
|
from .links import installation_details
|
||||||
from .models import Installation
|
from .models import Installation
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_migrate, dispatch_uid='trigger_first_time')
|
@receiver(post_migrate, dispatch_uid='trigger_first_time')
|
||||||
def trigger_first_time(sender, **kwargs):
|
def trigger_first_time(sender, **kwargs):
|
||||||
@@ -27,7 +26,7 @@ def check_first_run():
|
|||||||
details = Installation.objects.get()
|
details = Installation.objects.get()
|
||||||
except DatabaseError:
|
except DatabaseError:
|
||||||
# Avoid database errors when the app tables haven't been created yet
|
# Avoid database errors when the app tables haven't been created yet
|
||||||
transaction.rollback()
|
transaction.rollback()
|
||||||
else:
|
else:
|
||||||
if details.is_first_run:
|
if details.is_first_run:
|
||||||
details.submit()
|
details.submit()
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ except pbs.CommandNotFound:
|
|||||||
LSB = False
|
LSB = False
|
||||||
else:
|
else:
|
||||||
LSB = True
|
LSB = True
|
||||||
|
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
@@ -34,18 +34,19 @@ FORM_RECEIVER_FIELD = 'entry.0.single'
|
|||||||
TIMEOUT = 5
|
TIMEOUT = 5
|
||||||
FABFILE_MARKER = os.path.join(settings.PROJECT_ROOT, 'fabfile_install')
|
FABFILE_MARKER = os.path.join(settings.PROJECT_ROOT, 'fabfile_install')
|
||||||
|
|
||||||
|
|
||||||
class Property(object):
|
class Property(object):
|
||||||
def __init__(self, name, label, value):
|
def __init__(self, name, label, value):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.label = label
|
self.label = label
|
||||||
self.value = value
|
self.value = value
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.value)
|
return unicode(self.value)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.value)
|
return str(self.value)
|
||||||
|
|
||||||
|
|
||||||
class Installation(Singleton):
|
class Installation(Singleton):
|
||||||
_properties = SortedDict()
|
_properties = SortedDict()
|
||||||
@@ -64,10 +65,10 @@ class Installation(Singleton):
|
|||||||
self._properties = SortedDict()
|
self._properties = SortedDict()
|
||||||
if LSB:
|
if LSB:
|
||||||
self.add_property(Property('is_lsb', _(u'LSB OS'), True))
|
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('distributor_id', _(u'Distributor ID'), lsb_release('-i', '-s')))
|
||||||
self.add_property(Property('description', _(u'Description'), lsb_release('-d','-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('release', _(u'Release'), lsb_release('-r', '-s')))
|
||||||
self.add_property(Property('codename', _(u'Codename'), lsb_release('-c','-s')))
|
self.add_property(Property('codename', _(u'Codename'), lsb_release('-c', '-s')))
|
||||||
self.add_property(Property('sysinfo', _(u'System info'), uname('-a')))
|
self.add_property(Property('sysinfo', _(u'System info'), uname('-a')))
|
||||||
else:
|
else:
|
||||||
self.add_property(Property('is_lsb', _(u'LSB OS'), False))
|
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('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('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()])))
|
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:
|
try:
|
||||||
self.add_property(Property('tesseract', _(u'tesseract version'), pbs.tesseract('-v').stderr))
|
self.add_property(Property('tesseract', _(u'tesseract version'), pbs.tesseract('-v').stderr))
|
||||||
except pbs.CommandNotFound:
|
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('mayan_version', _(u'Mayan EDMS version'), mayan_version))
|
||||||
self.add_property(Property('fabfile', _(u'Installed via fabfile'), os.path.exists(FABFILE_MARKER)))
|
self.add_property(Property('fabfile', _(u'Installed via fabfile'), os.path.exists(FABFILE_MARKER)))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
repo = Repo(settings.PROJECT_ROOT)
|
repo = Repo(settings.PROJECT_ROOT)
|
||||||
except:
|
except:
|
||||||
self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), False))
|
self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), False))
|
||||||
else:
|
else:
|
||||||
repo.config_reader()
|
repo.config_reader()
|
||||||
headcommit = repo.head.commit
|
headcommit = repo.head.commit
|
||||||
self.add_property(Property('is_git_repo', _(u'Running from a Git repository'), True))
|
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])))
|
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_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_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))
|
self.add_property(Property('headcommit_message', _(u'HEAD commit message'), headcommit.message))
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
self.set_properties()
|
self.set_properties()
|
||||||
try:
|
try:
|
||||||
return self._properties[name]
|
return self._properties[name]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise AttributeError, name
|
raise AttributeError
|
||||||
|
|
||||||
def submit(self):
|
def submit(self):
|
||||||
try:
|
try:
|
||||||
@@ -164,7 +165,7 @@ class Installation(Singleton):
|
|||||||
'headcommit_message': unicode(self.headcommit_message),
|
'headcommit_message': unicode(self.headcommit_message),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
requests.post(FORM_SUBMIT_URL, data={'formkey': FORM_KEY, FORM_RECEIVER_FIELD: dumps(dictionary)}, timeout=TIMEOUT)
|
requests.post(FORM_SUBMIT_URL, data={'formkey': FORM_KEY, FORM_RECEIVER_FIELD: dumps(dictionary)}, timeout=TIMEOUT)
|
||||||
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError):
|
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError):
|
||||||
pass
|
pass
|
||||||
@@ -174,6 +175,5 @@ class Installation(Singleton):
|
|||||||
finally:
|
finally:
|
||||||
lock.release()
|
lock.release()
|
||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = verbose_name_plural = _(u'installation details')
|
verbose_name = verbose_name_plural = _(u'installation details')
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ from __future__ import absolute_import
|
|||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.core.exceptions import PermissionDenied
|
|
||||||
|
|
||||||
from permissions.models import Permission
|
from permissions.models import Permission
|
||||||
|
|
||||||
@@ -15,11 +14,11 @@ def installation_details(request):
|
|||||||
Permission.objects.check_permissions(request.user, [PERMISSION_INSTALLATION_DETAILS])
|
Permission.objects.check_permissions(request.user, [PERMISSION_INSTALLATION_DETAILS])
|
||||||
|
|
||||||
paragraphs = []
|
paragraphs = []
|
||||||
|
|
||||||
for name, instance in Installation().get_properties().items():
|
for name, instance in Installation().get_properties().items():
|
||||||
paragraphs.append('%s: %s' % (unicode(instance.label), instance.value))
|
paragraphs.append('%s: %s' % (unicode(instance.label), instance.value))
|
||||||
|
|
||||||
return render_to_response('generic_template.html', {
|
return render_to_response('generic_template.html', {
|
||||||
'paragraphs': paragraphs,
|
'paragraphs': paragraphs,
|
||||||
'title': _(u'Installation environment details')
|
'title': _(u'Installation environment details')
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|||||||
@@ -1,19 +1,15 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from navigation.api import bind_links, register_sidebar_template
|
||||||
|
|
||||||
from navigation.api import bind_links, register_sidebar_template, Link
|
|
||||||
from project_setup.api import register_setup
|
from project_setup.api import register_setup
|
||||||
from documents.permissions import PERMISSION_DOCUMENT_VIEW
|
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL
|
from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL
|
||||||
|
|
||||||
from .models import SmartLink, SmartLinkCondition
|
from .models import SmartLink, SmartLinkCondition
|
||||||
from .permissions import (PERMISSION_SMART_LINK_VIEW,
|
from .permissions import (PERMISSION_SMART_LINK_VIEW,
|
||||||
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
|
PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT)
|
||||||
PERMISSION_SMART_LINK_EDIT)
|
from .links import (smart_link_instances_for_document,
|
||||||
from .links import (smart_link_instance_view_link, smart_link_instances_for_document,
|
|
||||||
smart_link_setup, smart_link_list, smart_link_create, smart_link_edit,
|
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_delete, smart_link_condition_list, smart_link_condition_create,
|
||||||
smart_link_condition_edit, smart_link_condition_delete, smart_link_acl_list)
|
smart_link_condition_edit, smart_link_condition_delete, smart_link_acl_list)
|
||||||
|
|||||||
@@ -4,11 +4,10 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
|
|
||||||
from navigation.api import Link
|
from navigation.api import Link
|
||||||
from documents.permissions import PERMISSION_DOCUMENT_VIEW
|
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,
|
from .permissions import (PERMISSION_SMART_LINK_CREATE,
|
||||||
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
|
PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT)
|
||||||
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_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])
|
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])
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ from .models import SmartLink, SmartLinkCondition
|
|||||||
from .conf.settings import SHOW_EMPTY_SMART_LINKS
|
from .conf.settings import SHOW_EMPTY_SMART_LINKS
|
||||||
from .forms import (SmartLinkInstanceForm, SmartLinkForm,
|
from .forms import (SmartLinkInstanceForm, SmartLinkForm,
|
||||||
SmartLinkConditionForm)
|
SmartLinkConditionForm)
|
||||||
from . import smart_link_instance_view_link
|
from .links import smart_link_instance_view_link
|
||||||
from .permissions import (PERMISSION_SMART_LINK_VIEW,
|
from .permissions import (PERMISSION_SMART_LINK_VIEW,
|
||||||
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
|
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
|
||||||
PERMISSION_SMART_LINK_EDIT)
|
PERMISSION_SMART_LINK_EDIT)
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
from navigation.api import bind_links
|
from navigation.api import bind_links
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
|
|||||||
@@ -16,8 +16,7 @@ class DocumentMailForm(forms.Form):
|
|||||||
else:
|
else:
|
||||||
self.fields['subject'].initial = settings.LINK_SUBJECT_TEMPLATE
|
self.fields['subject'].initial = settings.LINK_SUBJECT_TEMPLATE
|
||||||
self.fields['body'].initial = settings.LINK_BODY_TEMPLATE
|
self.fields['body'].initial = settings.LINK_BODY_TEMPLATE
|
||||||
|
|
||||||
|
|
||||||
email = forms.EmailField(label=_(u'Email address'))
|
email = forms.EmailField(label=_(u'Email address'))
|
||||||
subject = forms.CharField(label=_(u'Subject'), required=False)#, initial=_(u'Link for document: {{ document }}'))
|
subject = forms.CharField(label=_(u'Subject'), required=False)
|
||||||
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>'))
|
body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False)
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ def send_document_link(request, document_id=None, document_id_list=None, as_atta
|
|||||||
else:
|
else:
|
||||||
messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % {
|
messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % {
|
||||||
'document': document, 'error': exc})
|
'document': document, 'error': exc})
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if as_attachment:
|
if as_attachment:
|
||||||
messages.success(request, _(u'Successfully sent document via email.'))
|
messages.success(request, _(u'Successfully sent document via email.'))
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
from navigation.api import Link, register_top_menu
|
from navigation.api import Link, register_top_menu
|
||||||
from project_setup.api import register_setup
|
|
||||||
from project_tools.api import register_tool
|
from project_tools.api import register_tool
|
||||||
|
|
||||||
from .conf.settings import SIDE_BAR_SEARCH, DISABLE_HOME_VIEW
|
from .conf.settings import SIDE_BAR_SEARCH, DISABLE_HOME_VIEW
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
from navigation.api import register_multi_item_links
|
from navigation.api import register_multi_item_links
|
||||||
|
|
||||||
from documents.links import document_multiple_clear_transformations, document_multiple_delete, document_multiple_download
|
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 metadata.links import metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove
|
||||||
from ocr import submit_document_multiple
|
from ocr.links import submit_document_multiple
|
||||||
|
|
||||||
|
|
||||||
def register_multi_items_links():
|
def register_multi_items_links():
|
||||||
|
|||||||
@@ -2,11 +2,10 @@ from __future__ import absolute_import
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from navigation.api import (bind_links, register_multi_item_links,
|
from navigation.api import (bind_links, register_sidebar_template,
|
||||||
register_sidebar_template, Link, register_model_list_columns)
|
register_model_list_columns)
|
||||||
from common.utils import encapsulate
|
from common.utils import encapsulate
|
||||||
from documents.models import Document, DocumentType
|
from documents.models import Document, DocumentType
|
||||||
from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT
|
|
||||||
from project_setup.api import register_setup
|
from project_setup.api import register_setup
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
|
|
||||||
@@ -15,8 +14,7 @@ from .models import MetadataType, MetadataSet
|
|||||||
from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
|
from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
|
||||||
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE,
|
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE,
|
||||||
PERMISSION_METADATA_DOCUMENT_VIEW)
|
PERMISSION_METADATA_DOCUMENT_VIEW)
|
||||||
from .links import (metadata_edit, metadata_view, metadata_multiple_edit,
|
from .links import (metadata_edit, metadata_view, metadata_add, metadata_remove,
|
||||||
metadata_add, metadata_multiple_add, metadata_remove, metadata_multiple_remove,
|
|
||||||
setup_metadata_type_list, setup_metadata_type_edit, setup_metadata_type_delete,
|
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_type_create, setup_metadata_set_list, setup_metadata_set_edit,
|
||||||
setup_metadata_set_delete, setup_metadata_set_create, setup_metadata_set_members,
|
setup_metadata_set_delete, setup_metadata_set_create, setup_metadata_set_members,
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ def metadata_add(request, document_id=None, document_id_list=None):
|
|||||||
else:
|
else:
|
||||||
messages.warning(request, _(u'Metadata type: %(metadata_type)s already present in document %(document)s.') % {
|
messages.warning(request, _(u'Metadata type: %(metadata_type)s already present in document %(document)s.') % {
|
||||||
'metadata_type': metadata_type, 'document': document})
|
'metadata_type': metadata_type, 'document': document})
|
||||||
|
|
||||||
document.mark_indexable()
|
document.mark_indexable()
|
||||||
|
|
||||||
if len(documents) == 1:
|
if len(documents) == 1:
|
||||||
@@ -513,7 +513,6 @@ def setup_metadata_set_delete(request, metadata_set_id):
|
|||||||
'metadata_set': metadata_set, 'error': e})
|
'metadata_set': metadata_set, 'error': e})
|
||||||
return HttpResponseRedirect(previous)
|
return HttpResponseRedirect(previous)
|
||||||
|
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'object_name': _(u'metadata set'),
|
'object_name': _(u'metadata set'),
|
||||||
'delete_view': True,
|
'delete_view': True,
|
||||||
|
|||||||
@@ -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)
|
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)
|
@register.inclusion_tag('generic_form_instance.html', takes_context=True)
|
||||||
def get_multi_item_links_form(context):
|
def get_multi_item_links_form(context):
|
||||||
logger.debug('starting')
|
logger.debug('starting')
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from django.db.models.signals import post_save, post_syncdb
|
|||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.db.utils import DatabaseError
|
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 documents.models import Document, DocumentVersion
|
||||||
from main.api import register_maintenance_links
|
from main.api import register_maintenance_links
|
||||||
from project_tools.api import register_tool
|
from project_tools.api import register_tool
|
||||||
@@ -26,8 +26,7 @@ from . import models as ocr_models
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
from .links import (submit_document, submit_document_multiple,
|
from .links import (submit_document, re_queue_multiple_document,
|
||||||
re_queue_document, re_queue_multiple_document, queue_document_delete,
|
|
||||||
queue_document_multiple_delete, document_queue_disable,
|
queue_document_multiple_delete, document_queue_disable,
|
||||||
document_queue_enable, all_document_ocr_cleanup, queue_document_list,
|
document_queue_enable, all_document_ocr_cleanup, queue_document_list,
|
||||||
ocr_tool_link, setup_queue_transformation_list,
|
ocr_tool_link, setup_queue_transformation_list,
|
||||||
|
|||||||
@@ -15,10 +15,9 @@ from documents.models import Document
|
|||||||
from converter.api import get_available_transformations_choices
|
from converter.api import get_available_transformations_choices
|
||||||
from sources.managers import SourceTransformationManager
|
from sources.managers import SourceTransformationManager
|
||||||
|
|
||||||
from .literals import (DOCUMENTQUEUE_STATE_STOPPED,
|
from .literals import (DOCUMENTQUEUE_STATE_CHOICES,
|
||||||
DOCUMENTQUEUE_STATE_CHOICES, QUEUEDOCUMENT_STATE_PENDING,
|
QUEUEDOCUMENT_STATE_PENDING, QUEUEDOCUMENT_STATE_CHOICES,
|
||||||
QUEUEDOCUMENT_STATE_CHOICES, QUEUEDOCUMENT_STATE_PROCESSING,
|
QUEUEDOCUMENT_STATE_PROCESSING, DOCUMENTQUEUE_STATE_ACTIVE)
|
||||||
DOCUMENTQUEUE_STATE_ACTIVE)
|
|
||||||
from .managers import DocumentQueueManager
|
from .managers import DocumentQueueManager
|
||||||
from .exceptions import ReQueueError
|
from .exceptions import ReQueueError
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ from __future__ import absolute_import
|
|||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.db.models.signals import post_save
|
from django.db.models.signals import post_save
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
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 navigation.api import bind_links, register_multi_item_links
|
||||||
from project_setup.api import register_setup
|
from project_setup.api import register_setup
|
||||||
|
|||||||
@@ -2,11 +2,6 @@ import logging
|
|||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.contenttypes.models import ContentType
|
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
|
from common.models import AnonymousUserSingleton
|
||||||
|
|
||||||
|
|||||||
@@ -16,17 +16,16 @@ from django.contrib.auth.models import User, Group
|
|||||||
from django.utils.simplejson import loads
|
from django.utils.simplejson import loads
|
||||||
|
|
||||||
from common.views import assign_remove
|
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.widgets import two_state_template
|
||||||
from common.models import AnonymousUserSingleton
|
from common.models import AnonymousUserSingleton
|
||||||
from acls.classes import EncapsulatedObject
|
from acls.classes import EncapsulatedObject
|
||||||
|
|
||||||
from .models import Role, Permission, PermissionHolder, RoleMember
|
from .models import Role, Permission
|
||||||
from .forms import RoleForm, RoleForm_view
|
from .forms import RoleForm, RoleForm_view
|
||||||
from .permissions import (PERMISSION_ROLE_VIEW, PERMISSION_ROLE_EDIT,
|
from .permissions import (PERMISSION_ROLE_VIEW, PERMISSION_ROLE_EDIT,
|
||||||
PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE,
|
PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE,
|
||||||
PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE)
|
PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE)
|
||||||
from .widgets import role_permission_link
|
|
||||||
|
|
||||||
|
|
||||||
def role_list(request):
|
def role_list(request):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from elementtree.ElementTree import Element, SubElement
|
from elementtree.ElementTree import SubElement
|
||||||
|
|
||||||
from . import setup_menu
|
from . import setup_menu
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from elementtree.ElementTree import Element, SubElement
|
from elementtree.ElementTree import SubElement
|
||||||
|
|
||||||
from . import tool_menu
|
from . import tool_menu
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ from __future__ import absolute_import
|
|||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.core.exceptions import PermissionDenied
|
|
||||||
|
|
||||||
from permissions.models import Permission
|
from permissions.models import Permission
|
||||||
from common.utils import encapsulate
|
from common.utils import encapsulate
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
from project_setup.api import register_setup
|
from project_setup.api import register_setup
|
||||||
|
|
||||||
from .links import check_settings
|
from .links import check_settings
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ def setting_list(request, namespace_name=None, object_list=None, title=None, ext
|
|||||||
namespace_links.append(
|
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_'])
|
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:
|
if namespace_name:
|
||||||
object_list = [setting for setting in settings[namespace_name] if setting.hidden == False]
|
object_list = [setting for setting in settings[namespace_name] if setting.hidden == False]
|
||||||
title = _(u'settings for the %s module') % namespaces[namespace_name]
|
title = _(u'settings for the %s module') % namespaces[namespace_name]
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'title': title if title else _(u'settings'),
|
'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],
|
'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:
|
if extra_context:
|
||||||
context.update(extra_context)
|
context.update(extra_context)
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ from __future__ import absolute_import
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from navigation.api import (bind_links,
|
from navigation.api import (bind_links,
|
||||||
register_model_list_columns, Link)
|
register_model_list_columns)
|
||||||
from common.utils import encapsulate
|
from common.utils import encapsulate
|
||||||
from project_setup.api import register_setup
|
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 scheduler.api import register_interval_job
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
|
|
||||||
@@ -15,18 +13,15 @@ from .staging import StagingFile
|
|||||||
from .models import (WebForm, StagingFolder, SourceTransformation,
|
from .models import (WebForm, StagingFolder, SourceTransformation,
|
||||||
WatchFolder, POP3Email, IMAPEmail)
|
WatchFolder, POP3Email, IMAPEmail)
|
||||||
from .widgets import staging_file_thumbnail
|
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 .tasks import task_fetch_pop3_emails, task_fetch_imap_emails
|
||||||
from .conf.settings import EMAIL_PROCESSING_INTERVAL
|
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_web_form_list, setup_staging_folder_list, setup_watch_folder_list,
|
||||||
setup_pop3_email_list, setup_imap_email_list, setup_source_edit,
|
setup_pop3_email_list, setup_imap_email_list, setup_source_edit,
|
||||||
setup_source_delete, setup_source_create, setup_source_log_list,
|
setup_source_delete, setup_source_create, setup_source_log_list,
|
||||||
setup_source_transformation_list, setup_source_transformation_create,
|
setup_source_transformation_list, setup_source_transformation_create,
|
||||||
setup_source_transformation_edit, setup_source_transformation_delete,
|
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])
|
bind_links([StagingFile], [staging_file_delete])
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
"""Configuration options for the sources app"""
|
"""Configuration options for the sources app"""
|
||||||
import os
|
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
from smart_settings.api import Setting, SettingNamespace
|
from smart_settings.api import Setting, SettingNamespace
|
||||||
|
|
||||||
namespace = SettingNamespace('sources', _(u'Sources'), module='sources.conf.settings')
|
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_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(
|
Setting(
|
||||||
namespace=namespace,
|
namespace=namespace,
|
||||||
|
|||||||
@@ -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:]
|
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:
|
for recent_to_delete in to_delete:
|
||||||
recent_to_delete.delete()
|
recent_to_delete.delete()
|
||||||
|
|
||||||
def get_for_source(self, source):
|
def get_for_source(self, source):
|
||||||
content_type = ContentType.objects.get_for_model(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')
|
return self.model.objects.filter(content_type=content_type, object_id=source.pk).order_by('-creation_datetime')
|
||||||
|
|
||||||
def get_latest_for(self, source):
|
def get_latest_for(self, source):
|
||||||
content_type = ContentType.objects.get_for_model(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
|
return self.model.objects.filter(content_type=content_type, object_id=source.pk).latest().creation_datetime
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from django.contrib.contenttypes import generic
|
|||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.core.files import File
|
from django.core.files import File
|
||||||
from django.core.files.base import ContentFile
|
|
||||||
|
|
||||||
from converter.api import get_available_transformations_choices
|
from converter.api import get_available_transformations_choices
|
||||||
from converter.literals import DIMENSION_SEPARATOR
|
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_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES,
|
||||||
SOURCE_UNCOMPRESS_CHOICE_Y,
|
SOURCE_UNCOMPRESS_CHOICE_Y,
|
||||||
POP3_PORT, POP3_SSL_PORT,
|
POP3_PORT, POP3_SSL_PORT,
|
||||||
SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL,
|
SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL,
|
||||||
IMAP_PORT, IMAP_SSL_PORT,
|
IMAP_PORT, IMAP_SSL_PORT,
|
||||||
SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL,
|
SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL,
|
||||||
IMAP_DEFAULT_MAILBOX)
|
IMAP_DEFAULT_MAILBOX)
|
||||||
from .compressed_file import CompressedFile, NotACompressedFile
|
from .compressed_file import CompressedFile, NotACompressedFile
|
||||||
from .conf.settings import POP3_TIMEOUT
|
from .conf.settings import POP3_TIMEOUT
|
||||||
@@ -169,14 +168,14 @@ class SourceLog(models.Model):
|
|||||||
source = generic.GenericForeignKey('content_type', 'object_id')
|
source = generic.GenericForeignKey('content_type', 'object_id')
|
||||||
creation_datetime = models.DateTimeField(verbose_name=_(u'date time'))
|
creation_datetime = models.DateTimeField(verbose_name=_(u'date time'))
|
||||||
status = models.TextField(verbose_name=_(u'status'))
|
status = models.TextField(verbose_name=_(u'status'))
|
||||||
|
|
||||||
objects = SourceLogManager()
|
objects = SourceLogManager()
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.pk:
|
if not self.pk:
|
||||||
self.creation_datetime = datetime.datetime.now()
|
self.creation_datetime = datetime.datetime.now()
|
||||||
return super(SourceLog, self).save(*args, **kwargs)
|
return super(SourceLog, self).save(*args, **kwargs)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _(u'source log')
|
verbose_name = _(u'source log')
|
||||||
verbose_name_plural = _(u'sources logs')
|
verbose_name_plural = _(u'sources logs')
|
||||||
@@ -194,8 +193,8 @@ class InteractiveBaseModel(BaseModel):
|
|||||||
|
|
||||||
class Meta(BaseModel.Meta):
|
class Meta(BaseModel.Meta):
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
class PseudoFile(File):
|
class PseudoFile(File):
|
||||||
def __init__(self, file, name):
|
def __init__(self, file, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
@@ -203,8 +202,8 @@ class PseudoFile(File):
|
|||||||
self.file.seek(0, os.SEEK_END)
|
self.file.seek(0, os.SEEK_END)
|
||||||
self.size = self.file.tell()
|
self.size = self.file.tell()
|
||||||
self.file.seek(0)
|
self.file.seek(0)
|
||||||
|
|
||||||
|
|
||||||
class Attachment(File):
|
class Attachment(File):
|
||||||
def __init__(self, part, name):
|
def __init__(self, part, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
@@ -251,7 +250,7 @@ class EmailBaseModel(IntervalBaseModel):
|
|||||||
counter += 1
|
counter += 1
|
||||||
|
|
||||||
logger.debug('filename: %s' % filename)
|
logger.debug('filename: %s' % filename)
|
||||||
|
|
||||||
document_file = Attachment(part, name=filename)
|
document_file = Attachment(part, name=filename)
|
||||||
source.upload_file(document_file, expand=(source.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y), document_type=source.document_type)
|
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:
|
else:
|
||||||
difference = datetime.datetime.now() - last_check
|
difference = datetime.datetime.now() - last_check
|
||||||
initial_trigger = False
|
initial_trigger = False
|
||||||
|
|
||||||
if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
|
if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
|
||||||
try:
|
try:
|
||||||
logger.debug('Starting POP3 email fetch')
|
logger.debug('Starting POP3 email fetch')
|
||||||
@@ -293,28 +292,28 @@ class POP3Email(EmailBaseModel):
|
|||||||
mailbox.user(self.username)
|
mailbox.user(self.username)
|
||||||
mailbox.pass_(self.password)
|
mailbox.pass_(self.password)
|
||||||
messages_info = mailbox.list()
|
messages_info = mailbox.list()
|
||||||
|
|
||||||
logger.debug('messages_info:')
|
logger.debug('messages_info:')
|
||||||
logger.debug(messages_info)
|
logger.debug(messages_info)
|
||||||
logger.debug('messages count: %s' % len(messages_info[1]))
|
logger.debug('messages count: %s' % len(messages_info[1]))
|
||||||
|
|
||||||
for message_info in messages_info[1]:
|
for message_info in messages_info[1]:
|
||||||
message_number, message_size = message_info.split()
|
message_number, message_size = message_info.split()
|
||||||
logger.debug('message_number: %s' % message_number)
|
logger.debug('message_number: %s' % message_number)
|
||||||
logger.debug('message_size: %s' % message_size)
|
logger.debug('message_size: %s' % message_size)
|
||||||
|
|
||||||
complete_message = '\n'.join(mailbox.retr(message_number)[1])
|
complete_message = '\n'.join(mailbox.retr(message_number)[1])
|
||||||
|
|
||||||
EmailBaseModel.process_message(source=self, message=complete_message)
|
EmailBaseModel.process_message(source=self, message=complete_message)
|
||||||
mailbox.dele(message_number)
|
mailbox.dele(message_number)
|
||||||
|
|
||||||
mailbox.quit()
|
mailbox.quit()
|
||||||
SourceLog.objects.save_status(source=self, status='Successful connection.')
|
SourceLog.objects.save_status(source=self, status='Successful connection.')
|
||||||
|
|
||||||
except Exception, exc:
|
except Exception, exc:
|
||||||
logger.error('Unhandled exception: %s' % exc)
|
logger.error('Unhandled exception: %s' % exc)
|
||||||
SourceLog.objects.save_status(source=self, status='Error: %s' % exc)
|
SourceLog.objects.save_status(source=self, status='Error: %s' % exc)
|
||||||
|
|
||||||
class Meta(EmailBaseModel.Meta):
|
class Meta(EmailBaseModel.Meta):
|
||||||
verbose_name = _(u'POP email')
|
verbose_name = _(u'POP email')
|
||||||
verbose_name_plural = _(u'POP email')
|
verbose_name_plural = _(u'POP email')
|
||||||
@@ -322,7 +321,7 @@ class POP3Email(EmailBaseModel):
|
|||||||
|
|
||||||
class IMAPEmail(EmailBaseModel):
|
class IMAPEmail(EmailBaseModel):
|
||||||
source_type = SOURCE_CHOICE_IMAP_EMAIL
|
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)
|
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/
|
# http://www.doughellmann.com/PyMOTW/imaplib/
|
||||||
@@ -336,7 +335,7 @@ class IMAPEmail(EmailBaseModel):
|
|||||||
else:
|
else:
|
||||||
difference = datetime.datetime.now() - last_check
|
difference = datetime.datetime.now() - last_check
|
||||||
initial_trigger = False
|
initial_trigger = False
|
||||||
|
|
||||||
if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
|
if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
|
||||||
try:
|
try:
|
||||||
logger.debug('Starting IMAP email fetch')
|
logger.debug('Starting IMAP email fetch')
|
||||||
@@ -353,7 +352,7 @@ class IMAPEmail(EmailBaseModel):
|
|||||||
|
|
||||||
mailbox.login(self.username, self.password)
|
mailbox.login(self.username, self.password)
|
||||||
mailbox.select(self.mailbox or IMAP_DEFAULT_MAILBOX)
|
mailbox.select(self.mailbox or IMAP_DEFAULT_MAILBOX)
|
||||||
|
|
||||||
status, data = mailbox.search(None, 'NOT', 'DELETED')
|
status, data = mailbox.search(None, 'NOT', 'DELETED')
|
||||||
if data:
|
if data:
|
||||||
messages_info = data[0].split()
|
messages_info = data[0].split()
|
||||||
@@ -369,7 +368,7 @@ class IMAPEmail(EmailBaseModel):
|
|||||||
mailbox.close()
|
mailbox.close()
|
||||||
mailbox.logout()
|
mailbox.logout()
|
||||||
SourceLog.objects.save_status(source=self, status='Successful connection.')
|
SourceLog.objects.save_status(source=self, status='Successful connection.')
|
||||||
|
|
||||||
except Exception, exc:
|
except Exception, exc:
|
||||||
logger.error('Unhandled exception: %s' % exc)
|
logger.error('Unhandled exception: %s' % exc)
|
||||||
SourceLog.objects.save_status(source=self, status='Error: %s' % exc)
|
SourceLog.objects.save_status(source=self, status='Error: %s' % exc)
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from datetime import timedelta, datetime
|
|
||||||
import platform
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from django.db.models import Q
|
|
||||||
|
|
||||||
from job_processor.api import process_job
|
|
||||||
from lock_manager import Lock, LockError
|
from lock_manager import Lock, LockError
|
||||||
|
|
||||||
from .models import POP3Email, IMAPEmail
|
from .models import POP3Email, IMAPEmail
|
||||||
@@ -20,7 +15,7 @@ def task_fetch_single_pop3_email(pop3_email):
|
|||||||
try:
|
try:
|
||||||
lock_id = u'task_fetch_pop3_email-%d' % pop3_email.pk
|
lock_id = u'task_fetch_pop3_email-%d' % pop3_email.pk
|
||||||
logger.debug('trying to acquire lock: %s' % lock_id)
|
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)
|
logger.debug('acquired lock: %s' % lock_id)
|
||||||
try:
|
try:
|
||||||
pop3_email.fetch_mail()
|
pop3_email.fetch_mail()
|
||||||
@@ -31,7 +26,7 @@ def task_fetch_single_pop3_email(pop3_email):
|
|||||||
except LockError:
|
except LockError:
|
||||||
logger.error('unable to obtain lock')
|
logger.error('unable to obtain lock')
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def task_fetch_pop3_emails():
|
def task_fetch_pop3_emails():
|
||||||
logger.debug('executing')
|
logger.debug('executing')
|
||||||
@@ -57,7 +52,7 @@ def task_fetch_single_imap_email(imap_email):
|
|||||||
except LockError:
|
except LockError:
|
||||||
logger.error('unable to obtain lock')
|
logger.error('unable to obtain lock')
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def task_fetch_imap_emails():
|
def task_fetch_imap_emails():
|
||||||
logger.debug('executing')
|
logger.debug('executing')
|
||||||
|
|||||||
@@ -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/(?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+)/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/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'),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ def get_active_tab_links(document=None):
|
|||||||
staging_folders = StagingFolder.objects.filter(enabled=True)
|
staging_folders = StagingFolder.objects.filter(enabled=True)
|
||||||
for staging_folder in staging_folders:
|
for staging_folder in staging_folders:
|
||||||
tab_links.append(get_tab_link_for_source(staging_folder, document))
|
tab_links.append(get_tab_link_for_source(staging_folder, document))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'tab_links': tab_links,
|
'tab_links': tab_links,
|
||||||
SOURCE_CHOICE_WEB_FORM: web_forms,
|
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:
|
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
||||||
cls = IMAPEmail
|
cls = IMAPEmail
|
||||||
form_class = IMAPEmailSetupForm
|
form_class = IMAPEmailSetupForm
|
||||||
|
|
||||||
source = get_object_or_404(cls, pk=source_id)
|
source = get_object_or_404(cls, pk=source_id)
|
||||||
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
|
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
|
cls = POP3Email
|
||||||
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
||||||
cls = IMAPEmail
|
cls = IMAPEmail
|
||||||
|
|
||||||
source = get_object_or_404(cls, pk=source_pk)
|
source = get_object_or_404(cls, pk=source_pk)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
@@ -659,7 +659,7 @@ def setup_source_transformation_list(request, source_type, source_id):
|
|||||||
cls = POP3Email
|
cls = POP3Email
|
||||||
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
||||||
cls = IMAPEmail
|
cls = IMAPEmail
|
||||||
|
|
||||||
source = get_object_or_404(cls, pk=source_id)
|
source = get_object_or_404(cls, pk=source_id)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
@@ -765,7 +765,7 @@ def setup_source_transformation_create(request, source_type, source_id):
|
|||||||
cls = POP3Email
|
cls = POP3Email
|
||||||
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
elif source_type == SOURCE_CHOICE_IMAP_EMAIL:
|
||||||
cls = IMAPEmail
|
cls = IMAPEmail
|
||||||
|
|
||||||
source = get_object_or_404(cls, pk=source_id)
|
source = get_object_or_404(cls, pk=source_id)
|
||||||
|
|
||||||
redirect_view = reverse('setup_source_transformation_list', args=[source.source_type, source.pk])
|
redirect_view = reverse('setup_source_transformation_list', args=[source.source_type, source.pk])
|
||||||
|
|||||||
@@ -7,16 +7,15 @@ from navigation.api import (bind_links, register_top_menu,
|
|||||||
from common.utils import encapsulate
|
from common.utils import encapsulate
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from acls.api import class_permissions
|
from acls.api import class_permissions
|
||||||
from acls.permissions import ACLS_VIEW_ACL
|
|
||||||
|
|
||||||
from taggit.models import Tag
|
from taggit.models import Tag
|
||||||
from taggit.managers import TaggableManager
|
from taggit.managers import TaggableManager
|
||||||
|
|
||||||
from .widgets import (get_tags_inline_widget_simple, single_tag_widget)
|
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_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT,
|
||||||
PERMISSION_TAG_VIEW)
|
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_document_remove_multiple, tag_document_list, tag_delete, tag_edit,
|
||||||
tag_tagged_item_list, tag_multiple_delete, tag_acl_list)
|
tag_tagged_item_list, tag_multiple_delete, tag_acl_list)
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ from navigation.api import Link
|
|||||||
from acls.permissions import ACLS_VIEW_ACL
|
from acls.permissions import ACLS_VIEW_ACL
|
||||||
|
|
||||||
from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH,
|
from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH,
|
||||||
PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT,
|
PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT)
|
||||||
PERMISSION_TAG_VIEW)
|
|
||||||
|
|
||||||
tag_list = Link(text=_(u'tag list'), view='tag_list', sprite='tag_blue')
|
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])
|
tag_create = Link(text=_(u'create new tag'), view='tag_create', sprite='tag_blue_add', permissions=[PERMISSION_TAG_CREATE])
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
from django.contrib.auth.models import User, Group
|
from django.contrib.auth.models import User, Group
|
||||||
|
|
||||||
from navigation.api import bind_links, register_multi_item_links
|
from navigation.api import bind_links, register_multi_item_links
|
||||||
|
|||||||
@@ -165,7 +165,6 @@ INSTALLED_APPS = (
|
|||||||
'mimetype',
|
'mimetype',
|
||||||
'scheduler',
|
'scheduler',
|
||||||
'job_processor',
|
'job_processor',
|
||||||
'installation',
|
|
||||||
# Mayan EDMS
|
# Mayan EDMS
|
||||||
'storage',
|
'storage',
|
||||||
'documents',
|
'documents',
|
||||||
@@ -180,12 +179,13 @@ INSTALLED_APPS = (
|
|||||||
'document_acls',
|
'document_acls',
|
||||||
'ocr',
|
'ocr',
|
||||||
'history',
|
'history',
|
||||||
'main',
|
|
||||||
'rest_api',
|
'rest_api',
|
||||||
'document_signatures',
|
'document_signatures',
|
||||||
#'workflows',
|
#'workflows',
|
||||||
'checkouts',
|
'checkouts',
|
||||||
'bootstrap',
|
#'bootstrap',
|
||||||
|
'main',
|
||||||
|
'installation',
|
||||||
|
|
||||||
# Has to be last so the other apps can register it's signals
|
# Has to be last so the other apps can register it's signals
|
||||||
'signaler',
|
'signaler',
|
||||||
|
|||||||
2
urls.py
2
urls.py
@@ -36,7 +36,7 @@ urlpatterns = patterns('',
|
|||||||
(r'^checkouts/', include('checkouts.urls')),
|
(r'^checkouts/', include('checkouts.urls')),
|
||||||
(r'^installation/', include('installation.urls')),
|
(r'^installation/', include('installation.urls')),
|
||||||
(r'^scheduler/', include('scheduler.urls')),
|
(r'^scheduler/', include('scheduler.urls')),
|
||||||
(r'^bootstrap/', include('bootstrap.urls')),
|
#(r'^bootstrap/', include('bootstrap.urls')),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user