Added ability to specify default metadata or metadataset per document type

This commit is contained in:
Roberto Rosario
2011-05-30 23:44:12 -04:00
parent 12d3ec4ed5
commit 43f37ffd32
4 changed files with 40 additions and 9 deletions

View File

@@ -25,7 +25,7 @@ class DocumentCreateWizard(BoundFormWizard):
} }
if data not in initial: if data not in initial:
initial.append(data) initial.append(data)
return initial return initial
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -36,13 +36,9 @@ class DocumentCreateWizard(BoundFormWizard):
_(u'step 2 of 3: Metadata selection'), _(u'step 2 of 3: Metadata selection'),
_(u'step 3 of 3: Document metadata'), _(u'step 3 of 3: Document metadata'),
]) ])
self.document_type = kwargs.pop('document_type', None)
super(DocumentCreateWizard, self).__init__(*args, **kwargs) super(DocumentCreateWizard, self).__init__(*args, **kwargs)
if self.document_type:
self.initial = {0: self.generate_metadata_initial_values()}
def render_template(self, request, form, previous_fields, step, context=None): def render_template(self, request, form, previous_fields, step, context=None):
context = {'step_title': self.extra_context['step_titles'][step]} context = {'step_title': self.extra_context['step_titles'][step]}
return super(DocumentCreateWizard, self).render_template( return super(DocumentCreateWizard, self).render_template(
@@ -55,6 +51,7 @@ class DocumentCreateWizard(BoundFormWizard):
def process_step(self, request, form, step): def process_step(self, request, form, step):
if isinstance(form, DocumentTypeSelectForm): if isinstance(form, DocumentTypeSelectForm):
self.document_type = form.cleaned_data['document_type'] self.document_type = form.cleaned_data['document_type']
self.initial = {1: {'document_type': self.document_type}}
if isinstance(form, MetadataSelectionForm): if isinstance(form, MetadataSelectionForm):
self.metadata_sets = form.cleaned_data['metadata_sets'] self.metadata_sets = form.cleaned_data['metadata_sets']
@@ -62,7 +59,7 @@ class DocumentCreateWizard(BoundFormWizard):
initial_data = self.generate_metadata_initial_values() initial_data = self.generate_metadata_initial_values()
self.initial = {2: initial_data} self.initial = {2: initial_data}
if not initial_data: if not initial_data:
# If there is no metadata selected end wizard # If there is no metadata selected, finish wizard
self.form_list = [DocumentTypeSelectForm, MetadataSelectionForm] self.form_list = [DocumentTypeSelectForm, MetadataSelectionForm]
if isinstance(form, MetadataFormSet): if isinstance(form, MetadataFormSet):

View File

@@ -1,7 +1,7 @@
from django.contrib import admin from django.contrib import admin
from metadata.models import MetadataType, MetadataSet, MetadataSetItem, \ from metadata.models import MetadataType, MetadataSet, MetadataSetItem, \
DocumentMetadata DocumentMetadata, DocumentTypeDefaults
class MetadataTypeAdmin(admin.ModelAdmin): class MetadataTypeAdmin(admin.ModelAdmin):
@@ -26,5 +26,10 @@ class MetadataSetAdmin(admin.ModelAdmin):
inlines = [MetadataSetItemInline] inlines = [MetadataSetItemInline]
class DocumentTypeDefaultsAdmin(admin.ModelAdmin):
filter_horizontal = ('default_metadata_sets', 'default_metadata')
admin.site.register(MetadataType, MetadataTypeAdmin) admin.site.register(MetadataType, MetadataTypeAdmin)
admin.site.register(MetadataSet, MetadataSetAdmin) admin.site.register(MetadataSet, MetadataSetAdmin)
admin.site.register(DocumentTypeDefaults, DocumentTypeDefaultsAdmin)

View File

@@ -4,7 +4,8 @@ from django.forms.formsets import formset_factory
from metadata.conf.settings import AVAILABLE_MODELS from metadata.conf.settings import AVAILABLE_MODELS
from metadata.conf.settings import AVAILABLE_FUNCTIONS from metadata.conf.settings import AVAILABLE_FUNCTIONS
from metadata.models import MetadataSet, MetadataType from metadata.models import MetadataSet, MetadataType, \
DocumentTypeDefaults
class MetadataForm(forms.Form): class MetadataForm(forms.Form):
@@ -66,6 +67,18 @@ class MetadataRemoveForm(MetadataForm):
class MetadataSelectionForm(forms.Form): class MetadataSelectionForm(forms.Form):
def __init__(self, *args, **kwargs):
#document_type = kwargs.pop('document_type', None)
super(MetadataSelectionForm, self).__init__(*args, **kwargs)
document_type = getattr(self, 'initial', {}).get('document_type', None)
if document_type:
try:
defaults = document_type.documenttypedefaults_set.get()
self.fields['metadata_sets'].initial = defaults.default_metadata_sets.all()
self.fields['metadata_types'].initial = defaults.default_metadata.all()
except DocumentTypeDefaults.DoesNotExist:
pass
metadata_sets = forms.ModelMultipleChoiceField( metadata_sets = forms.ModelMultipleChoiceField(
queryset=MetadataSet.objects.all(), queryset=MetadataSet.objects.all(),
label=_(u'Metadata sets'), label=_(u'Metadata sets'),

View File

@@ -1,7 +1,7 @@
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from documents.models import Document from documents.models import Document, DocumentType
from metadata.conf.settings import AVAILABLE_MODELS from metadata.conf.settings import AVAILABLE_MODELS
from metadata.conf.settings import AVAILABLE_FUNCTIONS from metadata.conf.settings import AVAILABLE_FUNCTIONS
@@ -30,6 +30,9 @@ class MetadataType(models.Model):
class MetadataSet(models.Model): class MetadataSet(models.Model):
"""
Define a group of metadata types
"""
title = models.CharField(max_length=48, verbose_name=_(u'title')) title = models.CharField(max_length=48, verbose_name=_(u'title'))
def __unicode__(self): def __unicode__(self):
@@ -72,3 +75,16 @@ class DocumentMetadata(models.Model):
class Meta: class Meta:
verbose_name = _(u'document metadata') verbose_name = _(u'document metadata')
verbose_name_plural = _(u'document metadata') verbose_name_plural = _(u'document metadata')
class DocumentTypeDefaults(models.Model):
document_type = models.ForeignKey(DocumentType, verbose_name=_(u'document type'))
default_metadata_sets = models.ManyToManyField(MetadataSet, blank=True, verbose_name=_(u'default metadata sets'))
default_metadata = models.ManyToManyField(MetadataType, blank=True, verbose_name=_(u'default metadata'))
def __unicode__(self):
return unicode(self.document_type)
class Meta:
verbose_name = _(u'document type defaults')
verbose_name_plural = _(u'document types defaults')