Projet

Général

Profil

0001-gesbac-get-demand-response-by-gesbac-id-instead-of-f.patch

Serghei Mihai (congés, retour 15/05), 27 janvier 2020 14:52

Télécharger (8,15 ko)

Voir les différences:

Subject: [PATCH] gesbac: get demand response by gesbac id instead of form id
 (#39134)

 .../migrations/0002_auto_20200127_1317.py     | 30 ++++++++++++++
 passerelle/apps/gesbac/models.py              | 34 +++++++++++-----
 tests/test_gesbac.py                          | 39 ++++++++++++++++++-
 3 files changed, 91 insertions(+), 12 deletions(-)
 create mode 100644 passerelle/apps/gesbac/migrations/0002_auto_20200127_1317.py
passerelle/apps/gesbac/migrations/0002_auto_20200127_1317.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.20 on 2020-01-27 12:17
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('gesbac', '0001_initial'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='form',
17
            name='counter',
18
            field=models.IntegerField(default=0),
19
        ),
20
        migrations.AddField(
21
            model_name='form',
22
            name='gesbac_id',
23
            field=models.CharField(default='', max_length=64),
24
            preserve_default=False,
25
        ),
26
        migrations.AlterUniqueTogether(
27
            name='form',
28
            unique_together=set([('form_id', 'counter')]),
29
        ),
30
    ]
passerelle/apps/gesbac/models.py
19 19

  
20 20
from collections import OrderedDict
21 21

  
22
from django.db import models
22
from django.db import models, transaction, IntegrityError
23 23
from django.utils import six
24 24
from django.utils.encoding import force_bytes
25 25
from django.utils.translation import ugettext_lazy as _
......
330 330
    )
331 331
    def create_demand(self, request, post_data):
332 332
        form_id = post_data['form_id']
333

  
334
        form = Form.objects.create(resource=self, form_id=form_id)
333
        for counter in xrange(20):
334
            try:
335
                with transaction.atomic():
336
                    form = Form.objects.create(resource=self, form_id=form_id, counter=counter)
337
                    break
338
            except IntegrityError as e:
339
                continue
340
        else:
341
            raise APIError('fail: more than 20 demands')
335 342
        post_data['form_id'] = form.get_gesbac_id()
336 343
        data = []
337 344
        applicant_data = ['E']
......
355 362
        form.demand_data = data
356 363
        form.save()
357 364
        self.add_job('send_demand', form_id=form.id)
358
        return {'data': {'filename': form.get_filename()}}
365
        return {'data': {'filename': form.get_filename(),
366
                         'gesbac_id': form.get_gesbac_id()}}
359 367

  
360 368
    @endpoint(name='get-response', perm='can_access',
361 369
              description=_('Get response'),
362 370
              parameters={
363
                  'form_id': {
364
                      'description': _('Form identifier'),
365
                      'example_value': '42-01'
371
                  'gesbac_id': {
372
                      'description': _('Gesbac demand identifier'),
373
                      'example_value': '420001'
366 374
                  }
367 375
              }
368 376
    )
369
    def get_response(self, request, form_id):
377
    def get_response(self, request, gesbac_id):
370 378
        try:
371 379
            response = self.form_set.filter(status='closed',
372
                                            form_id=form_id).latest()
380
                                            gesbac_id=gesbac_id).latest()
373 381
            return {'data': response.card_data}
374 382
        except Form.DoesNotExist:
375 383
            raise Http404('No response found')
......
385 393
class Form(models.Model):
386 394
    resource = models.ForeignKey(Gesbac, on_delete=models.CASCADE)
387 395
    form_id = models.CharField(max_length=64)
396
    gesbac_id = models.CharField(max_length=64)
397
    counter = models.IntegerField(default=0)
388 398
    creation_datetime = models.DateTimeField(auto_now_add=True)
389 399
    filename = models.CharField(max_length=128, null=True)
390 400
    status = models.CharField(max_length=8, default='new',
......
395 405

  
396 406
    class Meta:
397 407
        get_latest_by = 'creation_datetime'
408
        unique_together = ('form_id', 'counter')
398 409

  
399 410
    def get_gesbac_id(self):
400
        return self.form_id.replace('-', '%03d' % self.id)
411
        if not self.gesbac_id:
412
            self.gesbac_id = self.form_id.replace('-', '%03d' % self.counter)
413
            self.save()
414
        return self.gesbac_id
401 415

  
402 416
    def get_filename(self):
403 417
        if not self.filename:
tests/test_gesbac.py
82 82
                                         timestamp.strftime('%y%m%d-%H%M%S'),
83 83
                                         form.get_gesbac_id())
84 84
    assert response.json['data']['filename'] == expected_filename
85
    assert response.json['data']['gesbac_id'] == '4200042'
85 86
    assert resource.form_set.filter(status='new').count() == 1
86 87
    with sftpserver.serve_content({'output': {expected_filename: 'content'}}):
87 88
        resource.jobs()
......
96 97
                                         timestamp.strftime('%y%m%d-%H%M%S'),
97 98
                                         form.get_gesbac_id())
98 99
    assert response.json['data']['filename'] == expected_filename
100
    assert response.json['data']['gesbac_id'] == '4200142'
99 101
    with sftpserver.serve_content({'output': {response.json['data']['filename']: 'content'}}):
100 102
        resource.jobs()
101 103
    assert resource.form_set.filter(status='sent').count() == 2
102 104

  
103 105

  
106
def test_demand_creation_limit(app, resource, freezer):
107
    timestamp = now()
108
    payload = {
109
        'form_id': '42-44',
110
        'demand_date': timestamp.strftime('%Y%m%d'),
111
        'demand_time': timestamp.strftime('%H%M%S'),
112
        'producer_code': 1,
113
        'city_insee_code': '75114',
114
        'street_name': 'Château',
115
        'street_rivoli_code': 'xxxx',
116
        'producer_social_reason': 'SCOP',
117
        'producer_last_name': 'Bar',
118
        'producer_first_name': 'Foo',
119
        'producer_email': 'foo@example.com',
120
        'owner_last_name': 'Bar',
121
        'owner_first_name': 'Foo',
122
        'owner_email': 'foo@example.com',
123
        'family_members_number': 5,
124
        'houses_number': 1,
125
        'card_type': 1,
126
        'card_subject': 1,
127
        'card_demand_reason': 1,
128
        'card_demand_purpose': 1,
129
        'cards_quantity': 1
130
    }
131
    for count in xrange(20):
132
        response = app.post_json('/gesbac/test/create-demand/', params=payload)
133
        assert response.json['err'] == 0
134

  
135
    response = app.post_json('/gesbac/test/create-demand/', params=payload)
136
    assert response.json['err'] == 1
137

  
138

  
104 139
def test_get_demand_response(app, resource, freezer, sftpserver):
105 140
    response = app.get('/gesbac/test/get-response/',
106
                       params={'form_id': '42-43'}, status=404)
141
                       params={'gesbac_id': '42043'}, status=404)
107 142
    timestamp = now()
108 143
    payload = {
109 144
        'form_id': '42-43',
......
154 189
    assert response.card_data == ['CARTE', gesbac_id, '3', '2', '1234', '', '',
155 190
                                  '', '', '', '', '', force_text(comment, 'latin-1')]
156 191
    response = app.get('/gesbac/test/get-response/',
157
                       params={'form_id': '42-43'})
192
                       params={'gesbac_id': gesbac_id})
158 193
    assert response.json['err'] == 0
159 194
    assert response.json['data'] == ['CARTE', gesbac_id, '3', '2', '1234', '',
160 195
                                     '', '', '', '', '', '', force_text(comment, 'latin-1')]
161
-