0001-gesbac-get-demand-response-by-gesbac-id-instead-of-f.patch
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 |
- |