diff --git a/.travis.yml b/.travis.yml index c159a882ad..f3ac614efb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ python: - 2.7 env: global: - - TEST_APPS="acls authentication django_gpg document_indexing document_signatures documents dynamic_search folders lock_manager metadata ocr permissions sources tags" + - TEST_APPS="acls authentication checkouts django_gpg document_indexing document_signatures documents dynamic_search folders lock_manager metadata ocr permissions sources tags" matrix: - DB=mysql - DB=postgres diff --git a/mayan/apps/checkouts/tests/test_models.py b/mayan/apps/checkouts/tests/test_models.py index ca3bfce642..77fa1132eb 100644 --- a/mayan/apps/checkouts/tests/test_models.py +++ b/mayan/apps/checkouts/tests/test_models.py @@ -11,10 +11,9 @@ from django.utils.timezone import now from authentication.tests.literals import ( TEST_ADMIN_USERNAME, TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD ) -from documents.models import Document, DocumentType +from documents.models import DocumentType from documents.tests.literals import ( - TEST_DOCUMENT_TYPE, TEST_DOCUMENT_PATH, TEST_MULTI_PAGE_TIFF_PATH, - TEST_OFFICE_DOCUMENT_PATH, TEST_SMALL_DOCUMENT_PATH + TEST_DOCUMENT_TYPE, TEST_DOCUMENT_PATH, TEST_SMALL_DOCUMENT_PATH ) from ..exceptions import ( @@ -54,7 +53,9 @@ class DocumentCheckoutTestCase(TestCase): self.assertTrue(self.document.is_checked_out()) self.assertTrue( - DocumentCheckout.objects.is_document_checked_out(document=self.document) + DocumentCheckout.objects.is_document_checked_out( + document=self.document + ) ) def test_version_creation_blocking(self): @@ -81,7 +82,9 @@ class DocumentCheckoutTestCase(TestCase): self.assertFalse(self.document.is_checked_out()) self.assertFalse( - DocumentCheckout.objects.is_document_checked_out(document=self.document) + DocumentCheckout.objects.is_document_checked_out( + document=self.document + ) ) def test_double_checkout(self): @@ -94,8 +97,9 @@ class DocumentCheckoutTestCase(TestCase): with self.assertRaises(DocumentAlreadyCheckedOut): DocumentCheckout.objects.checkout_document( - document=self.document, expiration_datetime=expiration_datetime, - user=self.admin_user, block_new_version=True + document=self.document, + expiration_datetime=expiration_datetime, user=self.admin_user, + block_new_version=True ) def test_checkin_without_checkout(self): diff --git a/mayan/apps/checkouts/views.py b/mayan/apps/checkouts/views.py index 6f46046568..97267d2f4d 100644 --- a/mayan/apps/checkouts/views.py +++ b/mayan/apps/checkouts/views.py @@ -142,7 +142,9 @@ def checkout_info(request, document_pk): ) % render_date_object(checkout_info.expiration_datetime) ) paragraphs.append( - _('New versions allowed: %s') % (_('Yes') if not checkout_info.block_new_version else _('No')) + _( + 'New versions allowed: %s' + ) % (_('Yes') if not checkout_info.block_new_version else _('No')) ) return render_to_response( @@ -198,7 +200,8 @@ class DocumentCheckinView(ConfirmView): ) except PermissionDenied: AccessControlList.objects.check_access( - permission_document_checkin_override, request.user, document + permission_document_checkin_override, request.user, + document ) try: diff --git a/mayan/apps/common/tasks.py b/mayan/apps/common/tasks.py index 0a42ec988c..c45b2ddf36 100644 --- a/mayan/apps/common/tasks.py +++ b/mayan/apps/common/tasks.py @@ -6,7 +6,6 @@ import logging from django.utils.timezone import now from mayan.celery import app -from common.models import SharedUploadedFile from .literals import UPLOAD_EXPIRATION_INTERVAL from .models import SharedUploadedFile diff --git a/mayan/apps/common/views.py b/mayan/apps/common/views.py index 3e6cf3cb88..3e969e5f81 100644 --- a/mayan/apps/common/views.py +++ b/mayan/apps/common/views.py @@ -194,7 +194,9 @@ def multi_object_action_view(request): ) action = request.GET.get('action', None) - id_list = ','.join([key[3:] for key in request.GET.keys() if key.startswith('pk_')]) + id_list = ','.join( + [key[3:] for key in request.GET.keys() if key.startswith('pk_')] + ) items_property_list = [ (key[11:]) for key in request.GET.keys() if key.startswith('properties_') ] diff --git a/mayan/apps/django_gpg/links.py b/mayan/apps/django_gpg/links.py index 823a5eca2d..2f71491674 100644 --- a/mayan/apps/django_gpg/links.py +++ b/mayan/apps/django_gpg/links.py @@ -14,8 +14,8 @@ link_private_keys = Link( text=_('Private keys'), view='django_gpg:key_private_list' ) link_public_keys = Link( - icon='fa fa-key', permissions=(permission_key_view,), text=_('Public keys'), - view='django_gpg:key_public_list' + icon='fa fa-key', permissions=(permission_key_view,), + text=_('Public keys'), view='django_gpg:key_public_list' ) link_key_delete = Link( permissions=(permission_key_delete,), tags='dangerous', text=_('Delete'), diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index 6c99ca2d55..18f0cd0463 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -87,7 +87,9 @@ class SetupIndexTreeTemplateListView(SingleObjectListView): return get_object_or_404(Index, pk=self.kwargs['pk']) def get_queryset(self): - return self.get_index().template_root.get_descendants(include_self=True) + return self.get_index().template_root.get_descendants( + include_self=True + ) def get_extra_context(self): return { @@ -128,7 +130,9 @@ class SetupIndexDocumentTypesView(AssignRemoveView): def get_extra_context(self): return { 'object': self.get_object(), - 'title': _('Document types linked to index: %s') % self.get_object() + 'title': _( + 'Document types linked to index: %s' + ) % self.get_object() } @@ -251,7 +255,9 @@ class IndexInstanceNodeView(DocumentListView, SingleObjectListView): if self.index_instance: if self.index_instance.index_template_node.link_documents: - return DocumentListView.dispatch(self, request, *args, **kwargs) + return DocumentListView.dispatch( + self, request, *args, **kwargs + ) return SingleObjectListView.dispatch(self, request, *args, **kwargs) @@ -276,7 +282,9 @@ class IndexInstanceNodeView(DocumentListView, SingleObjectListView): 'hide_links': True, 'object': self.index_instance, 'title': mark_safe( - _('Contents for index: %s') % get_breadcrumbs(self.index_instance) + _( + 'Contents for index: %s' + ) % get_breadcrumbs(self.index_instance) ) } diff --git a/mayan/apps/document_signatures/views.py b/mayan/apps/document_signatures/views.py index 3a7a764e35..00c691b9b1 100644 --- a/mayan/apps/document_signatures/views.py +++ b/mayan/apps/document_signatures/views.py @@ -37,17 +37,23 @@ def document_verify(request, document_pk): request.user, (permission_document_verify,) ) except PermissionDenied: - AccessControlList.objects.check_access(permission_document_verify, request.user, document) + AccessControlList.objects.check_access( + permission_document_verify, request.user, document + ) document.add_as_recent_document_for_user(request.user) try: - signature = DocumentVersionSignature.objects.verify_signature(document.latest_version) + signature = DocumentVersionSignature.objects.verify_signature( + document.latest_version + ) except AttributeError: signature_state = SIGNATURE_STATES.get(SIGNATURE_STATE_NONE) signature = None else: - signature_state = SIGNATURE_STATES.get(getattr(signature, 'status', None)) + signature_state = SIGNATURE_STATES.get( + getattr(signature, 'status', None) + ) paragraphs = [_('Signature status: %s') % signature_state['text']] @@ -65,7 +71,9 @@ def document_verify(request, document_pk): _('Signature ID: %s') % signature.signature_id, _('Signature type: %s') % signature_type, _('Key ID: %s') % signature.key_id, - _('Timestamp: %s') % datetime.fromtimestamp(int(signature.sig_timestamp)), + _('Timestamp: %s') % datetime.fromtimestamp( + int(signature.sig_timestamp) + ), _('Signee: %s') % force_escape(getattr(signature, 'username', '')), ] ) @@ -82,9 +90,13 @@ def document_signature_upload(request, document_pk): document = get_object_or_404(Document, pk=document_pk) try: - Permission.check_permissions(request.user, (permission_signature_upload,)) + Permission.check_permissions( + request.user, (permission_signature_upload,) + ) except PermissionDenied: - AccessControlList.objects.check_access(permission_signature_upload, request.user, document) + AccessControlList.objects.check_access( + permission_signature_upload, request.user, document + ) document.add_as_recent_document_for_user(request.user) @@ -96,8 +108,12 @@ def document_signature_upload(request, document_pk): form = DetachedSignatureForm(request.POST, request.FILES) if form.is_valid(): try: - DocumentVersionSignature.objects.add_detached_signature(document.latest_version, request.FILES['file']) - messages.success(request, _('Detached signature uploaded successfully.')) + DocumentVersionSignature.objects.add_detached_signature( + document.latest_version, request.FILES['file'] + ) + messages.success( + request, _('Detached signature uploaded successfully.') + ) return HttpResponseRedirect(next) except Exception as exception: messages.error(request, exception) @@ -118,13 +134,19 @@ def document_signature_download(request, document_pk): document = get_object_or_404(Document, pk=document_pk) try: - Permission.check_permissions(request.user, (permission_signature_download,)) + Permission.check_permissions( + request.user, (permission_signature_download,) + ) except PermissionDenied: - AccessControlList.objects.check_access(permission_signature_download, request.user, document) + AccessControlList.objects.check_access( + permission_signature_download, request.user, document + ) try: if DocumentVersionSignature.objects.has_detached_signature(document.latest_version): - signature = DocumentVersionSignature.objects.detached_signature(document.latest_version) + signature = DocumentVersionSignature.objects.detached_signature( + document.latest_version + ) return serve_file( request, signature, @@ -142,9 +164,13 @@ def document_signature_delete(request, document_pk): document = get_object_or_404(Document, pk=document_pk) try: - Permission.check_permissions(request.user, (permission_signature_delete,)) + Permission.check_permissions( + request.user, (permission_signature_delete,) + ) except PermissionDenied: - AccessControlList.objects.check_access(permission_signature_delete, request.user, document) + AccessControlList.objects.check_access( + permission_signature_delete, request.user, document + ) document.add_as_recent_document_for_user(request.user) @@ -154,17 +180,27 @@ def document_signature_delete(request, document_pk): if request.method == 'POST': try: - DocumentVersionSignature.objects.clear_detached_signature(document.latest_version) - messages.success(request, _('Detached signature deleted successfully.')) + DocumentVersionSignature.objects.clear_detached_signature( + document.latest_version + ) + messages.success( + request, _('Detached signature deleted successfully.') + ) return HttpResponseRedirect(next) except Exception as exception: - messages.error(request, _('Error while deleting the detached signature; %s') % exception) + messages.error( + request, _( + 'Error while deleting the detached signature; %s' + ) % exception + ) return HttpResponseRedirect(previous) return render_to_response('appearance/generic_confirm.html', { - 'title': _('Delete the detached signature from document: %s?') % document, - 'next': next, - 'previous': previous, - 'object': document, 'delete_view': True, + 'next': next, + 'object': document, + 'previous': previous, + 'title': _( + 'Delete the detached signature from document: %s?' + ) % document, }, context_instance=RequestContext(request)) diff --git a/mayan/apps/documents/literals.py b/mayan/apps/documents/literals.py index 8438310075..6ca53aaab6 100644 --- a/mayan/apps/documents/literals.py +++ b/mayan/apps/documents/literals.py @@ -20,4 +20,3 @@ PAGE_RANGE_RANGE = 'range' PAGE_RANGE_CHOICES = ( (PAGE_RANGE_ALL, _('All pages')), (PAGE_RANGE_RANGE, _('Page range')) ) - diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index c9a99c64ae..fcc3e32888 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -152,7 +152,7 @@ class Document(models.Model): in_trash = models.BooleanField( default=False, editable=False, verbose_name=_('In trash?') ) - #TODO: set editable to False + # TODO: set editable to False deleted_date_time = models.DateTimeField( blank=True, editable=True, null=True, verbose_name=_('Date and time trashed') diff --git a/mayan/apps/documents/statistics.py b/mayan/apps/documents/statistics.py index b838784e7a..faa5563a46 100644 --- a/mayan/apps/documents/statistics.py +++ b/mayan/apps/documents/statistics.py @@ -4,12 +4,7 @@ import datetime import qsstats -from django.db.models import Avg, Count, Max, Min -from django.utils.translation import ugettext_lazy as _ - -from statistics.classes import Statistic - -from .models import Document, DocumentType, DocumentPage, DocumentVersion +from .models import Document, DocumentPage, DocumentVersion def new_documents_per_month(): @@ -50,6 +45,7 @@ def new_document_pages_per_month(): } } + def total_document_per_month(): qss = qsstats.QuerySetStats(Document.objects.all(), 'date_added') this_year = datetime.date.today().year diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index af9d4af2ca..0d78448cd5 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -17,7 +17,7 @@ from .views import ( DeletedDocumentListView, DocumentEditView, DocumentListView, DocumentPageView, DocumentPageListView, DocumentPreviewView, DocumentRestoreView, DocumentRestoreManyView, DocumentTrashView, - DocumentTrashManyView, DocumentTypeCreateView, DocumentTypeDeleteView, + DocumentTrashManyView, DocumentTypeCreateView, DocumentTypeDeleteView, DocumentTypeDocumentListView, DocumentTypeFilenameDeleteView, DocumentTypeFilenameEditView, DocumentTypeFilenameListView, DocumentTypeListView, DocumentTypeEditView, DocumentVersionListView, diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 20a7fd1a68..abe3898892 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -31,9 +31,7 @@ from converter.permissions import permission_transformation_delete from filetransfers.api import serve_file from permissions import Permission -from .events import ( - event_document_properties_edit, event_document_type_change -) +from .events import event_document_type_change from .forms import ( DocumentDownloadForm, DocumentForm, DocumentPageForm, DocumentPreviewForm, DocumentPropertiesForm, DocumentTypeSelectForm, diff --git a/mayan/apps/metadata/tests/test_models.py b/mayan/apps/metadata/tests/test_models.py index 932666c419..a7197bc0fe 100644 --- a/mayan/apps/metadata/tests/test_models.py +++ b/mayan/apps/metadata/tests/test_models.py @@ -7,7 +7,7 @@ from django.test import TestCase, override_settings from documents.models import DocumentType from documents.tests import TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_TYPE -from ..models import MetadataType, DocumentMetadata, DocumentTypeMetadataType +from ..models import MetadataType, DocumentMetadata TEST_DEFAULT_VALUE = 'test' TEST_LOOKUP_TEMPLATE = '1,2,3' diff --git a/mayan/apps/ocr/admin.py b/mayan/apps/ocr/admin.py index a2e91ca2ac..36781268d0 100644 --- a/mayan/apps/ocr/admin.py +++ b/mayan/apps/ocr/admin.py @@ -14,5 +14,3 @@ class DocumentTypeSettingsAdmin(admin.ModelAdmin): class DocumentVersionOCRErrorAdmin(admin.ModelAdmin): list_display = ('document_version', 'datetime_submitted') readonly_fields = ('document_version', 'datetime_submitted', 'result') - - diff --git a/mayan/apps/ocr/migrations/0001_initial.py b/mayan/apps/ocr/migrations/0001_initial.py index f9310b60db..28d5add883 100644 --- a/mayan/apps/ocr/migrations/0001_initial.py +++ b/mayan/apps/ocr/migrations/0001_initial.py @@ -14,10 +14,29 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DocumentVersionOCRError', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('datetime_submitted', models.DateTimeField(auto_now=True, verbose_name='Date time submitted', db_index=True)), - ('result', models.TextField(null=True, verbose_name='Result', blank=True)), - ('document_version', models.ForeignKey(verbose_name='Document version', to='documents.DocumentVersion')), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), + ( + 'datetime_submitted', models.DateTimeField( + auto_now=True, verbose_name='Date time submitted', + db_index=True + ) + ), + ( + 'result', models.TextField( + null=True, verbose_name='Result', blank=True + ) + ), + ( + 'document_version', models.ForeignKey( + verbose_name='Document version', + to='documents.DocumentVersion' + ) + ), ], options={ 'ordering': ('datetime_submitted',), diff --git a/mayan/apps/ocr/migrations/0002_documentpagecontent.py b/mayan/apps/ocr/migrations/0002_documentpagecontent.py index 85641cc29a..b677990c4c 100644 --- a/mayan/apps/ocr/migrations/0002_documentpagecontent.py +++ b/mayan/apps/ocr/migrations/0002_documentpagecontent.py @@ -15,9 +15,23 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DocumentPageContent', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('content', models.TextField(verbose_name='Content', blank=True)), - ('document_page', models.OneToOneField(related_name='ocr_content', verbose_name='Document page', to='documents.DocumentPage')), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), + ( + 'content', models.TextField( + verbose_name='Content', blank=True + ) + ), + ( + 'document_page', models.OneToOneField( + related_name='ocr_content', + verbose_name='Document page', to='documents.DocumentPage' + ) + ), ], options={ 'verbose_name': 'Document page content', diff --git a/mayan/apps/ocr/migrations/0004_documenttypesettings.py b/mayan/apps/ocr/migrations/0004_documenttypesettings.py index eb321aa69d..abf11f8996 100644 --- a/mayan/apps/ocr/migrations/0004_documenttypesettings.py +++ b/mayan/apps/ocr/migrations/0004_documenttypesettings.py @@ -26,9 +26,26 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DocumentTypeSettings', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('auto_ocr', models.BooleanField(default=True, verbose_name='Automatically queue newly created documents for OCR.')), - ('document_type', models.OneToOneField(related_name='ocr_settings', verbose_name='Document type', to='documents.DocumentType')), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), + ( + 'auto_ocr', models.BooleanField( + default=True, + verbose_name='Automatically queue newly created ' + 'documents for OCR.' + ) + ), + ( + 'document_type', models.OneToOneField( + related_name='ocr_settings', + verbose_name='Document type', + to='documents.DocumentType' + ) + ), ], options={ 'verbose_name': 'Document type settings', diff --git a/mayan/apps/ocr/tests/test_parsers.py b/mayan/apps/ocr/tests/test_parsers.py index 5cb36aecb4..226c51daa0 100644 --- a/mayan/apps/ocr/tests/test_parsers.py +++ b/mayan/apps/ocr/tests/test_parsers.py @@ -10,7 +10,6 @@ from documents.tests import ( from ..classes import TextExtractor from ..parsers import PDFMinerParser, PopplerParser -from ..settings import setting_auto_ocr @override_settings(OCR_AUTO_OCR=False) diff --git a/mayan/apps/ocr/views.py b/mayan/apps/ocr/views.py index 54f45f1e09..aa21ca5638 100644 --- a/mayan/apps/ocr/views.py +++ b/mayan/apps/ocr/views.py @@ -235,7 +235,11 @@ def entry_re_queue(request, pk=None, pk_list=None): } ) except DocumentVersion.DoesNotExist: - messages.error(request, _('Document version id#: %d, no longer exists.') % entry.document_version_id) + messages.error( + request, _( + 'Document version id#: %d, no longer exists.' + ) % entry.document_version_id + ) return HttpResponseRedirect(next) context = { diff --git a/mayan/apps/permissions/migrations/0001_initial.py b/mayan/apps/permissions/migrations/0001_initial.py index b132a011d9..f9ebb57358 100644 --- a/mayan/apps/permissions/migrations/0001_initial.py +++ b/mayan/apps/permissions/migrations/0001_initial.py @@ -14,9 +14,19 @@ class Migration(migrations.Migration): migrations.CreateModel( name='PermissionHolder', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), ('holder_id', models.PositiveIntegerField()), - ('holder_type', models.ForeignKey(related_name='permission_holder', to='contenttypes.ContentType')), + ( + 'holder_type', models.ForeignKey( + related_name='permission_holder', + to='contenttypes.ContentType' + ) + ), ], options={ 'verbose_name': 'Permission holder', @@ -27,9 +37,18 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Role', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), ('name', models.CharField(unique=True, max_length=64)), - ('label', models.CharField(unique=True, max_length=64, verbose_name='Label')), + ( + 'label', models.CharField( + unique=True, max_length=64, verbose_name='Label' + ) + ), ], options={ 'ordering': ('label',), @@ -41,10 +60,24 @@ class Migration(migrations.Migration): migrations.CreateModel( name='RoleMember', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), ('member_id', models.PositiveIntegerField()), - ('member_type', models.ForeignKey(related_name='role_member', to='contenttypes.ContentType')), - ('role', models.ForeignKey(verbose_name='Role', to='permissions.Role')), + ( + 'member_type', models.ForeignKey( + related_name='role_member', + to='contenttypes.ContentType' + ) + ), + ( + 'role', models.ForeignKey( + verbose_name='Role', to='permissions.Role' + ) + ), ], options={ 'verbose_name': 'Role member', @@ -55,8 +88,17 @@ class Migration(migrations.Migration): migrations.CreateModel( name='StoredPermission', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('namespace', models.CharField(max_length=64, verbose_name='Namespace')), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), + ( + 'namespace', models.CharField( + max_length=64, verbose_name='Namespace' + ) + ), ('name', models.CharField(max_length=64, verbose_name='Name')), ], options={ @@ -73,7 +115,9 @@ class Migration(migrations.Migration): migrations.AddField( model_name='permissionholder', name='permission', - field=models.ForeignKey(verbose_name='Permission', to='permissions.StoredPermission'), + field=models.ForeignKey( + verbose_name='Permission', to='permissions.StoredPermission' + ), preserve_default=True, ), ] diff --git a/mayan/apps/permissions/migrations/0002_auto_20150628_0533.py b/mayan/apps/permissions/migrations/0002_auto_20150628_0533.py index 66066026fa..8a295a6530 100644 --- a/mayan/apps/permissions/migrations/0002_auto_20150628_0533.py +++ b/mayan/apps/permissions/migrations/0002_auto_20150628_0533.py @@ -37,13 +37,18 @@ class Migration(migrations.Migration): migrations.AddField( model_name='role', name='groups', - field=models.ManyToManyField(related_name='roles', verbose_name='Groups', to='auth.Group'), + field=models.ManyToManyField( + related_name='roles', verbose_name='Groups', to='auth.Group' + ), preserve_default=True, ), migrations.AddField( model_name='role', name='permissions', - field=models.ManyToManyField(related_name='roles', verbose_name='Permissions', to='permissions.StoredPermission'), + field=models.ManyToManyField( + related_name='roles', verbose_name='Permissions', + to='permissions.StoredPermission' + ), preserve_default=True, ), ] diff --git a/mayan/apps/smart_settings/apps.py b/mayan/apps/smart_settings/apps.py index 094c8dd4fe..78bd8b9da4 100644 --- a/mayan/apps/smart_settings/apps.py +++ b/mayan/apps/smart_settings/apps.py @@ -1,7 +1,5 @@ from __future__ import unicode_literals -from importlib import import_module - from django.utils.translation import ugettext_lazy as _ from common import MayanAppConfig, menu_setup, menu_object diff --git a/mayan/apps/statistics/apps.py b/mayan/apps/statistics/apps.py index 92c4ea886d..15c88a639a 100644 --- a/mayan/apps/statistics/apps.py +++ b/mayan/apps/statistics/apps.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals -from celery.schedules import crontab from kombu import Exchange, Queue from django.utils.translation import ugettext_lazy as _ diff --git a/mayan/apps/statistics/views.py b/mayan/apps/statistics/views.py index 845dba5a32..e2f0face7a 100644 --- a/mayan/apps/statistics/views.py +++ b/mayan/apps/statistics/views.py @@ -1,10 +1,7 @@ from __future__ import unicode_literals -import json - from django.core.urlresolvers import reverse from django.http import Http404 -from django.shortcuts import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from common.generics import ( diff --git a/mayan/apps/tags/migrations/0001_initial.py b/mayan/apps/tags/migrations/0001_initial.py index b4668dfd07..b6d9e8e2f1 100644 --- a/mayan/apps/tags/migrations/0001_initial.py +++ b/mayan/apps/tags/migrations/0001_initial.py @@ -14,10 +14,35 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Tag', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('label', models.CharField(unique=True, max_length=128, verbose_name='Label', db_index=True)), - ('color', models.CharField(max_length=3, verbose_name='Color', choices=[('blu', 'Blue'), ('cya', 'Cyan'), ('crl', 'Coral'), ('gry', 'Green-Yellow'), ('kki', 'Khaki'), ('lig', 'LightGrey'), ('mag', 'Magenta'), ('red', 'Red'), ('org', 'Orange'), ('yel', 'Yellow')])), - ('documents', models.ManyToManyField(related_name='tags', verbose_name='Documents', to='documents.Document')), + ( + 'id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, + primary_key=True + ) + ), + ( + 'label', models.CharField( + unique=True, max_length=128, verbose_name='Label', + db_index=True + ) + ), + ( + 'color', models.CharField( + max_length=3, verbose_name='Color', choices=[ + ('blu', 'Blue'), ('cya', 'Cyan'), ('crl', 'Coral'), + ('gry', 'Green-Yellow'), ('kki', 'Khaki'), + ('lig', 'LightGrey'), ('mag', 'Magenta'), + ('red', 'Red'), ('org', 'Orange'), + ('yel', 'Yellow') + ] + ) + ), + ( + 'documents', models.ManyToManyField( + related_name='tags', verbose_name='Documents', + to='documents.Document' + ) + ), ], options={ 'verbose_name': 'Tag', diff --git a/mayan/apps/user_management/views.py b/mayan/apps/user_management/views.py index 04bb8d22c9..becf9baf32 100644 --- a/mayan/apps/user_management/views.py +++ b/mayan/apps/user_management/views.py @@ -24,19 +24,80 @@ from .permissions import ( ) -class UserListView(SingleObjectListView): - view_permission = permission_user_view +class GroupCreateView(SingleObjectCreateView): + extra_context = {'title': _('Create new group')} + fields = ('name',) + model = Group + post_action_redirect = reverse_lazy('user_management:group_list') + view_permission = permission_group_create + + +class GroupEditView(SingleObjectEditView): + fields = ('name',) + model = Group + post_action_redirect = reverse_lazy('user_management:group_list') + view_permission = permission_group_edit def get_extra_context(self): return { - 'hide_link': True, - 'title': _('Users'), + 'object': self.get_object(), + 'title': _('Edit group: %s') % self.get_object(), } - def get_queryset(self): - return get_user_model().objects.exclude( - is_superuser=True - ).exclude(is_staff=True).order_by('last_name', 'first_name') + +class GroupListView(SingleObjectListView): + extra_context = { + 'hide_link': True, + 'title': _('Groups'), + } + model = Group + view_permission = permission_group_view + + +class GroupDeleteView(SingleObjectDeleteView): + model = Group + post_action_redirect = reverse_lazy('user_management:group_list') + view_permission = permission_group_delete + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Delete the group: %s?') % self.get_object(), + } + + +class GroupMembersView(AssignRemoveView): + decode_content_type = True + left_list_title = _('Available groups') + right_list_title = _('Members of groups') + view_permission = permission_group_edit + + def add(self, item): + self.get_object().user_set.add(item) + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Members of group: %s') % self.get_object() + } + + def get_object(self): + return get_object_or_404(Group, pk=self.kwargs['pk']) + + def left_list(self): + return AssignRemoveView.generate_choices( + User.objects.exclude( + groups=self.get_object() + ).exclude(is_staff=True).exclude(is_superuser=True) + ) + + def right_list(self): + return AssignRemoveView.generate_choices( + self.get_object().user_set.all() + ) + + def remove(self, item): + self.get_object().user_set.remove(item) class UserEditView(SingleObjectEditView): @@ -54,6 +115,53 @@ class UserEditView(SingleObjectEditView): } +class UserGroupsView(AssignRemoveView): + decode_content_type = True + left_list_title = _('Available groups') + right_list_title = _('Groups joined') + view_permission = permission_user_edit + + def add(self, item): + item.user_set.add(self.get_object()) + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Groups of user: %s') % self.get_object() + } + + def get_object(self): + return get_object_or_404(User, pk=self.kwargs['pk']) + + def left_list(self): + return AssignRemoveView.generate_choices( + Group.objects.exclude(user=self.get_object()) + ) + + def right_list(self): + return AssignRemoveView.generate_choices( + Group.objects.filter(user=self.get_object()) + ) + + def remove(self, item): + item.user_set.remove(self.get_object()) + + +class UserListView(SingleObjectListView): + view_permission = permission_user_view + + def get_extra_context(self): + return { + 'hide_link': True, + 'title': _('Users'), + } + + def get_queryset(self): + return get_user_model().objects.exclude( + is_superuser=True + ).exclude(is_staff=True).order_by('last_name', 'first_name') + + def user_add(request): Permission.check_permissions(request.user, (permission_user_create,)) @@ -230,112 +338,3 @@ def user_multiple_set_password(request): return user_set_password( request, user_id_list=request.GET.get('id_list', []) ) - - -class UserGroupsView(AssignRemoveView): - decode_content_type = True - left_list_title = _('Available groups') - right_list_title = _('Groups joined') - view_permission = permission_user_edit - - def add(self, item): - item.user_set.add(self.get_object()) - - def get_extra_context(self): - return { - 'object': self.get_object(), - 'title': _('Groups of user: %s') % self.get_object() - } - - def get_object(self): - return get_object_or_404(User, pk=self.kwargs['pk']) - - def left_list(self): - return AssignRemoveView.generate_choices( - Group.objects.exclude(user=self.get_object()) - ) - - def right_list(self): - return AssignRemoveView.generate_choices( - Group.objects.filter(user=self.get_object()) - ) - - def remove(self, item): - item.user_set.remove(self.get_object()) - - -# Group views -class GroupCreateView(SingleObjectCreateView): - extra_context = {'title': _('Create new group')} - fields = ('name',) - model = Group - post_action_redirect = reverse_lazy('user_management:group_list') - view_permission = permission_group_create - - -class GroupEditView(SingleObjectEditView): - fields = ('name',) - model = Group - post_action_redirect = reverse_lazy('user_management:group_list') - view_permission = permission_group_edit - - def get_extra_context(self): - return { - 'object': self.get_object(), - 'title': _('Edit group: %s') % self.get_object(), - } - - -class GroupListView(SingleObjectListView): - extra_context = { - 'hide_link': True, - 'title': _('Groups'), - } - model = Group - view_permission = permission_group_view - - -class GroupDeleteView(SingleObjectDeleteView): - model = Group - post_action_redirect = reverse_lazy('user_management:group_list') - view_permission = permission_group_delete - - def get_extra_context(self): - return { - 'object': self.get_object(), - 'title': _('Delete the group: %s?') % self.get_object(), - } - - -class GroupMembersView(AssignRemoveView): - decode_content_type = True - left_list_title = _('Available groups') - right_list_title = _('Members of groups') - view_permission = permission_group_edit - - def add(self, item): - self.get_object().user_set.add(item) - - def get_extra_context(self): - return { - 'object': self.get_object(), - 'title': _('Members of group: %s') % self.get_object() - } - - def get_object(self): - return get_object_or_404(Group, pk=self.kwargs['pk']) - - def left_list(self): - return AssignRemoveView.generate_choices( - User.objects.exclude( - groups=self.get_object() - ).exclude(is_staff=True).exclude(is_superuser=True) - ) - - def right_list(self): - return AssignRemoveView.generate_choices( - self.get_object().user_set.all() - ) - - def remove(self, item): - self.get_object().user_set.remove(item)