diff options
author | yann <yann@yann-ubuntu.(none)> | 2011-01-09 01:39:27 +0100 |
---|---|---|
committer | yann <yann@yann-ubuntu.(none)> | 2011-01-09 01:39:27 +0100 |
commit | 7eb6f22ea52ee14af3cda9f4990511616aed3c97 (patch) | |
tree | b6cec68237b9ed994fd07d5285e624fe24c03129 | |
parent | 8ebcc6275905a4cd92dd666eea2b61f42d091f23 (diff) | |
parent | 09ab8db48f245271991b1bdce281033de7275c80 (diff) | |
download | Ishtar-7eb6f22ea52ee14af3cda9f4990511616aed3c97.tar.bz2 Ishtar-7eb6f22ea52ee14af3cda9f4990511616aed3c97.zip |
Merge branch 'master' of ssh://lysithea.proxience.com/home/proxience/git/ishtar
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | ishtar/furnitures/forms.py | 127 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 10 |
3 files changed, 123 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore index 92606cf09..d79b2cf6f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,6 @@ *.pyc *.mo django-simple-history/* -django-merlin/* -communesdefrancedetaillees.csv -projet_données_d_échange_2010.zip +django-formwizard/* ishtar-docs ishtar-logo diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index 924ea8b94..64acaa5c5 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: @@ -169,10 +176,19 @@ class Wizard(NamedUrlSessionFormWizard): value = associated_models[key].objects.get(pk=value) dct[key] = value dct = self.get_extra_model(dct, request, storage, form_list) - obj = self.model(**dct) + obj = self.get_current_object(request, storage) + if obj: + for k in dct: + if k == 'pk': + continue + setattr(obj, k, dct[k]) + else: + obj = self.model(**dct) obj.save() for key, value in m2m: - getattr(obj, key+'s').add(value) + if value not in getattr(obj, key+'s').all(): + 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 @@ -214,8 +230,12 @@ class Wizard(NamedUrlSessionFormWizard): data[ck] = data.pop(key)[0] # get a form key base_key = form.form.base_fields.keys()[0] - total_field = len([key for key in data.keys() + init = self.get_form_initial(request, storage, step) + if not init: + total_field = len([key for key in data.keys() if base_key in key.split('-') and data[key]]) + else: + total_field = len(init) data[step + u'-INITIAL_FORMS'] = unicode(total_field) data[step + u'-TOTAL_FORMS'] = unicode(total_field + 1) data = data or None @@ -250,8 +270,74 @@ class Wizard(NamedUrlSessionFormWizard): return super(Wizard, self).process_post_request(request, storage, *args, **kwargs) + def get_current_object(self, request, storage): + """ + Get the current object for an instancied wizard + """ + current_obj = None + main_form_key = 'selec-' + self.url_name + pk = main_form_key + '-pk' + if storage.prefix in request.session \ + and 'step_data' in request.session[storage.prefix] \ + and main_form_key in request.session[storage.prefix]['step_data'] \ + and pk in request.session[storage.prefix]['step_data']\ + [main_form_key]: + try: + idx = int(request.session[storage.prefix]['step_data'] + [main_form_key][pk]) + current_obj = self.model.objects.get(pk=idx) + except(TypeError, ObjectDoesNotExist): + pass + return current_obj + + def get_form_initial(self, request, storage, step): + current_obj = self.get_current_object(request, storage) + if current_obj: + return self.get_instanced_init(current_obj, request, storage, + step) + return super(Wizard, self).get_form_initial(request, storage, step) + + 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 + + class FileWizard(Wizard): model = models.File + def get_form(self, request, storage, step=None, data=None, files=None): """ Manage formset @@ -297,7 +383,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 @@ -318,9 +404,11 @@ class FileWizard(Wizard): dct['operation'] = None if 'DELETE' in dct: dct.pop('DELETE') - dct['history_modifier'] = request.user - parcel = models.Parcel(**dct) - parcel.save() + parcel = models.Parcel.objects.filter(**dct).count() + if not parcel: + dct['history_modifier'] = request.user + parcel = models.Parcel(**dct) + parcel.save() return res def get_now(): @@ -330,7 +418,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 +434,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,10 +445,22 @@ 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") + associated_models = {'town':models.Town} total_surface = forms.IntegerField(label=_("Total surface")) - address = forms.CharField(label=_(u"Address"), widget=forms.Textarea) + address = forms.CharField(label=_(u"Main address"), widget=forms.Textarea) + address_complement = forms.CharField(label=_(u"Main address - complement")) + postal_code = forms.CharField(label=_(u"Main address - postal code"), + max_length=10) class TownForm(forms.Form): form_label = _("Towns") @@ -482,7 +585,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..6664adb72 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -245,7 +245,11 @@ class File(BaseHistorizedItem, OwnPerms): total_surface = models.IntegerField(_(u"Total surface")) total_developed_surface = models.IntegerField(_(u"Total developed surface"), blank=True, null=True) - address = models.TextField(_(u"Address")) + address = models.TextField(_(u"Main address"), null=True, blank=True) + address_complement = models.TextField(_(u"Main address - complement"), + null=True, blank=True) + postal_code = models.CharField(_(u"Main address - postal code"), + max_length=10, null=True, blank=True) comment = models.TextField(_(u"Comment")) history = HistoricalRecords() @@ -310,8 +314,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"), |