Refactor the document metadata add, edit and remove views.

This commit is contained in:
Roberto Rosario
2016-12-28 00:55:09 -04:00
parent 66a49ccefc
commit 5167bbadee
7 changed files with 444 additions and 435 deletions

View File

@@ -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 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 metadata views and add support for adding multiple metadata types to a document at the same time.
Removals
--------

View File

@@ -67,6 +67,9 @@ class ExtraContextMixin(object):
class MultipleInstanceActionMixin(object):
# TODO: Deprecated, replace views using this with
# MultipleObjectFormActionView or MultipleObjectConfirmActionView
model = None
success_message = _('Operation performed on %(count)d object')
success_message_plural = _('Operation performed on %(count)d objects')
@@ -188,7 +191,7 @@ class ObjectActionMixin(object):
pass
def view_action(self, form=None):
count = 0
self.action_count = 0
for instance in self.get_queryset():
try:
@@ -196,11 +199,11 @@ class ObjectActionMixin(object):
except PermissionDenied:
pass
else:
count += 1
self.action_count += 1
messages.success(
self.request,
self.get_success_message(count=count)
self.get_success_message(count=self.action_count)
)

View File

@@ -9,7 +9,7 @@ from .classes import MetadataLookup
from .models import MetadataType
class MetadataForm(forms.Form):
class DocumentMetadataForm(forms.Form):
id = forms.CharField(label=_('ID'), widget=forms.HiddenInput)
name = forms.CharField(
@@ -22,7 +22,7 @@ class MetadataForm(forms.Form):
)
def __init__(self, *args, **kwargs):
super(MetadataForm, self).__init__(*args, **kwargs)
super(DocumentMetadataForm, self).__init__(*args, **kwargs)
# Set form fields initial values
if 'initial' in kwargs:
@@ -104,23 +104,30 @@ class MetadataForm(forms.Form):
return self.cleaned_data
MetadataFormSet = formset_factory(MetadataForm, extra=0)
DocumentMetadataFormSet = formset_factory(DocumentMetadataForm, extra=0)
class AddMetadataForm(forms.Form):
metadata_type = forms.ModelChoiceField(
queryset=MetadataType.objects.all(), label=_('Metadata type')
class DocumentAddMetadataForm(forms.Form):
metadata_type = forms.ModelMultipleChoiceField(
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):
document_type = kwargs.pop('document_type')
super(AddMetadataForm, self).__init__(*args, **kwargs)
self.fields['metadata_type'].queryset = MetadataType.objects.filter(
pk__in=document_type.metadata.values_list(
'metadata_type', flat=True
queryset = kwargs.pop(
'queryset', MetadataType.objects.get_for_document_type(
document_type=document_type
)
)
super(DocumentAddMetadataForm, self).__init__(*args, **kwargs)
self.fields['metadata_type'].queryset = queryset
class MetadataTypeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
@@ -136,14 +143,16 @@ class MetadataTypeForm(forms.ModelForm):
model = MetadataType
class MetadataRemoveForm(MetadataForm):
class DocumentMetadataRemoveForm(DocumentMetadataForm):
update = forms.BooleanField(
initial=False, label=_('Remove'), required=False
)
def __init__(self, *args, **kwargs):
super(MetadataRemoveForm, self).__init__(*args, **kwargs)
super(DocumentMetadataRemoveForm, self).__init__(*args, **kwargs)
self.fields.pop('value')
MetadataRemoveFormSet = formset_factory(MetadataRemoveForm, extra=0)
DocumentMetadataRemoveFormSet = formset_factory(
DocumentMetadataRemoveForm, extra=0
)

View File

@@ -1,6 +1,22 @@
from __future__ import unicode_literals
from django.db import models
class MetadataTypeManager(models.Manager):
def get_by_natural_key(self, 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
)
)

View File

@@ -10,37 +10,40 @@ from .api_views import (
APIMetadataTypeView
)
from .views import (
DocumentMetadataListView, MetadataTypeCreateView, MetadataTypeDeleteView,
MetadataTypeEditView, MetadataTypeListView,
SetupDocumentTypeMetadataOptionalView,
SetupDocumentTypeMetadataRequiredView, metadata_add, metadata_edit,
metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove,
metadata_remove
DocumentMetadataAddView, DocumentMetadataEditView,
DocumentMetadataListView, DocumentMetadataRemoveView,
MetadataTypeCreateView, MetadataTypeDeleteView, MetadataTypeEditView,
MetadataTypeListView, SetupDocumentTypeMetadataOptionalView,
SetupDocumentTypeMetadataRequiredView
)
urlpatterns = [
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(
r'^(?P<pk>\d+)/view/$', DocumentMetadataListView.as_view(),
name='metadata_view'
),
url(
r'^multiple/edit/$', metadata_multiple_edit,
name='metadata_multiple_edit'
r'^(?P<pk>\d+)/add/$', DocumentMetadataAddView.as_view(),
name='metadata_add'
),
url(r'^(?P<document_id>\d+)/add/$', metadata_add, name='metadata_add'),
url(
r'^multiple/add/$', metadata_multiple_add,
r'^multiple/add/$', DocumentMetadataAddView.as_view(),
name='metadata_multiple_add'
),
url(
r'^(?P<document_id>\d+)/remove/$', metadata_remove,
r'^(?P<pk>\d+)/remove/$', DocumentMetadataRemoveView.as_view(),
name='metadata_remove'
),
url(
r'^multiple/remove/$', metadata_multiple_remove,
r'^multiple/remove/$', DocumentMetadataRemoveView.as_view(),
name='metadata_multiple_remove'
),

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ from formtools.wizard.views import SessionWizardView
from common.mixins import ViewPermissionCheckMixin
from documents.forms import DocumentTypeSelectForm
from metadata.forms import MetadataFormSet
from metadata.forms import DocumentMetadataFormSet
from tags.forms import TagMultipleSelectionForm
from .literals import STEP_DOCUMENT_TYPE, STEP_METADATA, STEP_TAGS
@@ -33,10 +33,13 @@ def has_metadata_types(wizard):
class DocumentCreateWizard(ViewPermissionCheckMixin, SessionWizardView):
condition_dict = {STEP_METADATA: has_metadata_types}
extra_context = {}
form_list = (DocumentTypeSelectForm, MetadataFormSet, TagMultipleSelectionForm)
form_list = (
DocumentTypeSelectForm, DocumentMetadataFormSet,
TagMultipleSelectionForm
)
form_titles = {
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'),
}
template_name = 'appearance/generic_wizard.html'