Refactor the document metadata add, edit and remove views.
This commit is contained in:
@@ -34,6 +34,7 @@ on production install to debug errors live.
|
|||||||
- Refactor add document to folder view to allow adding a documents to multiple folders at the same time.
|
- Refactor add document to folder view to allow adding a documents to multiple folders at the same time.
|
||||||
- Refactor the remove document from folder view to allow removing documents from multiple folders at the same time.
|
- Refactor the remove document from folder view to allow removing documents from multiple folders at the same time.
|
||||||
- Refactor the document mailing views and add support for sending multiple documents via email at the same time.
|
- Refactor the document mailing views and add support for sending multiple documents via email at the same time.
|
||||||
|
- Refactor the document metadata views and add support for adding multiple metadata types to a document at the same time.
|
||||||
|
|
||||||
Removals
|
Removals
|
||||||
--------
|
--------
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ class ExtraContextMixin(object):
|
|||||||
|
|
||||||
|
|
||||||
class MultipleInstanceActionMixin(object):
|
class MultipleInstanceActionMixin(object):
|
||||||
|
# TODO: Deprecated, replace views using this with
|
||||||
|
# MultipleObjectFormActionView or MultipleObjectConfirmActionView
|
||||||
|
|
||||||
model = None
|
model = None
|
||||||
success_message = _('Operation performed on %(count)d object')
|
success_message = _('Operation performed on %(count)d object')
|
||||||
success_message_plural = _('Operation performed on %(count)d objects')
|
success_message_plural = _('Operation performed on %(count)d objects')
|
||||||
@@ -188,7 +191,7 @@ class ObjectActionMixin(object):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def view_action(self, form=None):
|
def view_action(self, form=None):
|
||||||
count = 0
|
self.action_count = 0
|
||||||
|
|
||||||
for instance in self.get_queryset():
|
for instance in self.get_queryset():
|
||||||
try:
|
try:
|
||||||
@@ -196,11 +199,11 @@ class ObjectActionMixin(object):
|
|||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
count += 1
|
self.action_count += 1
|
||||||
|
|
||||||
messages.success(
|
messages.success(
|
||||||
self.request,
|
self.request,
|
||||||
self.get_success_message(count=count)
|
self.get_success_message(count=self.action_count)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from .classes import MetadataLookup
|
|||||||
from .models import MetadataType
|
from .models import MetadataType
|
||||||
|
|
||||||
|
|
||||||
class MetadataForm(forms.Form):
|
class DocumentMetadataForm(forms.Form):
|
||||||
id = forms.CharField(label=_('ID'), widget=forms.HiddenInput)
|
id = forms.CharField(label=_('ID'), widget=forms.HiddenInput)
|
||||||
|
|
||||||
name = forms.CharField(
|
name = forms.CharField(
|
||||||
@@ -22,7 +22,7 @@ class MetadataForm(forms.Form):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(MetadataForm, self).__init__(*args, **kwargs)
|
super(DocumentMetadataForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
# Set form fields initial values
|
# Set form fields initial values
|
||||||
if 'initial' in kwargs:
|
if 'initial' in kwargs:
|
||||||
@@ -104,23 +104,30 @@ class MetadataForm(forms.Form):
|
|||||||
return self.cleaned_data
|
return self.cleaned_data
|
||||||
|
|
||||||
|
|
||||||
MetadataFormSet = formset_factory(MetadataForm, extra=0)
|
DocumentMetadataFormSet = formset_factory(DocumentMetadataForm, extra=0)
|
||||||
|
|
||||||
|
|
||||||
class AddMetadataForm(forms.Form):
|
class DocumentAddMetadataForm(forms.Form):
|
||||||
metadata_type = forms.ModelChoiceField(
|
metadata_type = forms.ModelMultipleChoiceField(
|
||||||
queryset=MetadataType.objects.all(), label=_('Metadata type')
|
help_text=_('Metadata types to be added to the selected documents.'),
|
||||||
|
label=_('Metadata type'), queryset=MetadataType.objects.all(),
|
||||||
|
widget=forms.SelectMultiple(
|
||||||
|
attrs={'class': 'select2'},
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
document_type = kwargs.pop('document_type')
|
document_type = kwargs.pop('document_type')
|
||||||
super(AddMetadataForm, self).__init__(*args, **kwargs)
|
queryset = kwargs.pop(
|
||||||
self.fields['metadata_type'].queryset = MetadataType.objects.filter(
|
'queryset', MetadataType.objects.get_for_document_type(
|
||||||
pk__in=document_type.metadata.values_list(
|
document_type=document_type
|
||||||
'metadata_type', flat=True
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
super(DocumentAddMetadataForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
self.fields['metadata_type'].queryset = queryset
|
||||||
|
|
||||||
|
|
||||||
class MetadataTypeForm(forms.ModelForm):
|
class MetadataTypeForm(forms.ModelForm):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@@ -136,14 +143,16 @@ class MetadataTypeForm(forms.ModelForm):
|
|||||||
model = MetadataType
|
model = MetadataType
|
||||||
|
|
||||||
|
|
||||||
class MetadataRemoveForm(MetadataForm):
|
class DocumentMetadataRemoveForm(DocumentMetadataForm):
|
||||||
update = forms.BooleanField(
|
update = forms.BooleanField(
|
||||||
initial=False, label=_('Remove'), required=False
|
initial=False, label=_('Remove'), required=False
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(MetadataRemoveForm, self).__init__(*args, **kwargs)
|
super(DocumentMetadataRemoveForm, self).__init__(*args, **kwargs)
|
||||||
self.fields.pop('value')
|
self.fields.pop('value')
|
||||||
|
|
||||||
|
|
||||||
MetadataRemoveFormSet = formset_factory(MetadataRemoveForm, extra=0)
|
DocumentMetadataRemoveFormSet = formset_factory(
|
||||||
|
DocumentMetadataRemoveForm, extra=0
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,6 +1,22 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
class MetadataTypeManager(models.Manager):
|
class MetadataTypeManager(models.Manager):
|
||||||
def get_by_natural_key(self, name):
|
def get_by_natural_key(self, name):
|
||||||
return self.get(name=name)
|
return self.get(name=name)
|
||||||
|
|
||||||
|
def get_for_document(self, document):
|
||||||
|
return self.filter(
|
||||||
|
pk__in=document.metadata.values_list(
|
||||||
|
'metadata_type', flat=True
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_for_document_type(self, document_type):
|
||||||
|
return self.filter(
|
||||||
|
pk__in=document_type.metadata.values_list(
|
||||||
|
'metadata_type', flat=True
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|||||||
@@ -10,37 +10,40 @@ from .api_views import (
|
|||||||
APIMetadataTypeView
|
APIMetadataTypeView
|
||||||
)
|
)
|
||||||
from .views import (
|
from .views import (
|
||||||
DocumentMetadataListView, MetadataTypeCreateView, MetadataTypeDeleteView,
|
DocumentMetadataAddView, DocumentMetadataEditView,
|
||||||
MetadataTypeEditView, MetadataTypeListView,
|
DocumentMetadataListView, DocumentMetadataRemoveView,
|
||||||
SetupDocumentTypeMetadataOptionalView,
|
MetadataTypeCreateView, MetadataTypeDeleteView, MetadataTypeEditView,
|
||||||
SetupDocumentTypeMetadataRequiredView, metadata_add, metadata_edit,
|
MetadataTypeListView, SetupDocumentTypeMetadataOptionalView,
|
||||||
metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove,
|
SetupDocumentTypeMetadataRequiredView
|
||||||
metadata_remove
|
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(
|
url(
|
||||||
r'^(?P<document_id>\d+)/edit/$', metadata_edit, name='metadata_edit'
|
r'^(?P<pk>\d+)/edit/$', DocumentMetadataEditView.as_view(),
|
||||||
|
name='metadata_edit'
|
||||||
|
),
|
||||||
|
url(
|
||||||
|
r'^multiple/edit/$', DocumentMetadataEditView.as_view(),
|
||||||
|
name='metadata_multiple_edit'
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^(?P<pk>\d+)/view/$', DocumentMetadataListView.as_view(),
|
r'^(?P<pk>\d+)/view/$', DocumentMetadataListView.as_view(),
|
||||||
name='metadata_view'
|
name='metadata_view'
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^multiple/edit/$', metadata_multiple_edit,
|
r'^(?P<pk>\d+)/add/$', DocumentMetadataAddView.as_view(),
|
||||||
name='metadata_multiple_edit'
|
name='metadata_add'
|
||||||
),
|
),
|
||||||
url(r'^(?P<document_id>\d+)/add/$', metadata_add, name='metadata_add'),
|
|
||||||
url(
|
url(
|
||||||
r'^multiple/add/$', metadata_multiple_add,
|
r'^multiple/add/$', DocumentMetadataAddView.as_view(),
|
||||||
name='metadata_multiple_add'
|
name='metadata_multiple_add'
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^(?P<document_id>\d+)/remove/$', metadata_remove,
|
r'^(?P<pk>\d+)/remove/$', DocumentMetadataRemoveView.as_view(),
|
||||||
name='metadata_remove'
|
name='metadata_remove'
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^multiple/remove/$', metadata_multiple_remove,
|
r'^multiple/remove/$', DocumentMetadataRemoveView.as_view(),
|
||||||
name='metadata_multiple_remove'
|
name='metadata_multiple_remove'
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@ from formtools.wizard.views import SessionWizardView
|
|||||||
|
|
||||||
from common.mixins import ViewPermissionCheckMixin
|
from common.mixins import ViewPermissionCheckMixin
|
||||||
from documents.forms import DocumentTypeSelectForm
|
from documents.forms import DocumentTypeSelectForm
|
||||||
from metadata.forms import MetadataFormSet
|
from metadata.forms import DocumentMetadataFormSet
|
||||||
from tags.forms import TagMultipleSelectionForm
|
from tags.forms import TagMultipleSelectionForm
|
||||||
|
|
||||||
from .literals import STEP_DOCUMENT_TYPE, STEP_METADATA, STEP_TAGS
|
from .literals import STEP_DOCUMENT_TYPE, STEP_METADATA, STEP_TAGS
|
||||||
@@ -33,10 +33,13 @@ def has_metadata_types(wizard):
|
|||||||
class DocumentCreateWizard(ViewPermissionCheckMixin, SessionWizardView):
|
class DocumentCreateWizard(ViewPermissionCheckMixin, SessionWizardView):
|
||||||
condition_dict = {STEP_METADATA: has_metadata_types}
|
condition_dict = {STEP_METADATA: has_metadata_types}
|
||||||
extra_context = {}
|
extra_context = {}
|
||||||
form_list = (DocumentTypeSelectForm, MetadataFormSet, TagMultipleSelectionForm)
|
form_list = (
|
||||||
|
DocumentTypeSelectForm, DocumentMetadataFormSet,
|
||||||
|
TagMultipleSelectionForm
|
||||||
|
)
|
||||||
form_titles = {
|
form_titles = {
|
||||||
DocumentTypeSelectForm: _('Step 1 of 3: Select document type'),
|
DocumentTypeSelectForm: _('Step 1 of 3: Select document type'),
|
||||||
MetadataFormSet: _('Step 2 of 3: Enter document metadata'),
|
DocumentMetadataFormSet: _('Step 2 of 3: Enter document metadata'),
|
||||||
TagMultipleSelectionForm: _('Step 3 of 3: Select tags'),
|
TagMultipleSelectionForm: _('Step 3 of 3: Select tags'),
|
||||||
}
|
}
|
||||||
template_name = 'appearance/generic_wizard.html'
|
template_name = 'appearance/generic_wizard.html'
|
||||||
|
|||||||
Reference in New Issue
Block a user