diff options
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 |
commit | c5c6c90d0fed8ab83bafecb8ea80288286f8ca85 (patch) | |
tree | 0205a3845dd01ac97300c4d32da720eaf996cc3f | |
parent | e87f791d0fa450da71ead7148437ba95151c8eeb (diff) | |
download | Ishtar-c5c6c90d0fed8ab83bafecb8ea80288286f8ca85.tar.bz2 Ishtar-c5c6c90d0fed8ab83bafecb8ea80288286f8ca85.zip |
Manage instanciation of wizard (refs #51)
-rw-r--r-- | ishtar/furnitures/forms.py | 67 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 4 |
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"), |