PEP8 Cleanusp (549 warnings).
This commit is contained in:
@@ -3,7 +3,7 @@ python:
|
|||||||
- 2.7
|
- 2.7
|
||||||
env:
|
env:
|
||||||
global:
|
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:
|
matrix:
|
||||||
- DB=mysql
|
- DB=mysql
|
||||||
- DB=postgres
|
- DB=postgres
|
||||||
|
|||||||
@@ -11,10 +11,9 @@ from django.utils.timezone import now
|
|||||||
from authentication.tests.literals import (
|
from authentication.tests.literals import (
|
||||||
TEST_ADMIN_USERNAME, TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD
|
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 (
|
from documents.tests.literals import (
|
||||||
TEST_DOCUMENT_TYPE, TEST_DOCUMENT_PATH, TEST_MULTI_PAGE_TIFF_PATH,
|
TEST_DOCUMENT_TYPE, TEST_DOCUMENT_PATH, TEST_SMALL_DOCUMENT_PATH
|
||||||
TEST_OFFICE_DOCUMENT_PATH, TEST_SMALL_DOCUMENT_PATH
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from ..exceptions import (
|
from ..exceptions import (
|
||||||
@@ -54,7 +53,9 @@ class DocumentCheckoutTestCase(TestCase):
|
|||||||
|
|
||||||
self.assertTrue(self.document.is_checked_out())
|
self.assertTrue(self.document.is_checked_out())
|
||||||
self.assertTrue(
|
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):
|
def test_version_creation_blocking(self):
|
||||||
@@ -81,7 +82,9 @@ class DocumentCheckoutTestCase(TestCase):
|
|||||||
|
|
||||||
self.assertFalse(self.document.is_checked_out())
|
self.assertFalse(self.document.is_checked_out())
|
||||||
self.assertFalse(
|
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):
|
def test_double_checkout(self):
|
||||||
@@ -94,8 +97,9 @@ class DocumentCheckoutTestCase(TestCase):
|
|||||||
|
|
||||||
with self.assertRaises(DocumentAlreadyCheckedOut):
|
with self.assertRaises(DocumentAlreadyCheckedOut):
|
||||||
DocumentCheckout.objects.checkout_document(
|
DocumentCheckout.objects.checkout_document(
|
||||||
document=self.document, expiration_datetime=expiration_datetime,
|
document=self.document,
|
||||||
user=self.admin_user, block_new_version=True
|
expiration_datetime=expiration_datetime, user=self.admin_user,
|
||||||
|
block_new_version=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_checkin_without_checkout(self):
|
def test_checkin_without_checkout(self):
|
||||||
|
|||||||
@@ -142,7 +142,9 @@ def checkout_info(request, document_pk):
|
|||||||
) % render_date_object(checkout_info.expiration_datetime)
|
) % render_date_object(checkout_info.expiration_datetime)
|
||||||
)
|
)
|
||||||
paragraphs.append(
|
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(
|
return render_to_response(
|
||||||
@@ -198,7 +200,8 @@ class DocumentCheckinView(ConfirmView):
|
|||||||
)
|
)
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
AccessControlList.objects.check_access(
|
AccessControlList.objects.check_access(
|
||||||
permission_document_checkin_override, request.user, document
|
permission_document_checkin_override, request.user,
|
||||||
|
document
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import logging
|
|||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
|
|
||||||
from mayan.celery import app
|
from mayan.celery import app
|
||||||
from common.models import SharedUploadedFile
|
|
||||||
|
|
||||||
from .literals import UPLOAD_EXPIRATION_INTERVAL
|
from .literals import UPLOAD_EXPIRATION_INTERVAL
|
||||||
from .models import SharedUploadedFile
|
from .models import SharedUploadedFile
|
||||||
|
|||||||
@@ -194,7 +194,9 @@ def multi_object_action_view(request):
|
|||||||
)
|
)
|
||||||
|
|
||||||
action = request.GET.get('action', None)
|
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 = [
|
items_property_list = [
|
||||||
(key[11:]) for key in request.GET.keys() if key.startswith('properties_')
|
(key[11:]) for key in request.GET.keys() if key.startswith('properties_')
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ link_private_keys = Link(
|
|||||||
text=_('Private keys'), view='django_gpg:key_private_list'
|
text=_('Private keys'), view='django_gpg:key_private_list'
|
||||||
)
|
)
|
||||||
link_public_keys = Link(
|
link_public_keys = Link(
|
||||||
icon='fa fa-key', permissions=(permission_key_view,), text=_('Public keys'),
|
icon='fa fa-key', permissions=(permission_key_view,),
|
||||||
view='django_gpg:key_public_list'
|
text=_('Public keys'), view='django_gpg:key_public_list'
|
||||||
)
|
)
|
||||||
link_key_delete = Link(
|
link_key_delete = Link(
|
||||||
permissions=(permission_key_delete,), tags='dangerous', text=_('Delete'),
|
permissions=(permission_key_delete,), tags='dangerous', text=_('Delete'),
|
||||||
|
|||||||
@@ -87,7 +87,9 @@ class SetupIndexTreeTemplateListView(SingleObjectListView):
|
|||||||
return get_object_or_404(Index, pk=self.kwargs['pk'])
|
return get_object_or_404(Index, pk=self.kwargs['pk'])
|
||||||
|
|
||||||
def get_queryset(self):
|
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):
|
def get_extra_context(self):
|
||||||
return {
|
return {
|
||||||
@@ -128,7 +130,9 @@ class SetupIndexDocumentTypesView(AssignRemoveView):
|
|||||||
def get_extra_context(self):
|
def get_extra_context(self):
|
||||||
return {
|
return {
|
||||||
'object': self.get_object(),
|
'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:
|
||||||
if self.index_instance.index_template_node.link_documents:
|
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)
|
return SingleObjectListView.dispatch(self, request, *args, **kwargs)
|
||||||
|
|
||||||
@@ -276,7 +282,9 @@ class IndexInstanceNodeView(DocumentListView, SingleObjectListView):
|
|||||||
'hide_links': True,
|
'hide_links': True,
|
||||||
'object': self.index_instance,
|
'object': self.index_instance,
|
||||||
'title': mark_safe(
|
'title': mark_safe(
|
||||||
_('Contents for index: %s') % get_breadcrumbs(self.index_instance)
|
_(
|
||||||
|
'Contents for index: %s'
|
||||||
|
) % get_breadcrumbs(self.index_instance)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,17 +37,23 @@ def document_verify(request, document_pk):
|
|||||||
request.user, (permission_document_verify,)
|
request.user, (permission_document_verify,)
|
||||||
)
|
)
|
||||||
except PermissionDenied:
|
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)
|
document.add_as_recent_document_for_user(request.user)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
signature = DocumentVersionSignature.objects.verify_signature(document.latest_version)
|
signature = DocumentVersionSignature.objects.verify_signature(
|
||||||
|
document.latest_version
|
||||||
|
)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
signature_state = SIGNATURE_STATES.get(SIGNATURE_STATE_NONE)
|
signature_state = SIGNATURE_STATES.get(SIGNATURE_STATE_NONE)
|
||||||
signature = None
|
signature = None
|
||||||
else:
|
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']]
|
paragraphs = [_('Signature status: %s') % signature_state['text']]
|
||||||
|
|
||||||
@@ -65,7 +71,9 @@ def document_verify(request, document_pk):
|
|||||||
_('Signature ID: %s') % signature.signature_id,
|
_('Signature ID: %s') % signature.signature_id,
|
||||||
_('Signature type: %s') % signature_type,
|
_('Signature type: %s') % signature_type,
|
||||||
_('Key ID: %s') % signature.key_id,
|
_('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', '')),
|
_('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)
|
document = get_object_or_404(Document, pk=document_pk)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.check_permissions(request.user, (permission_signature_upload,))
|
Permission.check_permissions(
|
||||||
|
request.user, (permission_signature_upload,)
|
||||||
|
)
|
||||||
except PermissionDenied:
|
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)
|
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)
|
form = DetachedSignatureForm(request.POST, request.FILES)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
try:
|
try:
|
||||||
DocumentVersionSignature.objects.add_detached_signature(document.latest_version, request.FILES['file'])
|
DocumentVersionSignature.objects.add_detached_signature(
|
||||||
messages.success(request, _('Detached signature uploaded successfully.'))
|
document.latest_version, request.FILES['file']
|
||||||
|
)
|
||||||
|
messages.success(
|
||||||
|
request, _('Detached signature uploaded successfully.')
|
||||||
|
)
|
||||||
return HttpResponseRedirect(next)
|
return HttpResponseRedirect(next)
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
messages.error(request, 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)
|
document = get_object_or_404(Document, pk=document_pk)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.check_permissions(request.user, (permission_signature_download,))
|
Permission.check_permissions(
|
||||||
|
request.user, (permission_signature_download,)
|
||||||
|
)
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
AccessControlList.objects.check_access(permission_signature_download, request.user, document)
|
AccessControlList.objects.check_access(
|
||||||
|
permission_signature_download, request.user, document
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if DocumentVersionSignature.objects.has_detached_signature(document.latest_version):
|
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(
|
return serve_file(
|
||||||
request,
|
request,
|
||||||
signature,
|
signature,
|
||||||
@@ -142,9 +164,13 @@ def document_signature_delete(request, document_pk):
|
|||||||
document = get_object_or_404(Document, pk=document_pk)
|
document = get_object_or_404(Document, pk=document_pk)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.check_permissions(request.user, (permission_signature_delete,))
|
Permission.check_permissions(
|
||||||
|
request.user, (permission_signature_delete,)
|
||||||
|
)
|
||||||
except PermissionDenied:
|
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)
|
document.add_as_recent_document_for_user(request.user)
|
||||||
|
|
||||||
@@ -154,17 +180,27 @@ def document_signature_delete(request, document_pk):
|
|||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
try:
|
try:
|
||||||
DocumentVersionSignature.objects.clear_detached_signature(document.latest_version)
|
DocumentVersionSignature.objects.clear_detached_signature(
|
||||||
messages.success(request, _('Detached signature deleted successfully.'))
|
document.latest_version
|
||||||
|
)
|
||||||
|
messages.success(
|
||||||
|
request, _('Detached signature deleted successfully.')
|
||||||
|
)
|
||||||
return HttpResponseRedirect(next)
|
return HttpResponseRedirect(next)
|
||||||
except Exception as exception:
|
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 HttpResponseRedirect(previous)
|
||||||
|
|
||||||
return render_to_response('appearance/generic_confirm.html', {
|
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,
|
'delete_view': True,
|
||||||
|
'next': next,
|
||||||
|
'object': document,
|
||||||
|
'previous': previous,
|
||||||
|
'title': _(
|
||||||
|
'Delete the detached signature from document: %s?'
|
||||||
|
) % document,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|||||||
@@ -20,4 +20,3 @@ PAGE_RANGE_RANGE = 'range'
|
|||||||
PAGE_RANGE_CHOICES = (
|
PAGE_RANGE_CHOICES = (
|
||||||
(PAGE_RANGE_ALL, _('All pages')), (PAGE_RANGE_RANGE, _('Page range'))
|
(PAGE_RANGE_ALL, _('All pages')), (PAGE_RANGE_RANGE, _('Page range'))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ class Document(models.Model):
|
|||||||
in_trash = models.BooleanField(
|
in_trash = models.BooleanField(
|
||||||
default=False, editable=False, verbose_name=_('In trash?')
|
default=False, editable=False, verbose_name=_('In trash?')
|
||||||
)
|
)
|
||||||
#TODO: set editable to False
|
# TODO: set editable to False
|
||||||
deleted_date_time = models.DateTimeField(
|
deleted_date_time = models.DateTimeField(
|
||||||
blank=True, editable=True, null=True,
|
blank=True, editable=True, null=True,
|
||||||
verbose_name=_('Date and time trashed')
|
verbose_name=_('Date and time trashed')
|
||||||
|
|||||||
@@ -4,12 +4,7 @@ import datetime
|
|||||||
|
|
||||||
import qsstats
|
import qsstats
|
||||||
|
|
||||||
from django.db.models import Avg, Count, Max, Min
|
from .models import Document, DocumentPage, DocumentVersion
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
from statistics.classes import Statistic
|
|
||||||
|
|
||||||
from .models import Document, DocumentType, DocumentPage, DocumentVersion
|
|
||||||
|
|
||||||
|
|
||||||
def new_documents_per_month():
|
def new_documents_per_month():
|
||||||
@@ -50,6 +45,7 @@ def new_document_pages_per_month():
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def total_document_per_month():
|
def total_document_per_month():
|
||||||
qss = qsstats.QuerySetStats(Document.objects.all(), 'date_added')
|
qss = qsstats.QuerySetStats(Document.objects.all(), 'date_added')
|
||||||
this_year = datetime.date.today().year
|
this_year = datetime.date.today().year
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from .views import (
|
|||||||
DeletedDocumentListView, DocumentEditView, DocumentListView,
|
DeletedDocumentListView, DocumentEditView, DocumentListView,
|
||||||
DocumentPageView, DocumentPageListView, DocumentPreviewView,
|
DocumentPageView, DocumentPageListView, DocumentPreviewView,
|
||||||
DocumentRestoreView, DocumentRestoreManyView, DocumentTrashView,
|
DocumentRestoreView, DocumentRestoreManyView, DocumentTrashView,
|
||||||
DocumentTrashManyView, DocumentTypeCreateView, DocumentTypeDeleteView,
|
DocumentTrashManyView, DocumentTypeCreateView, DocumentTypeDeleteView,
|
||||||
DocumentTypeDocumentListView, DocumentTypeFilenameDeleteView,
|
DocumentTypeDocumentListView, DocumentTypeFilenameDeleteView,
|
||||||
DocumentTypeFilenameEditView, DocumentTypeFilenameListView,
|
DocumentTypeFilenameEditView, DocumentTypeFilenameListView,
|
||||||
DocumentTypeListView, DocumentTypeEditView, DocumentVersionListView,
|
DocumentTypeListView, DocumentTypeEditView, DocumentVersionListView,
|
||||||
|
|||||||
@@ -31,9 +31,7 @@ from converter.permissions import permission_transformation_delete
|
|||||||
from filetransfers.api import serve_file
|
from filetransfers.api import serve_file
|
||||||
from permissions import Permission
|
from permissions import Permission
|
||||||
|
|
||||||
from .events import (
|
from .events import event_document_type_change
|
||||||
event_document_properties_edit, event_document_type_change
|
|
||||||
)
|
|
||||||
from .forms import (
|
from .forms import (
|
||||||
DocumentDownloadForm, DocumentForm, DocumentPageForm, DocumentPreviewForm,
|
DocumentDownloadForm, DocumentForm, DocumentPageForm, DocumentPreviewForm,
|
||||||
DocumentPropertiesForm, DocumentTypeSelectForm,
|
DocumentPropertiesForm, DocumentTypeSelectForm,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from django.test import TestCase, override_settings
|
|||||||
from documents.models import DocumentType
|
from documents.models import DocumentType
|
||||||
from documents.tests import TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_TYPE
|
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_DEFAULT_VALUE = 'test'
|
||||||
TEST_LOOKUP_TEMPLATE = '1,2,3'
|
TEST_LOOKUP_TEMPLATE = '1,2,3'
|
||||||
|
|||||||
@@ -14,5 +14,3 @@ class DocumentTypeSettingsAdmin(admin.ModelAdmin):
|
|||||||
class DocumentVersionOCRErrorAdmin(admin.ModelAdmin):
|
class DocumentVersionOCRErrorAdmin(admin.ModelAdmin):
|
||||||
list_display = ('document_version', 'datetime_submitted')
|
list_display = ('document_version', 'datetime_submitted')
|
||||||
readonly_fields = ('document_version', 'datetime_submitted', 'result')
|
readonly_fields = ('document_version', 'datetime_submitted', 'result')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,29 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='DocumentVersionOCRError',
|
name='DocumentVersionOCRError',
|
||||||
fields=[
|
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)),
|
'id', models.AutoField(
|
||||||
('result', models.TextField(null=True, verbose_name='Result', blank=True)),
|
verbose_name='ID', serialize=False, auto_created=True,
|
||||||
('document_version', models.ForeignKey(verbose_name='Document version', to='documents.DocumentVersion')),
|
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={
|
options={
|
||||||
'ordering': ('datetime_submitted',),
|
'ordering': ('datetime_submitted',),
|
||||||
|
|||||||
@@ -15,9 +15,23 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='DocumentPageContent',
|
name='DocumentPageContent',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
(
|
||||||
('content', models.TextField(verbose_name='Content', blank=True)),
|
'id', models.AutoField(
|
||||||
('document_page', models.OneToOneField(related_name='ocr_content', verbose_name='Document page', to='documents.DocumentPage')),
|
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={
|
options={
|
||||||
'verbose_name': 'Document page content',
|
'verbose_name': 'Document page content',
|
||||||
|
|||||||
@@ -26,9 +26,26 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='DocumentTypeSettings',
|
name='DocumentTypeSettings',
|
||||||
fields=[
|
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.')),
|
'id', models.AutoField(
|
||||||
('document_type', models.OneToOneField(related_name='ocr_settings', verbose_name='Document type', to='documents.DocumentType')),
|
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={
|
options={
|
||||||
'verbose_name': 'Document type settings',
|
'verbose_name': 'Document type settings',
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ from documents.tests import (
|
|||||||
|
|
||||||
from ..classes import TextExtractor
|
from ..classes import TextExtractor
|
||||||
from ..parsers import PDFMinerParser, PopplerParser
|
from ..parsers import PDFMinerParser, PopplerParser
|
||||||
from ..settings import setting_auto_ocr
|
|
||||||
|
|
||||||
|
|
||||||
@override_settings(OCR_AUTO_OCR=False)
|
@override_settings(OCR_AUTO_OCR=False)
|
||||||
|
|||||||
@@ -235,7 +235,11 @@ def entry_re_queue(request, pk=None, pk_list=None):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
except DocumentVersion.DoesNotExist:
|
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)
|
return HttpResponseRedirect(next)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
|
|||||||
@@ -14,9 +14,19 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='PermissionHolder',
|
name='PermissionHolder',
|
||||||
fields=[
|
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_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={
|
options={
|
||||||
'verbose_name': 'Permission holder',
|
'verbose_name': 'Permission holder',
|
||||||
@@ -27,9 +37,18 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Role',
|
name='Role',
|
||||||
fields=[
|
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)),
|
('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={
|
options={
|
||||||
'ordering': ('label',),
|
'ordering': ('label',),
|
||||||
@@ -41,10 +60,24 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='RoleMember',
|
name='RoleMember',
|
||||||
fields=[
|
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_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={
|
options={
|
||||||
'verbose_name': 'Role member',
|
'verbose_name': 'Role member',
|
||||||
@@ -55,8 +88,17 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='StoredPermission',
|
name='StoredPermission',
|
||||||
fields=[
|
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')),
|
('name', models.CharField(max_length=64, verbose_name='Name')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
@@ -73,7 +115,9 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='permissionholder',
|
model_name='permissionholder',
|
||||||
name='permission',
|
name='permission',
|
||||||
field=models.ForeignKey(verbose_name='Permission', to='permissions.StoredPermission'),
|
field=models.ForeignKey(
|
||||||
|
verbose_name='Permission', to='permissions.StoredPermission'
|
||||||
|
),
|
||||||
preserve_default=True,
|
preserve_default=True,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -37,13 +37,18 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='role',
|
model_name='role',
|
||||||
name='groups',
|
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,
|
preserve_default=True,
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='role',
|
model_name='role',
|
||||||
name='permissions',
|
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,
|
preserve_default=True,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from importlib import import_module
|
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from common import MayanAppConfig, menu_setup, menu_object
|
from common import MayanAppConfig, menu_setup, menu_object
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from celery.schedules import crontab
|
|
||||||
from kombu import Exchange, Queue
|
from kombu import Exchange, Queue
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import json
|
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import HttpResponseRedirect
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from common.generics import (
|
from common.generics import (
|
||||||
|
|||||||
@@ -14,10 +14,35 @@ class Migration(migrations.Migration):
|
|||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Tag',
|
name='Tag',
|
||||||
fields=[
|
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)),
|
'id', models.AutoField(
|
||||||
('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')])),
|
verbose_name='ID', serialize=False, auto_created=True,
|
||||||
('documents', models.ManyToManyField(related_name='tags', verbose_name='Documents', to='documents.Document')),
|
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={
|
options={
|
||||||
'verbose_name': 'Tag',
|
'verbose_name': 'Tag',
|
||||||
|
|||||||
@@ -24,19 +24,80 @@ from .permissions import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class UserListView(SingleObjectListView):
|
class GroupCreateView(SingleObjectCreateView):
|
||||||
view_permission = permission_user_view
|
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):
|
def get_extra_context(self):
|
||||||
return {
|
return {
|
||||||
'hide_link': True,
|
'object': self.get_object(),
|
||||||
'title': _('Users'),
|
'title': _('Edit group: %s') % self.get_object(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
return get_user_model().objects.exclude(
|
class GroupListView(SingleObjectListView):
|
||||||
is_superuser=True
|
extra_context = {
|
||||||
).exclude(is_staff=True).order_by('last_name', 'first_name')
|
'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):
|
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):
|
def user_add(request):
|
||||||
Permission.check_permissions(request.user, (permission_user_create,))
|
Permission.check_permissions(request.user, (permission_user_create,))
|
||||||
|
|
||||||
@@ -230,112 +338,3 @@ def user_multiple_set_password(request):
|
|||||||
return user_set_password(
|
return user_set_password(
|
||||||
request, user_id_list=request.GET.get('id_list', [])
|
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)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user