diff options
| -rw-r--r-- | archaeological_finds/forms.py | 56 | ||||
| -rw-r--r-- | archaeological_finds/models.py | 34 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 29 | ||||
| -rw-r--r-- | archaeological_finds/wizards.py | 7 | 
4 files changed, 76 insertions, 50 deletions
| diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 271ee0c9d..67eb441e5 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -350,15 +350,23 @@ class FindMultipleFormSelection(forms.Form):          return self.cleaned_data +def check_form(wizard, form_name, key): +    request = wizard.request +    storage = wizard.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 +    return True + +  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]: +        if not check_form(self, form_name, key):              return False          try:              val = request.session[storage.prefix][ @@ -377,15 +385,28 @@ def check_not_exist(form_name, key):      return func +def check_value(form_name, key, value): +    def func(self): +        request = self.request +        storage = self.storage +        if not check_form(self, form_name, key): +            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 unicode(val) == unicode(value) +        except ValueError: +            return False +    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]: +        if not check_form(self, form_name, key):              return False          try:              val = model.objects.get(pk=request.session[storage.prefix][ @@ -411,11 +432,7 @@ def check_treatment(form_name, type_key, type_list=[], not_type_list=[]):      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 + '-' + type_key not in \ -           request.session[storage.prefix]['step_data'][form_name]: +        if not check_form(self, form_name, type_key):              return False          try:              tpe = request.session[storage.prefix][ @@ -534,6 +551,10 @@ class NewFindBasketForm(forms.ModelForm):  class SelectFindBasketForm(forms.Form): +    form_label = _(u"Basket") +    associated_models = {'basket': models.FindBasket} +    need_user_for_initialization = True +      basket = forms.ChoiceField(label=_(u"Basket"), required=True, choices=[])      def __init__(self, *args, **kwargs): @@ -595,7 +616,7 @@ class TreatmentFormSelection(forms.Form):          validators=[valid_id(models.Treatment)]) -class BaseTreatmentForm(ManageOldType, SelectFindBasketForm): +class BaseTreatmentForm(ManageOldType, forms.Form):      form_label = _(u"Base treatment")      base_models = ['treatment_type']      associated_models = {'treatment_type': models.TreatmentType, @@ -603,7 +624,7 @@ class BaseTreatmentForm(ManageOldType, SelectFindBasketForm):                           'location': Warehouse,                           'organization': Organization,                           'container': models.Container, -                         'basket': models.FindBasket} +                         }      need_user_for_initialization = True      label = forms.CharField(label=_(u"Label"), @@ -682,7 +703,6 @@ class BaseTreatmentForm(ManageOldType, SelectFindBasketForm):              models.TreatmentType.get_help(                 dct={'upstream_is_many': False, 'downstream_is_many': False})          # TODO -        self.fields.pop('basket')          """          self.fields['basket'].required = False          self.fields['basket'].help_text = \ diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index 01c904cc8..3e0d09ef8 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -879,27 +879,25 @@ class Treatment(BaseHistorizedItem, ImageModel, OwnPerms):              user = kwargs.pop('user')          if "extra_args_for_new" in kwargs:              extra_args_for_new = kwargs.pop('extra_args_for_new') -        is_new = self.pk is None          self.pre_save()          super(Treatment, self).save(*args, **kwargs)          updated = [] -        if is_new: -            if hasattr(items, "items"): -                items = items.items.all() -            for item in items: -                new = item.duplicate(user) -                item.downstream_treatment = self -                item.save() -                new.upstream_treatment = self -                for k in extra_args_for_new: -                    setattr(new, k, extra_args_for_new[k]) -                new.save() -                updated.append(new.pk) -                # update baskets -                for basket in \ -                        FindBasket.objects.filter(items__pk=item.pk).all(): -                    basket.items.remove(item) -                    basket.items.add(new) +        if hasattr(items, "items"): +            items = items.items.all() +        for item in items: +            new = item.duplicate(user) +            item.downstream_treatment = self +            item.save() +            new.upstream_treatment = self +            for k in extra_args_for_new: +                setattr(new, k, extra_args_for_new[k]) +            new.save() +            updated.append(new.pk) +            # update baskets +            for basket in \ +                    FindBasket.objects.filter(items__pk=item.pk).all(): +                basket.items.remove(item) +                basket.items.add(new)          # manage containers          for find in Find.objects.filter(upstream_treatment=self).all():              if find.container != self.container: diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 1f3213504..29d4f7da9 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -292,8 +292,9 @@ get_downstreamtreatment = get_item(  treatment_wizard_steps = [      ('basetreatment-treatment_creation', BaseTreatmentForm),      ('selecfind-treatment_creation', UpstreamFindFormSelection), -    ('resultfind-treatment_creation', ResultFindForm), -    ('resultfinds-treatment_creation', ResultFindFormSet), +    ('selecbasket-treatment_creation', SelectFindBasketForm), +    # ('resultfind-treatment_creation', ResultFindForm), +    # ('resultfinds-treatment_creation', ResultFindFormSet),      ('final-treatment_creation', FinalForm)]  treatment_search_wizard = SearchWizard.as_view([ @@ -305,16 +306,20 @@ treatment_creation_wizard = TreatmentWizard.as_view(      treatment_wizard_steps,      condition_dict={      'selecfind-treatment_creation': -        check_not_exist('basetreatment-treatment_creation', -                        'basket'), -    'resultfinds-treatment_creation': -        check_type_field('basetreatment-treatment_creation', -                         'treatment_type', models.TreatmentType, -                         'downstream_is_many'), -    'resultfind-treatment_creation': -        check_type_field('basetreatment-treatment_creation', -                         'treatment_type', models.TreatmentType, -                         'upstream_is_many')}, +        check_value('basetreatment-treatment_creation', +                    'target_is_basket', False), +    'selecbasket-treatment_creation': +        check_value('basetreatment-treatment_creation', +                    'target_is_basket', True), +    # 'resultfinds-treatment_creation': +    #     check_type_field('basetreatment-treatment_creation', +    #                      'treatment_type', models.TreatmentType, +    #                      'downstream_is_many'), +    # 'resultfind-treatment_creation': +    #     check_type_field('basetreatment-treatment_creation', +    #                      'treatment_type', models.TreatmentType, +    #                      'upstream_is_many') +    },      label=_(u"New treatment"),      url_name='treatment_creation',) diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py index 9c91ac516..962f21e69 100644 --- a/archaeological_finds/wizards.py +++ b/archaeological_finds/wizards.py @@ -107,10 +107,13 @@ class TreatmentWizard(Wizard):                          and not find.is_own(dct['history_modifier']):                      raise PermissionDenied                  dct['items'] = [find] -            except (models.Find.DoesNotExist): +            except models.Find.DoesNotExist:                  raise PermissionDenied          if 'basket' in dct: -            dct.pop('basket') +            basket = dct.pop('basket') +            if basket.user.pk != dct['history_modifier'].pk: +                raise PermissionDenied +            dct['items'] = list(basket.items.all())          return dct | 
