diff options
-rw-r--r-- | ishtar/furnitures/forms.py | 160 | ||||
-rw-r--r-- | ishtar/furnitures/menus.py | 39 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 23 | ||||
-rw-r--r-- | ishtar/furnitures/urls.py | 6 | ||||
-rw-r--r-- | ishtar/furnitures/views.py | 2 | ||||
-rw-r--r-- | ishtar/locale/fr/LC_MESSAGES/django.po | 13 |
6 files changed, 203 insertions, 40 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index c79d70346..0cd704f53 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -260,14 +260,57 @@ class Wizard(NamedUrlSessionFormWizard): def save_model(self, dct, m2m, request, storage, form_list, return_object): dct = self.get_extra_model(dct, request, storage, form_list) obj = self.get_current_saved_object(request, storage) + + # manage dependant items + other_objs = {} + for k in dct.keys(): + if '__' not in k: + continue + vals = k.split('__') + assert len(vals) == 2, "Only one level of dependant item is managed" + dependant_item, key = vals + if dependant_item not in other_objs: + other_objs[dependant_item] = {} + other_objs[dependant_item][key] = dct.pop(k) if obj: for k in dct: if k.startswith('pk'): continue setattr(obj, k, dct[k]) + for dependant_item in other_objs: + c_item = getattr(obj, dependant_item) + if c_item: + # to check # + for k in other_objs[dependant_item]: + setattr(c_item, k, other_objs[dependant_item][k]) + c_item.save() + else: + m = getattr(self.model, dependant_item) + if hasattr(m, 'related'): + c_item = m.related.model(**other_objs[dependant_item]) + setattr(obj, dependant_item, c_item) + obj.save() + obj.save() else: + adds = {} + for dependant_item in other_objs: + m = getattr(self.model, dependant_item) + model = m.field.rel.to + c_dct = other_objs[dependant_item].copy() + if hasattr(model, 'history'): + c_dct['history_modifier'] = request.user + c_item = model(**c_dct) + c_item.save() + if hasattr(m, 'through'): + adds[dependant_item] = c_item + elif hasattr(m, 'field'): + dct[dependant_item] = c_item + if 'pk' in dct: + dct.pop('pk') obj = self.get_saved_model()(**dct) - obj.save() + obj.save() + for k in adds: + getattr(obj, k).add(adds[k]) m2m_items = {} for key, value in m2m: if key not in m2m_items: @@ -412,7 +455,7 @@ class Wizard(NamedUrlSessionFormWizard): idx = int(self.session_get_value(request, storage, main_form_key, 'pk')) current_obj = self.model.objects.get(pk=idx) - except(TypeError, ObjectDoesNotExist): + except(TypeError, ValueError, ObjectDoesNotExist): pass return current_obj @@ -456,15 +499,23 @@ class Wizard(NamedUrlSessionFormWizard): request.session[obj.__class__.__name__.lower()] = unicode(obj.pk) initial = {} if hasattr(c_form, 'base_fields'): - for field in c_form.base_fields.keys(): - if hasattr(obj, field): - value = getattr(obj, field) - if hasattr(value, 'pk'): - value = value.pk - if value in (True, False): - initial[field] = value - elif value != None: - initial[field] = unicode(value) + for base_field in c_form.base_fields.keys(): + fields = base_field.split('__') + value = obj + for field in fields: + if not hasattr(value, field) or \ + getattr(value, field) == None: + value = obj + break + value = getattr(value, field) + if value == obj: + continue + if hasattr(value, 'pk'): + value = value.pk + if value in (True, False): + initial[base_field] = value + elif value != None: + initial[base_field] = unicode(value) elif hasattr(c_form, 'management_form'): initial = [] key = current_step.split('-')[0] @@ -1768,7 +1819,7 @@ class RecordFormGeneral(forms.Form): ) class DatingForm(forms.Form): - form_label = _("Datings") + form_label = _("Dating") base_model = 'dating' associated_models = {'dating_type':models.DatingType, 'quality':models.DatingQuality, @@ -1849,3 +1900,88 @@ record_deletion_wizard = RecordDeletionWizard([ ('final-record_deletion', RecordDeletionForm)], url_name='record_deletion',) +class ItemWizard(Wizard): + model = models.Item + + def get_extra_model(self, dct, request, storage, form_list): + dct = super(ItemWizard, self).get_extra_model(dct, request, storage, + form_list) + dct['order'] = 1 + if 'pk' in dct and type(dct['pk']) == models.ContextRecord: + dct['base_items__context_record'] = dct.pop('pk') + return dct + +class ItemFormBase(forms.Form): + form_label = _("Base item") + base_model = 'base_items' + base_items__label = forms.CharField(label=_(u"General label"), + validators=[validators.MaxLengthValidator(60)]) + base_items__description = forms.CharField(label=_("General description"), + widget=forms.Textarea) + base_items__is_isolated = forms.NullBooleanField(label=_(u"Is isolated?"), + required=False) + +class ItemForm(forms.Form): + form_label = _("Item") + associated_models = {'material_type':models.MaterialType,} + label = forms.CharField(label=_(u"Label"), + validators=[validators.MaxLengthValidator(60)]) + description = forms.CharField(label=_("Precise description"), + widget=forms.Textarea) + material_type = forms.ChoiceField(label=_("Material type"), + choices=models.MaterialType.get_types()) + volume = forms.IntegerField(label=_(u"Volume")) + weight = forms.IntegerField(label=_(u"Weight")) + item_number = forms.IntegerField(label=_(u"Item number")) + +class DateForm(forms.Form): + form_label = _("Dating") + base_model = 'dating' + associated_models = {'dating__dating_type':models.DatingType, + 'dating__quality':models.DatingQuality, + 'dating__period':models.Period} + dating__period = forms.ChoiceField(label=_("Period"), + choices=models.Period.get_types()) + dating__start_date = forms.IntegerField(label=_(u"Start date")) + dating__end_date = forms.IntegerField(label=_(u"End date")) + dating__dating_type = forms.ChoiceField(label=_("Dating type"), + choices=models.DatingType.get_types()) + dating__quality = forms.ChoiceField(label=_("Quality"), + choices=models.DatingQuality.get_types()) + +item_creation_wizard = ItemWizard([ + ('selecrecord-item_creation', RecordFormSelection), + ('base_item-record_creation', ItemFormBase), + ('item-item_creation', ItemForm), + ('dating-item_creation', DateForm), + ('final-item_creation', FinalForm)], + url_name='item_creation',) + +class ItemSelect(forms.Form): + base_items__context_record__parcel__town = forms.IntegerField( + widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \ + 'autocomplete-town', associated_model=models.Town), + validators=[models.valid_id(models.Town)], label=_(u"Town")) + base_items__context_record__parcel__year = forms.IntegerField( + label=_("Year")) + material_type = forms.ChoiceField( + label=_("Material type"), choices=models.MaterialType.get_types()) + dating__period = forms.ChoiceField( + label=_("Period"), choices=models.Period.get_types()) + +class ItemFormSelection(forms.Form): + form_label = _("Item") + associated_models = {'pk':models.Item} + currents = {'pk':models.Item} + pk = forms.IntegerField(label="", required=False, + widget=widgets.JQueryJqGrid(reverse_lazy('get-item'), + ItemSelect(), models.Item), + validators=[models.valid_id(models.Item)]) + +item_modification_wizard = ItemWizard([ + ('selec-item_modification', ItemFormSelection), + ('item-item_modification', ItemForm), + ('dating-item_modification', DateForm), + ('final-item_modification', FinalForm)], + url_name='item_modification',) + diff --git a/ishtar/furnitures/menus.py b/ishtar/furnitures/menus.py index 5f77f2507..5b47b6327 100644 --- a/ishtar/furnitures/menus.py +++ b/ishtar/furnitures/menus.py @@ -169,20 +169,31 @@ class Menu: ],), ]), SectionItem('record_management', _(u"Context record management"), - childs=[ - MenuItem('record_creation', _(u"Creation"), - model=models.ContextRecord, - access_controls=['add_contextrecord', - 'add_own_contextrecord']), - MenuItem('record_modification', _(u"Modification"), - model=models.ContextRecord, - access_controls=['change_contextrecord', - 'change_own_contextrecord']), - MenuItem('record_deletion', _(u"Deletion"), - model=models.ContextRecord, - access_controls=['delete_contextrecord', - 'delete_own_contextrecord']), - ]) + childs=[ + MenuItem('record_creation', _(u"Creation"), + model=models.ContextRecord, + access_controls=['add_contextrecord', + 'add_own_contextrecord']), + MenuItem('record_modification', _(u"Modification"), + model=models.ContextRecord, + access_controls=['change_contextrecord', + 'change_own_contextrecord']), + MenuItem('record_deletion', _(u"Deletion"), + model=models.ContextRecord, + access_controls=['delete_contextrecord', + 'delete_own_contextrecord']), + ]), + SectionItem('item_management', _(u"Item management"), + childs=[ + MenuItem('item_creation', _(u"Creation"), + model=models.Item, + access_controls=['add_item', + 'add_own_item']), + MenuItem('item_modification', _(u"Modification"), + model=models.Item, + access_controls=['change_item', + 'change_own_item']), + ]), ] self.items = {} diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 2aa78cf23..6afdee470 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -135,8 +135,10 @@ class GeneralType(models.Model): def _get_childs(cls, item, dct, prefix=""): prefix += "› " dct['parent'] = item - childs = cls.objects.filter(**dct).order_by('order').all() - for child in childs: + childs = cls.objects.filter(**dct) + if hasattr(cls, 'order'): + childs = childs.order_by('order') + for child in childs.all(): yield (child.pk, SafeUnicode(prefix + \ unicode(_(unicode(child))) )) for sub_child in cls._get_childs(child, dct, prefix): @@ -147,8 +149,10 @@ class GeneralType(models.Model): dct['available'] = True yield ('', '--') dct['parent'] = None - items = cls.objects.filter(**dct).order_by('order').all() - for item in items: + items = cls.objects.filter(**dct) + if hasattr(cls, 'order'): + items = items.order_by('order') + for item in items.all(): yield (item.pk, unicode(item)) for child in cls._get_childs(item, dct): yield child @@ -641,7 +645,8 @@ class BaseItem(BaseHistorizedItem, OwnPerms): description = models.TextField(_(u"Description")) context_record = models.ForeignKey(ContextRecord, verbose_name=_(u"Context Record")) - is_isolated = models.BooleanField(_(u"Is isolated?")) + is_isolated = models.NullBooleanField(_(u"Is isolated?"), blank=True, + null=True) documentations = models.ManyToManyField(Source) history = HistoricalRecords() @@ -659,7 +664,9 @@ class BaseItem(BaseHistorizedItem, OwnPerms): return self.label class Item(BaseHistorizedItem, OwnPerms): - base_items = models.ManyToManyField(BaseItem, verbose_name=_(u"Base item")) + TABLE_COLS = ['label', 'dating.period', 'material_type',] + base_items = models.ManyToManyField(BaseItem, verbose_name=_(u"Base item"), + related_name='item') order = models.IntegerField(_(u"Order")) label = models.CharField(_(u"Label"), max_length=60) description = models.TextField(_(u"Description")) @@ -668,9 +675,9 @@ class Item(BaseHistorizedItem, OwnPerms): volume = models.FloatField(_(u"Volume")) weight = models.IntegerField(_(u"Weight")) item_number = models.IntegerField(_("Item number")) - upstream_treatment = models.ForeignKey("Treatment", + upstream_treatment = models.ForeignKey("Treatment", blank=True, null=True, related_name='downstream_treatment', verbose_name=_("Upstream treatment")) - downstream_treatment = models.ForeignKey("Treatment", + downstream_treatment = models.ForeignKey("Treatment", blank=True, null=True, related_name='upstream_treatment', verbose_name=_("Downstream treatment")) dating = models.ForeignKey(Dating, verbose_name=_(u"Dating")) history = HistoricalRecords() diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py index 5a72a1182..5e28d6fed 100644 --- a/ishtar/furnitures/urls.py +++ b/ishtar/furnitures/urls.py @@ -69,6 +69,10 @@ urlpatterns = patterns('', ishtar_forms.record_modification_wizard, name='record_modification'), url(BASE_URL + r'record_deletion/(?P<step>.+)$', ishtar_forms.record_deletion_wizard, name='record_deletion'), + url(BASE_URL + r'item_creation/(?P<step>.+)$', + ishtar_forms.item_creation_wizard, name='item_creation'), + url(BASE_URL + r'item_modification/(?P<step>.+)$', + ishtar_forms.item_modification_wizard, name='item_modification'), ) for section in menu.childs: for menu_item in section.childs: @@ -111,4 +115,6 @@ urlpatterns += patterns('ishtar.furnitures.views', 'get_administrativeact', name='get-administrativeact'), url(BASE_URL + r'get-contextrecord/(?P<type>.+)?$', 'get_contextrecord', name='get-contextrecord'), + url(BASE_URL + r'get-item/(?P<type>.+)?$', 'get_archaeologicalitem', + name='get-item'), ) diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py index 43d5a46e2..39c6bb66c 100644 --- a/ishtar/furnitures/views.py +++ b/ishtar/furnitures/views.py @@ -381,6 +381,8 @@ get_contextrecord = get_item(models.ContextRecord, 'get_contextrecord', 'contextrecord', extra_request_keys={'parcel__town':'parcel__town__pk', }) +get_archaeologicalitem = get_item(models.Item, + 'get_archaeologicalitem', 'item',) def action(request, action_slug, obj_id=None, *args, **kwargs): """ diff --git a/ishtar/locale/fr/LC_MESSAGES/django.po b/ishtar/locale/fr/LC_MESSAGES/django.po index d4063a30a..22faada97 100644 --- a/ishtar/locale/fr/LC_MESSAGES/django.po +++ b/ishtar/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: alpha\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-03-19 00:12+0100\n" +"POT-Creation-Date: 2011-03-19 00:30+0100\n" "PO-Revision-Date: 2010-12-09\n" "Last-Translator: Étienne Loks <etienne.loks at peacefrogs net>\n" "Language-Team: \n" @@ -884,8 +884,9 @@ msgstr "Une courte description de la situation de l'Unité d'Enregistrement" msgid "" "\"Terminus Ante Quem\" the context record can't have been created after this " "date" -msgstr "« Terminus Ante Quem » l'Unité d'Enregistrement ne peut avoir été crée " -"après cette date" +msgstr "" +"« Terminus Ante Quem » l'Unité d'Enregistrement ne peut avoir été crée après " +"cette date" #: furnitures/models.py:597 msgid "Estimation of a \"Terminus Ante Quem\"" @@ -895,8 +896,9 @@ msgstr "Estimation d'un « Terminus Ante Quem »" msgid "" "\"Terminus Post Quem\" the context record can't have been created before " "this date" -msgstr "« Terminus Post Quem » l'Unité d'Enregistrement ne peut avoir été crée " -"avant cette date" +msgstr "" +"« Terminus Post Quem » l'Unité d'Enregistrement ne peut avoir été crée avant " +"cette date" #: furnitures/models.py:602 msgid "Estimation of a \"Terminus Post Quem\"" @@ -1643,4 +1645,3 @@ msgid "You are now registered. Activation email sent." msgstr "" "Vous être maintenant enregistré. Un courriel d'activation de votre compte " "vous a été envoyé." - |