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 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
-------- --------

View File

@@ -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)
) )

View File

@@ -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
)

View File

@@ -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
)
)

View File

@@ -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

View File

@@ -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'