summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ishtar/furnitures/forms.py77
-rw-r--r--ishtar/furnitures/models.py3
2 files changed, 65 insertions, 15 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index e3a982771..b59829784 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -201,18 +201,36 @@ class Wizard(NamedUrlSessionFormWizard):
associated_models = hasattr(base_form, 'associated_models') and \
base_form.associated_models or {}
if hasattr(form, 'forms'):
+ multi = False
+ if form.forms:
+ frm = form.forms[0]
+ fields = frm.fields.copy()
+ if 'DELETE' in fields:
+ fields.pop('DELETE')
+ multi = len(fields) > 1
+ if multi:
+ assert hasattr(frm, 'base_model'), \
+ u"Must define a base_model for " + unicode(frm.__class__)
for frm in form.forms:
if not frm.is_valid():
continue
- for key in frm.cleaned_data:
- if key not in associated_models:
- # datas not managed
+ vals = {}
+ if "DELETE" in frm.cleaned_data:
+ if frm.cleaned_data["DELETE"]:
continue
+ frm.cleaned_data.pop('DELETE')
+ for key in frm.cleaned_data:
value = frm.cleaned_data[key]
if not value and value != False:
continue
- value = associated_models[key].objects.get(pk=value)
- m2m.append((key, value))
+ if key in associated_models:
+ value = associated_models[key].objects.get(pk=value)
+ if multi:
+ vals[key] = value
+ else:
+ m2m.append((key, value))
+ if multi and vals:
+ m2m.append((frm.base_model, vals))
elif type(form.cleaned_data) == dict:
for key in form.cleaned_data:
if key.startswith('hidden_'):
@@ -250,8 +268,24 @@ class Wizard(NamedUrlSessionFormWizard):
else:
obj = self.get_saved_model()(**dct)
obj.save()
+ m2m_items = {}
for key, value in m2m:
- if value not in getattr(obj, key+'s').all():
+ if key not in m2m_items:
+ getattr(obj, key+'s').clear()
+ if type(key) == dict:
+ vals = []
+ for item in getattr(obj, key+'s').all():
+ v = {}
+ for k in value.keys():
+ v[k] = getattr(item, k)
+ vals.append(v)
+ m2m_items[key] = vals
+ else:
+ m2m_items[key] = getattr(obj, key+'s').all()
+ if value not in m2m_items[key]:
+ if type(value) == dict:
+ value = getattr(obj, key+'s').model.objects.create(**value)
+ value.save()
getattr(obj, key+'s').add(value)
obj.save()
res = render_to_response('wizard_done.html', {},
@@ -1607,7 +1641,7 @@ class RecordWizard(Wizard):
form = self.get_form_list(request, storage)[step]
current_object = self.get_current_object(request, storage)
if step.startswith('general-') and current_object:
- data['operation'] = current_object
+ data[self.model._meta.object_name] = current_object
form = super(RecordWizard, self).get_form(request, storage, step, data,
files)
return form
@@ -1616,14 +1650,19 @@ class RecordWizard(Wizard):
return models.ContextRecord
def get_current_saved_object(self, request, storage):
- return None
+ """
+ Permit a distinguo when saved model is not the base selected model
+ """
+ if self.model == models.Operation:
+ return None
+ return self.get_current_object(request, storage)
def save_model(self, dct, m2m, request, storage, form_list, return_object):
if 'pk' in dct:
dct.pop('pk')
return super(RecordWizard, self).save_model(dct, m2m, request, storage,
form_list, return_object)
-
+ """
def done(self, request, storage, form_list, **kwargs):
'''
Save datings
@@ -1670,6 +1709,9 @@ class RecordWizard(Wizard):
dating.save()
obj.datings.add(dating)
return res
+"""
+class RecordModifWizard(RecordWizard):
+ model = models.ContextRecord
class RecordSelect(forms.Form):
parcel__town = forms.IntegerField(label=_(u"Town"),
@@ -1715,8 +1757,11 @@ class RecordFormGeneral(forms.Form):
def __init__(self, *args, **kwargs):
operation = None
if 'data' in kwargs and kwargs['data'] and \
- 'operation' in kwargs['data']:
- operation = kwargs['data']['operation']
+ ('Operation' in kwargs['data'] or 'ContextRecord' in kwargs['data']):
+ if 'Operation' in kwargs['data']:
+ operation = kwargs['data']['Operation']
+ if 'ContextRecord' in kwargs['data']:
+ operation = kwargs['data']['ContextRecord'].parcel.operation
# clean data if not "real" data
prefix_value = kwargs['prefix']
if not [k for k in kwargs['data'].keys()
@@ -1737,6 +1782,10 @@ class RecordFormGeneral(forms.Form):
class DatingForm(forms.Form):
form_label = _("Datings")
+ base_model = 'dating'
+ associated_models = {'dating_type':models.DatingType,
+ 'quality':models.DatingQuality,
+ 'period':models.Period}
period = forms.ChoiceField(label=_("Period"),
choices=models.Period.get_types())
start_date = forms.IntegerField(label=_(u"Start date"))
@@ -1766,8 +1815,8 @@ UnitFormSet.form_label = _("Unit")
class RecordFormInterpretation(forms.Form):
form_label = _("Interpretation")
- associated_models = {'parcel':models.Parcel,}
- has_furniture = forms.BooleanField(label=_(u"Has furniture?"))
+ has_furniture = forms.NullBooleanField(label=_(u"Has furniture?"),
+ required=False)
filling = forms.CharField(label=_(u"Filling"),
widget=forms.Textarea, required=False)
interpretation = forms.CharField(label=_(u"Interpretation"),
@@ -1788,7 +1837,7 @@ record_creation_wizard = RecordWizard([
('final-record_creation', FinalForm)],
url_name='record_creation',)
-record_modification_wizard = RecordWizard([
+record_modification_wizard = RecordModifWizard([
('selec-record_modification', RecordFormSelection),
('general-record_modification', RecordFormGeneral),
('datings-record_modification', DatingFormSet),
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py
index 78507f971..e93b74612 100644
--- a/ishtar/furnitures/models.py
+++ b/ishtar/furnitures/models.py
@@ -578,7 +578,8 @@ class ContextRecord(BaseHistorizedItem, OwnPerms):
help_text=_(u"A short description of the location of the context record"))
datings = models.ManyToManyField(Dating)
units = models.ManyToManyField(Unit)
- has_furniture = models.BooleanField(u"Has furniture?")
+ has_furniture = models.NullBooleanField(u"Has furniture?", blank=True,
+ null=True)
filling = models.TextField(_(u"Filling"), blank=True, null=True)
interpretation = models.TextField(_(u"Interpretation"), blank=True,
null=True)