summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2011-01-08 23:24:13 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2011-01-08 23:24:13 +0100
commitc5c6c90d0fed8ab83bafecb8ea80288286f8ca85 (patch)
tree0205a3845dd01ac97300c4d32da720eaf996cc3f
parente87f791d0fa450da71ead7148437ba95151c8eeb (diff)
downloadIshtar-c5c6c90d0fed8ab83bafecb8ea80288286f8ca85.tar.bz2
Ishtar-c5c6c90d0fed8ab83bafecb8ea80288286f8ca85.zip
Manage instanciation of wizard (refs #51)
-rw-r--r--ishtar/furnitures/forms.py67
-rw-r--r--ishtar/furnitures/models.py4
2 files changed, 64 insertions, 7 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index 924ea8b94..8296175af 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -55,6 +55,13 @@ class FormSet(BaseFormSet):
class Wizard(NamedUrlSessionFormWizard):
model = None
+
+ def get_wizard_name(self):
+ """
+ As the class name can interfere when reused, use the url_name
+ """
+ return self.url_name
+
def get_template(self, request, storage):
templates = ['default_wizard.html']
current_step = storage.get_current_step() or self.get_first_step(
@@ -155,11 +162,11 @@ class Wizard(NamedUrlSessionFormWizard):
for frm in form.forms:
if not frm.is_valid():
continue
- for key in frm:
+ for key in frm.cleaned_data:
if key not in associated_models:
# datas not managed
continue
- value = frm[key]
+ value = frm.cleaned_data[key]
value = associated_models[key].objects.get(pk=value)
m2m.append((key, value))
elif type(form.cleaned_data) == dict:
@@ -173,6 +180,7 @@ class Wizard(NamedUrlSessionFormWizard):
obj.save()
for key, value in m2m:
getattr(obj, key+'s').add(value)
+ obj.save()
res = render_to_response('wizard_done.html', {},
context_instance=RequestContext(request))
return return_object and (obj, res) or res
@@ -252,6 +260,44 @@ class Wizard(NamedUrlSessionFormWizard):
class FileWizard(Wizard):
model = models.File
+
+ def get_instanced_init(self, obj, request, storage, step):
+ """
+ Get initial data from an init
+ """
+ current_step = storage.get_current_step() or self.get_first_step(
+ request, storage)
+ c_form = self.form_list[current_step]
+ 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
+ initial[field] = unicode(value)
+ elif hasattr(c_form, 'management_form'):
+ initial = []
+ key = current_step.split('-')[0]
+ if not hasattr(obj, key):
+ return initial
+ for child_obj in getattr(obj, key).all():
+ vals = {}
+ keys = c_form.form.base_fields.keys()
+ if len(keys) == 1:
+ # only one field: must be the id of the object
+ vals[keys[0]] = unicode(child_obj.pk)
+ else:
+ for field in keys:
+ if hasattr(child_obj, field):
+ value = getattr(child_obj, field)
+ if hasattr(value, 'pk'):
+ value = value.pk
+ vals[field] = unicode(value)
+ if vals:
+ initial.append(vals)
+ return initial
+
def get_form(self, request, storage, step=None, data=None, files=None):
"""
Manage formset
@@ -297,7 +343,7 @@ class FileWizard(Wizard):
Save parcels
'''
r = super(FileWizard, self).done(request, storage, form_list,
- return_object=True, **kwargs)
+ return_object=True, **kwargs)
if type(r) not in (list, tuple) or len(r) != 2:
return r
obj, res = r
@@ -330,7 +376,8 @@ def get_now():
class FileFormSelection(forms.Form):
form_label = _("Archaelogical file")
- archaelogical_file = forms.IntegerField(label=_("Archaelogical file"),
+ associated_models = {'pk':models.File}
+ pk = forms.IntegerField(label=_("Archaelogical file"),
widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'),
associated_model=models.File),
validators=[models.valid_id(models.File)])
@@ -345,6 +392,8 @@ class FileFormGeneral(forms.Form):
validators=[models.valid_id(models.Person)])
year = forms.IntegerField(label=_("Year"),
initial=lambda:datetime.datetime.now().year)
+ numeric_reference = forms.IntegerField(label=_("Numeric reference"),
+ widget=forms.HiddenInput, required=False)
internal_reference = forms.CharField(label=_(u"Internal reference"),
max_length=60, validators=[models.is_unique(models.File, 'internal_reference')])
creation_date = forms.DateField(label=_(u"Creation date"),
@@ -354,6 +403,14 @@ max_length=60, validators=[models.is_unique(models.File, 'internal_reference')])
comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea,
required=False)
+class FileFormGeneralRO(FileFormGeneral):
+ year = forms.IntegerField(label=_("Year"),
+ widget=forms.TextInput(attrs={'readonly':True}))
+ numeric_reference = forms.IntegerField(label=_("Numeric reference"),
+ widget=forms.TextInput(attrs={'readonly':True}))
+ internal_reference = forms.CharField(label=_(u"Internal reference"),
+ widget=forms.TextInput(attrs={'readonly':True}))
+
class FileFormAddress(forms.Form):
form_label = _("Address")
total_surface = forms.IntegerField(label=_("Total surface"))
@@ -482,7 +539,7 @@ file_creation_wizard = FileWizard([
file_modification_wizard = FileWizard([
('selec-file_modification', FileFormSelection),
- ('general-file_modification', FileFormGeneral),
+ ('general-file_modification', FileFormGeneralRO),
('adress-file_modification', FileFormAddress),
('towns-file_modification', TownFormSet),
('parcels-file_modification', ParcelFormSet),
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py
index e75eb9b51..5a8a76fba 100644
--- a/ishtar/furnitures/models.py
+++ b/ishtar/furnitures/models.py
@@ -310,8 +310,8 @@ class Operation(BaseHistorizedItem, OwnPerms):
class Parcel(LightHistorizedItem) :
- associated_file = models.ForeignKey(File, related_name='parcel', blank=True,
- null=True, verbose_name=_(u"File"))
+ associated_file = models.ForeignKey(File, related_name='parcels',
+ blank=True, null=True, verbose_name=_(u"File"))
operation = models.ForeignKey(Operation, related_name='parcel', blank=True,
null=True, verbose_name=_(u"Operation"))
year = models.IntegerField(_(u"Year"),