summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryann <yann@yann-ubuntu.(none)>2011-01-09 01:39:27 +0100
committeryann <yann@yann-ubuntu.(none)>2011-01-09 01:39:27 +0100
commit7eb6f22ea52ee14af3cda9f4990511616aed3c97 (patch)
treeb6cec68237b9ed994fd07d5285e624fe24c03129
parent8ebcc6275905a4cd92dd666eea2b61f42d091f23 (diff)
parent09ab8db48f245271991b1bdce281033de7275c80 (diff)
downloadIshtar-7eb6f22ea52ee14af3cda9f4990511616aed3c97.tar.bz2
Ishtar-7eb6f22ea52ee14af3cda9f4990511616aed3c97.zip
Merge branch 'master' of ssh://lysithea.proxience.com/home/proxience/git/ishtar
-rw-r--r--.gitignore4
-rw-r--r--ishtar/furnitures/forms.py127
-rw-r--r--ishtar/furnitures/models.py10
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"),