summaryrefslogtreecommitdiff
path: root/ishtar/furnitures/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar/furnitures/forms.py')
-rw-r--r--ishtar/furnitures/forms.py160
1 files changed, 148 insertions, 12 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',)
+