diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-07-01 12:21:07 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-07-01 12:21:07 +0200 |
commit | 415c9e56882b1ab78afed0376ce643dc079ea0b8 (patch) | |
tree | adc16794a6ffd669e3ea5922a8979269858d46de | |
parent | 0edc29b720541ba265b98e7df8c943f5cebc617e (diff) | |
download | Ishtar-415c9e56882b1ab78afed0376ce643dc079ea0b8.tar.bz2 Ishtar-415c9e56882b1ab78afed0376ce643dc079ea0b8.zip |
Treatments: manage conditional forms
-rw-r--r-- | archaeological_finds/forms.py | 75 | ||||
-rw-r--r-- | archaeological_finds/models.py | 21 | ||||
-rw-r--r-- | archaeological_finds/views.py | 22 |
3 files changed, 97 insertions, 21 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 9fdf2ddf2..997773761 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -283,6 +283,58 @@ class FindMultipleFormSelection(forms.Form): return self.cleaned_data +def check_exist(form_name, key): + def func(self): + request = self.request + storage = self.storage + if storage.prefix not in request.session or \ + 'step_data' not in request.session[storage.prefix] or \ + form_name not in request.session[storage.prefix]['step_data'] or\ + form_name + '-' + key not in \ + request.session[storage.prefix]['step_data'][form_name]: + return False + try: + val = request.session[storage.prefix][ + 'step_data'][form_name][form_name + '-' + key] + if val and len(val) > 0: + val = val[0] + return bool(val) + except ValueError: + return False + return func + + +def check_not_exist(form_name, key): + def func(self): + return not check_exist(form_name, key)(self) + return func + + +def check_type_field(form_name, key, model, field): + def func(self): + request = self.request + storage = self.storage + if storage.prefix not in request.session or \ + 'step_data' not in request.session[storage.prefix] or \ + form_name not in request.session[storage.prefix]['step_data'] or\ + form_name + '-' + key not in \ + request.session[storage.prefix]['step_data'][form_name]: + return False + try: + val = model.objects.get(pk=request.session[storage.prefix][ + 'step_data'][form_name][form_name + '-' + key][0]) + return bool(getattr(val, field)) + except (ValueError, model.DoesNotExist): + return False + return func + + +def check_type_not_field(form_name, key, model, field): + def func(self): + return not check_type_field(form_name, key, model, field)(self) + return func + + def check_treatment(form_name, type_key, type_list=[], not_type_list=[]): type_list = [models.TreatmentType.objects.get(txt_idx=tpe).pk for tpe in type_list] @@ -299,8 +351,8 @@ def check_treatment(form_name, type_key, type_list=[], not_type_list=[]): request.session[storage.prefix]['step_data'][form_name]: return False try: - tpe = request.session[storage.prefix]['step_data']\ - [form_name][form_name + '-' + type_key] + tpe = request.session[storage.prefix][ + 'step_data'][form_name][form_name + '-' + type_key] if not tpe: return False type = int(tpe[0]) @@ -342,6 +394,10 @@ class FindDeletionForm(FinalForm): class UpstreamFindFormSelection(FindFormSelection): form_label = _(u"Upstream find") + def __init__(self, *args, **kwargs): + super(UpstreamFindFormSelection, self).__init__(*args, **kwargs) + self.fields['pk'].required = True + ############################################# # Source management for archaelogical finds # ############################################# @@ -482,6 +538,21 @@ class BaseTreatmentForm(SelectFindBasketForm): exclude=['packaging']) self.fields['treatment_type'].help_text = \ models.TreatmentType.get_help(exclude=['packaging']) + self.fields['basket'].required = False + self.fields['basket'].help_text = \ + _(u"Leave it blank if you want to select a single item") + + def clean(self, *args, **kwargs): + try: + treatment = models.TreatmentType.objects.get( + pk=self.cleaned_data['treatment_type'], available=True) + except models.TreatmentType.DoesNotExist: + raise forms.ValidationError(_(u"This treatment type is not " + u"available.")) + if treatment.upstream_is_many and \ + not self.cleaned_data.get('basket'): + raise forms.ValidationError(_(u"This treatment needs a basket.")) + return self.cleaned_data """ #################################### diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index 65d30f37a..f6483e989 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -613,10 +613,16 @@ class FindSource(Source): class TreatmentType(GeneralType): virtual = models.BooleanField(_(u"Virtual")) - upstream_is_many = models.BooleanField(_(u"Upstream is many"), - default=False) - downstream_is_many = models.BooleanField(_(u"Downstream is many"), - default=False) + upstream_is_many = models.BooleanField( + _(u"Upstream is many"), default=False, + help_text=_( + u"Check this if for this treatment from many finds you'll get " + u"one.")) + downstream_is_many = models.BooleanField( + _(u"Downstream is many"), default=False, + help_text=_( + u"Check this if for this treatment from one find you'll get " + u"many.")) class Meta: verbose_name = _(u"Treatment type") @@ -633,8 +639,11 @@ class Treatment(BaseHistorizedItem, OwnPerms): comment = models.TextField(_(u"Comment"), blank=True, null=True) treatment_type = models.ForeignKey(TreatmentType, verbose_name=_(u"Treatment type")) - location = models.ForeignKey(Warehouse, verbose_name=_(u"Location"), - blank=True, null=True) + location = models.ForeignKey( + Warehouse, verbose_name=_(u"Location"), blank=True, null=True, + help_text=_( + u"Location where the treatment is done. Target warehouse for " + u"a move.")) other_location = models.CharField(_(u"Other location"), max_length=200, blank=True, null=True) person = models.ForeignKey( diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index e55291a76..8bae9785c 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -319,26 +319,22 @@ class DeleteFindBasketView(IshtarMixin, LoginRequiredMixin, FormView): treatment_creation_wizard = TreatmentWizard.as_view([ ('basetreatment-treatment_creation', BaseTreatmentForm), - # ('selecfind-treatment_creation', UpstreamFindFormSelection), - ('multiselecfinds-treatment_creation', FindMultipleFormSelection), + ('selecfind-treatment_creation', UpstreamFindFormSelection), ('resultfind-treatment_creation', ResultFindForm), ('resultfinds-treatment_creation', ResultFindFormSet), ('final-treatment_creation', FinalForm)], condition_dict={ 'selecfind-treatment_creation': - check_treatment('basetreatment-treatment_creation', - 'treatment_type', not_type_list=[ - 'physical_grouping', 'packaging']), - 'multiselecfinds-treatment_creation': - check_treatment('basetreatment-treatment_creation', - 'treatment_type', ['physical_grouping', - 'packaging']), + check_not_exist('basetreatment-treatment_creation', + 'basket'), 'resultfinds-treatment_creation': - check_treatment('basetreatment-treatment_creation', - 'treatment_type', ['split']), + check_type_field('basetreatment-treatment_creation', + 'treatment_type', models.TreatmentType, + 'downstream_is_many'), 'resultfind-treatment_creation': - check_treatment('basetreatment-treatment_creation', - 'treatment_type', not_type_list=['split'])}, + check_type_field('basetreatment-treatment_creation', + 'treatment_type', models.TreatmentType, + 'upstream_is_many')}, label=_(u"New treatment"), url_name='treatment_creation',) |