Projet

Général

Profil

fix-set_value.diff

Benjamin Dauvergne, 09 septembre 2021 12:58

Télécharger (4,05 ko)

Voir les différences:


  

wcs/backoffice/submission.py
330 330
            get_session().message = ('error', _('This form has already been submitted.'))
331 331
            return redirect(self.get_default_return_url())
332 332
        filled.just_created()
333
        filled.data = self.formdef.get_data(form)
333
        filled.data = self.formdef.get_data(form, current_data=filled.data)
334 334
        magictoken = get_request().form['magictoken']
335 335
        computed_values = get_session().get_by_magictoken('%s-computed' % magictoken, {})
336 336
        filled.data.update(computed_values)
wcs/fields.py
606 606
            return value
607 607
        return str(value)
608 608

  
609
    def set_value(self, data, value):
609
    def set_value(self, data, value, current_data=None):
610
        old_value = data.get('%s' % self.id)
610 611
        data['%s' % self.id] = value
611 612
        if self.store_display_value:
612
            display_value = self.store_display_value(data, self.id)
613
            if current_data and value == old_value and current_data.get('%s_display' % self.id):
614
                display_value = current_data.get('%s_display' % self.id)
615
            else:
616
                display_value = self.store_display_value(data, self.id)
613 617
            if display_value:
614 618
                data['%s_display' % self.id] = display_value
615 619
            elif '%s_display' % self.id in data:
616 620
                del data['%s_display' % self.id]
617 621
        if self.store_structured_value and value:
618
            structured_value = self.store_structured_value(data, self.id)
622
            if current_data and value == old_value and current_data.get('%s_structured' % self.id):
623
                structured_value = current_data.get('%s_structured' % self.id)
624
            else:
625
                structured_value = self.store_structured_value(data, self.id)
619 626
            if structured_value:
620 627
                if isinstance(structured_value, dict) and structured_value.get('id'):
621 628
                    # in case of list field, override id
wcs/formdef.py
800 800
                    widget.live_condition_fields = live_condition_fields[field.varname]
801 801

  
802 802
    @classmethod
803
    def get_field_data(cls, field, widget):
803
    def get_field_data(cls, field, widget, current_data=None):
804 804
        d = {}
805 805
        d[field.id] = widget.parse()
806 806
        if d.get(field.id) is not None and field.convert_value_from_str:
807 807
            d[field.id] = field.convert_value_from_str(d[field.id])
808
        field.set_value(d, d[field.id])
808
        field.set_value(d, d[field.id], current_data=current_data)
809 809
        if getattr(widget, 'cleanup', None):
810 810
            widget.cleanup()
811 811
        return d
812 812

  
813
    def get_data(self, form):
813
    def get_data(self, form, current_data=None):
814 814
        d = {}
815 815
        for field in self.fields:
816 816
            widget = form.get_widget('f%s' % field.id)
817 817
            if widget:
818
                d.update(self.get_field_data(field, widget))
818
                d.update(self.get_field_data(field, widget, current_data=None))
819 819
        return d
820 820

  
821 821
    def export_to_json(self, include_id=False, indent=None, anonymise=True):
wcs/forms/root.py
1443 1443
            filled = self.get_current_draft() or self.formdef.data_class()()
1444 1444
            filled.just_created()
1445 1445

  
1446
        filled.data = self.formdef.get_data(form)
1446
        filled.data = self.formdef.get_data(form, current_data=filled.data)
1447 1447
        magictoken = get_request().form['magictoken']
1448 1448
        computed_values = get_session().get_by_magictoken('%s-computed' % magictoken, {})
1449 1449
        filled.data.update(computed_values)