Projet

Général

Profil

0001-lingo-add-default-values-for-TIPI-reference-fields-2.patch

Serghei Mihai (congés, retour 15/05), 20 décembre 2018 11:13

Télécharger (11,6 ko)

Voir les différences:

Subject: [PATCH] lingo: add default values for TIPI reference fields (#26057)

Make fields readonly if default value defined.
 .../migrations/0033_auto_20181204_2241.py     | 44 +++++++++++++++++++
 combo/apps/lingo/models.py                    | 28 +++++++++++-
 .../apps/lingo/templates/lingo/tipi_form.html | 15 +++----
 combo/manager/static/js/combo.manager.js      | 39 ++++++++++++++++
 tests/test_lingo_cells.py                     |  8 ++++
 tests/test_lingo_manager.py                   | 20 ++++++++-
 6 files changed, 144 insertions(+), 10 deletions(-)
 create mode 100644 combo/apps/lingo/migrations/0033_auto_20181204_2241.py
combo/apps/lingo/migrations/0033_auto_20181204_2241.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('lingo', '0032_basketitem_capture_date'),
11
    ]
12

  
13
    operations = [
14
        migrations.AddField(
15
            model_name='tipipaymentformcell',
16
            name='exer',
17
            field=models.CharField(help_text='Default value to be used in form', max_length=4, verbose_name='Exer', blank=True),
18
        ),
19
        migrations.AddField(
20
            model_name='tipipaymentformcell',
21
            name='idligne',
22
            field=models.CharField(help_text='Default value to be used in form', max_length=6, verbose_name='IDLIGNE', blank=True),
23
        ),
24
        migrations.AddField(
25
            model_name='tipipaymentformcell',
26
            name='idpce',
27
            field=models.CharField(help_text='Default value to be used in form', max_length=8, verbose_name='IDPCE', blank=True),
28
        ),
29
        migrations.AddField(
30
            model_name='tipipaymentformcell',
31
            name='roldeb',
32
            field=models.CharField(help_text='Default value to be used in form', max_length=2, verbose_name='ROLDEB', blank=True),
33
        ),
34
        migrations.AddField(
35
            model_name='tipipaymentformcell',
36
            name='roldet',
37
            field=models.CharField(help_text='Default value to be used in form', max_length=13, verbose_name='ROLDET', blank=True),
38
        ),
39
        migrations.AddField(
40
            model_name='tipipaymentformcell',
41
            name='rolrec',
42
            field=models.CharField(help_text='Default value to be used in form', max_length=2, verbose_name='ROLREC', blank=True),
43
        ),
44
    ]
combo/apps/lingo/models.py
712 712
    url = models.URLField(_('TIPI payment service URL'), default='https://www.tipi.budget.gouv.fr/tpa/paiement.web')
713 713
    regies = models.CharField(_('Regies'), help_text=_('separated by commas'), max_length=256)
714 714
    control_protocol = models.CharField(_('Control protocol'), max_length=8, choices=TIPI_CONTROL_PROCOTOLS, default='pesv2')
715
    exer = models.CharField(_('Exer'), max_length=4, blank=True, help_text=_('Default value to be used in form'))
716
    idpce = models.CharField(_('IDPCE'), max_length=8, blank=True, help_text=_('Default value to be used in form'))
717
    idligne = models.CharField(_('IDLIGNE'), max_length=6, blank=True, help_text=_('Default value to be used in form'))
718
    rolrec = models.CharField(_('ROLREC'), max_length=2, blank=True, help_text=_('Default value to be used in form'))
719
    roldeb = models.CharField(_('ROLDEB'), max_length=2, blank=True, help_text=_('Default value to be used in form'))
720
    roldet = models.CharField(_('ROLDET'), max_length=13, blank=True, help_text=_('Default value to be used in form'))
715 721
    test_mode = models.BooleanField(_('Test mode'), default=False)
716 722
    template_name = 'lingo/tipi_form.html'
717 723

  
......
723 729

  
724 730
    def get_cell_extra_context(self, context):
725 731
        extra_context = super(TipiPaymentFormCell, self).get_cell_extra_context(context)
732
        form_fields = self.get_default_form_class().base_fields
733
        field_definitions = ({'protocol': 'any', 'fields': ['exer']},
734
                  {'protocol': 'pesv2', 'fields': ['idligne', 'idpce']},
735
                  {'protocol': 'rolmre', 'fields': ['rolrec', 'roldeb', 'roldet']}
736
        )
737
        reference_fields = []
738
        for definition in field_definitions:
739
            for field in definition['fields']:
740
                field_pattern = '[0-9]+'
741
                # special pattern for rolrec
742
                if field == 'rolrec':
743
                    field_pattern = '[A-Z0-9]+'
744
                reference_fields.append({'name': field, 'length': form_fields[field].max_length,
745
                                         'placeholder': '0'*form_fields[field].max_length,
746
                                         'pattern': field_pattern,
747
                                         'protocol': definition['protocol']})
726 748
        context['title'] = self.title
727 749
        context['url'] = self.url
728 750
        context['mode'] = 'T' if self.test_mode else 'M'
729
        context['pesv2'] = (self.control_protocol == 'pesv2')
751
        context['control_protocol'] = self.control_protocol
730 752
        context['regies'] = []
753
        for field in reference_fields:
754
            if getattr(self, field['name']):
755
                field['default'] = getattr(self, field['name'])
756
        context['reference_fields'] = reference_fields
731 757
        for regie in self.regies.split(','):
732 758
            regie_id = regie.strip()
733 759
            if not regie_id:
combo/apps/lingo/templates/lingo/tipi_form.html
24 24
    </ul>
25 25
    <p>
26 26
      <label>{% trans "Reference" %}</label>
27
      <input type="text" id="exer" required pattern="[0-9]+" maxlength="4" size="4" placeholder="0000" /> -
28
      {% if pesv2 %}
29
      <input type="text" id="idpce" required pattern="[0-9]+" maxlength="8" size="8" placeholder="00000000" /> -
30
      <input type="text" id="idligne" required pattern="[0-9]+" maxlength="6" size="6" placeholder="000000" />
31
      {% else %}
32
      <input type="text" id="rolrec" required pattern="[A-Z0-9]+" maxlength="2" size="2" placeholder="00" /> -
33
      <input type="text" id="roldeb" required pattern="[0-9]+" maxlength="2" size="2" placeholder="00" /> -
34
      <input type="text" id="roldet" required pattern="[0-9]+" maxlength="13" size="13" placeholder="0000000000000" />
27
      {% regroup reference_fields by protocol as fields %}
28
      {% for field in fields %}
29
      {% for f in field.list %}
30
      {% if field.grouper == control_protocol or field.grouper == 'any' %}
31
      <input type="text" id="{{ f.name }}" required pattern="{{ f.pattern }}" maxlength="{{ f.length }}" size="{{ f.length }}" placeholder="{{ f.placeholder }}" {% if f.default %}value="{{ f.default }}" readonly {% endif %}/>{% if field.grouper == 'any' or not forloop.last %} - {% endif %}
35 32
      {% endif %}
33
      {% endfor %}
34
      {% endfor %}
36 35
    </p>
37 36
    <ul class="errorlist" id="montant_error" style="display: none">
38 37
      <li>{% trans "invalid amount" %}</li>
combo/manager/static/js/combo.manager.js
219 219
     return false;
220 220
  });
221 221

  
222
  function handle_tipi_form(element) {
223
    var prefix_components = element.attr('name').split('-');
224
    /* remove field name and keep only prefix */
225
    prefix_components.pop();
226
    var prefix = prefix_components.join('-');
227
    function hide_fields(fields) {
228
        fields.forEach(function(f) {
229
            $("[name="+prefix+"-"+f+"]").parent().hide();
230
        });
231
    }
232
    function show_fields(fields) {
233
        fields.forEach(function(f) {
234
            $("[name="+prefix+"-"+f+"]").parent().show();
235
        })
236
    }
237
    if (element.val() == 'pesv2') {
238
        show_fields(['idpce', 'idligne']);
239
        hide_fields(['rolrec', 'roldeb', 'roldet']);
240
    } else {
241
        show_fields(['rolrec', 'roldeb', 'roldet']);
242
        hide_fields(['idpce', 'idligne']);
243
    }
244
  }
245

  
246
  $('.cell.tipipaymentformcell select').on('change', function() {
247
      handle_tipi_form($(this));
248
      compute_max_height($(this).parents('div.cell'));
249
  });
250
  $('.cell.tipipaymentformcell select').trigger('change');
251

  
252
  $('.cell.tipipaymentformcell').on('combo:cellform-reloaded', function() {
253
      compute_max_height($(this));
254
      var $select = $(this).find('select');
255
      $select.on('change', function() {
256
          handle_tipi_form($select);
257
      });
258
      $select.trigger('change');
259
  });
260

  
222 261
  $('div.cell').each(function(i, x) {
223 262
    $(this).attr('id', 'div-cell-'+i);
224 263
    var h = $(this).find('h3 + div').height() + 10;
tests/test_lingo_cells.py
199 199
    html = cell.render({})
200 200
    assert "Community identifier" in html
201 201
    assert '<select id="numcli">' in html
202

  
203
    # set reference default values and check they are filled and readonly
204
    cell.exer = '1234'
205
    cell.rolrec = '00'
206
    cell.save()
207
    html = cell.render({})
208
    assert 'value="1234" readonly' in html
209
    assert 'value="00" readonly' in html
tests/test_lingo_manager.py
10 10

  
11 11
import eopayment
12 12
from combo.data.models import Page
13
from combo.apps.lingo.models import Regie, BasketItem, Transaction, ActiveItems
13
from combo.apps.lingo.models import Regie, BasketItem, Transaction, ActiveItems, TipiPaymentFormCell
14 14
from decimal import Decimal
15 15

  
16 16
pytestmark = pytest.mark.django_db
......
155 155
    assert resp.text.count('<tr') == 0
156 156
    assert 'No transactions found matching' in resp.text
157 157

  
158
def test_configure_tipi_cell(app, admin_user):
159
    page = Page(title='tipi', slug='tipi', template_name='standard')
160
    page.save()
161

  
162
    app = login(app)
163
    resp = app.get('/manage/pages/%s/' % page.id, status=200)
164

  
165
    cell = TipiPaymentFormCell(title='Test payment', page=page, placeholder='content', order=0)
166
    cell.save()
167
    resp = app.get('/manage/pages/%s/' % page.id, status=200)
168
    assert resp.text.count('Exer:') == 1
169
    assert resp.text.count('IDPCE:') == 1
170
    assert resp.text.count('IDLIGNE:') == 1
171
    assert resp.text.count('ROLREC:') == 1
172
    assert resp.text.count('ROLDEB:') == 1
173
    assert resp.text.count('ROLDET:') == 1
174

  
158 175
def test_configure_invoices_cell(app, admin_user):
159 176
    page = Page(title='xxx', slug='test', template_name='standard')
160 177
    page.save()
......
165 182
    # 2 occurences of tipi payment form should be present, and no other cells
166 183
    assert resp.text.count('lingo') == 2
167 184
    assert resp.text.count('lingo_tipipaymentformcell') == 2
185
    assert resp.text.count('lingo_tipipaymentformcell') == 2
168 186

  
169 187
    regie = Regie()
170 188
    regie.label = 'Test'
171
-