diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-03-21 01:23:11 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-03-21 01:23:11 +0100 | 
| commit | 13aaa16597b159f076d6065a7e3c6b9cf4f4ba85 (patch) | |
| tree | f12fbadffc066239c1dcdec466bae9ccddc3c367 | |
| parent | 7bd98eaa04e71b48465fe3ddaa643602dde316bf (diff) | |
| download | Ishtar-13aaa16597b159f076d6065a7e3c6b9cf4f4ba85.tar.bz2 Ishtar-13aaa16597b159f076d6065a7e3c6b9cf4f4ba85.zip | |
Create and modify items (refs #290)
| -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é." - | 
