Skip to content

Commit e03d159

Browse files
committed
Fixed patching data, auction view, bids visibility
1 parent e3d7f4e commit e03d159

7 files changed

Lines changed: 80 additions & 24 deletions

File tree

src/openprocurement/api/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ class Options:
207207
'active.enquiries': whitelist(),
208208
'active.tendering': whitelist(),
209209
'active.auction': whitelist('value'),
210-
'active.qualification': whitelist('value'),
211-
'active.awarded': whitelist('value'),
210+
'active.qualification': schematics_default_role,
211+
'active.awarded': schematics_default_role,
212212
'complete': schematics_default_role,
213213
'unsuccessful': schematics_default_role,
214214
'paused': whitelist(),

src/openprocurement/api/tests/auction.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,13 @@ def test_post_tender_auction(self):
148148
response = self.app.patch_json('/tenders/{}/auction'.format(self.tender_id), {'data': patch_data})
149149
self.assertEqual(response.status, '200 OK')
150150
self.assertEqual(response.content_type, 'application/json')
151-
auction = response.json['data']
152-
self.assertNotEqual(auction["bids"][0]['value']['amount'], self.initial_data["bids"][0]['value']['amount'])
153-
self.assertNotEqual(auction["bids"][1]['value']['amount'], self.initial_data["bids"][1]['value']['amount'])
154-
self.assertEqual(auction["bids"][0]['value']['amount'], patch_data["bids"][1]['value']['amount'])
155-
self.assertEqual(auction["bids"][1]['value']['amount'], patch_data["bids"][0]['value']['amount'])
156-
157-
self.set_status('active.qualification')
151+
tender = response.json['data']
152+
self.assertNotEqual(tender["bids"][0]['value']['amount'], self.initial_data["bids"][0]['value']['amount'])
153+
self.assertNotEqual(tender["bids"][1]['value']['amount'], self.initial_data["bids"][1]['value']['amount'])
154+
self.assertEqual(tender["bids"][0]['value']['amount'], patch_data["bids"][1]['value']['amount'])
155+
self.assertEqual(tender["bids"][1]['value']['amount'], patch_data["bids"][0]['value']['amount'])
156+
self.assertTrue("tenderers" in tender["bids"][0])
157+
self.assertTrue("name" in tender["bids"][0]["tenderers"][0])
158158

159159
response = self.app.patch_json('/tenders/{}/auction'.format(self.tender_id), {'data': patch_data}, status=403)
160160
self.assertEqual(response.status, '403 Forbidden')

src/openprocurement/api/tests/bidder.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,15 @@ def test_create_tender_bidder(self):
107107
self.assertTrue('id' in bidder)
108108
self.assertTrue(bidder['id'] in response.headers['Location'])
109109

110+
response = self.app.post_json('/tenders/{}/bids'.format(
111+
self.tender_id), {'data': {'tenderers': [{'identifier': {'id': 1}, 'name': 'Name'}]}})
112+
self.assertEqual(response.status, '201 Created')
113+
self.assertEqual(response.content_type, 'application/json')
114+
bidder = response.json['data']
115+
self.assertEqual(bidder['tenderers'][0]['name'], 'Name')
116+
self.assertTrue('id' in bidder)
117+
self.assertTrue(bidder['id'] in response.headers['Location'])
118+
110119
self.set_status('complete')
111120

112121
response = self.app.post_json('/tenders/{}/bids'.format(

src/openprocurement/api/tests/tender.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,17 +223,17 @@ def test_create_tender(self):
223223
response = self.app.post_json('/tenders?opt_jsonp=callback', {"data": test_tender_data})
224224
self.assertEqual(response.status, '201 Created')
225225
self.assertEqual(response.content_type, 'application/javascript')
226-
self.assertTrue('callback({"data": {"' in response.body)
226+
self.assertTrue('callback({"' in response.body)
227227

228228
response = self.app.post_json('/tenders?opt_pretty=1', {"data": test_tender_data})
229229
self.assertEqual(response.status, '201 Created')
230230
self.assertEqual(response.content_type, 'application/json')
231-
self.assertTrue('{\n "data": {\n "' in response.body)
231+
self.assertTrue('{\n "' in response.body)
232232

233233
response = self.app.post_json('/tenders', {"data": test_tender_data, "options": {"pretty": True}})
234234
self.assertEqual(response.status, '201 Created')
235235
self.assertEqual(response.content_type, 'application/json')
236-
self.assertTrue('{\n "data": {\n "' in response.body)
236+
self.assertTrue('{\n "' in response.body)
237237

238238
def test_get_tender(self):
239239
response = self.app.get('/tenders')
@@ -279,6 +279,16 @@ def test_put_tender(self):
279279
self.assertEqual(tender, new_tender)
280280
self.assertNotEqual(dateModified, new_dateModified)
281281

282+
response = self.app.patch_json('/tenders/{}'.format(tender['id']), {'data': {'status': 'complete'}})
283+
self.assertEqual(response.status, '200 OK')
284+
self.assertEqual(response.content_type, 'application/json')
285+
286+
response = self.app.put_json('/tenders/{}'.format(
287+
tender['id']), {'data': tender}, status=403)
288+
self.assertEqual(response.status, '403 Forbidden')
289+
self.assertEqual(response.content_type, 'application/json')
290+
self.assertEqual(response.json['errors'][0]["description"], "Can't change tender in current status")
291+
282292
def test_patch_tender(self):
283293
response = self.app.get('/tenders')
284294
self.assertEqual(response.status, '200 OK')
@@ -312,6 +322,17 @@ def test_patch_tender(self):
312322
self.assertEqual(revisions[0][u'changes'][0]['op'], u'remove')
313323
self.assertEqual(revisions[0][u'changes'][0]['path'], u'/procurementMethod')
314324

325+
response = self.app.patch_json('/tenders/{}'.format(
326+
tender['id']), {'data': {'items': [test_tender_data['items'][0]]}})
327+
self.assertEqual(response.status, '200 OK')
328+
self.assertEqual(response.content_type, 'application/json')
329+
330+
response = self.app.patch_json('/tenders/{}'.format(
331+
tender['id']), {'data': {'items': [{}, test_tender_data['items'][0]]}})
332+
self.assertEqual(response.status, '200 OK')
333+
self.assertEqual(response.content_type, 'application/json')
334+
self.assertEqual(response.json['data']['items'][0], response.json['data']['items'][1])
335+
315336
response = self.app.patch_json('/tenders/{}'.format(
316337
tender['id']), {'data': {'enquiryPeriod': {'endDate': new_dateModified2}}})
317338
self.assertEqual(response.status, '200 OK')
@@ -328,6 +349,15 @@ def test_patch_tender(self):
328349
self.assertEqual(response.content_type, 'application/json')
329350
self.assertTrue('auctionUrl' in response.json['data'])
330351

352+
response = self.app.patch_json('/tenders/{}'.format(tender['id']), {'data': {'status': 'complete'}})
353+
self.assertEqual(response.status, '200 OK')
354+
self.assertEqual(response.content_type, 'application/json')
355+
356+
response = self.app.patch_json('/tenders/{}'.format(tender['id']), {'data': {'status': 'active.auction'}}, status=403)
357+
self.assertEqual(response.status, '403 Forbidden')
358+
self.assertEqual(response.content_type, 'application/json')
359+
self.assertEqual(response.json['errors'][0]["description"], "Can't change tender in current status")
360+
331361
def test_dateModified_tender(self):
332362
response = self.app.get('/tenders')
333363
self.assertEqual(response.status, '200 OK')

src/openprocurement/api/utils.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def generate_tender_id(tid):
1414
return "UA-" + tid
1515

1616

17-
def filter_data(data, fields=['id', 'doc_id', 'date', 'dateModified', 'url']):
17+
def filter_data(data, fields=['id', 'doc_id', 'date', 'dateModified', 'url', 'owner_token']):
1818
result = data.copy()
1919
for i in fields:
2020
if i in result:
@@ -62,17 +62,28 @@ def get_file(tender, document, key, db, request):
6262
request.errors.status = 404
6363

6464

65+
def prepare_patch(changes, orig, patch, basepath=''):
66+
if isinstance(patch, dict):
67+
for i in patch:
68+
if i in orig:
69+
prepare_patch(changes, orig[i], patch[i], '{}/{}'.format(basepath, i))
70+
else:
71+
changes.append({'op': 'add', 'path': '{}/{}'.format(basepath, i), 'value': patch[i]})
72+
elif isinstance(patch, list):
73+
for i, j in enumerate(patch):
74+
if len(orig) > i:
75+
prepare_patch(changes, orig[i], patch[i], '{}/{}'.format(basepath, i))
76+
else:
77+
changes.append({'op': 'add', 'path': '{}/{}'.format(basepath, i), 'value': j})
78+
else:
79+
for x in make_patch(orig, patch).patch:
80+
x['path'] = '{}{}'.format(basepath, x['path'])
81+
changes.append(x)
82+
83+
6584
def apply_data_patch(item, changes):
6685
patch_changes = []
67-
for i, j in changes.items():
68-
if i in item:
69-
for x in make_patch(item[i], j).patch:
70-
if x['op'] == u'remove':
71-
continue
72-
x['path'] = '/{}{}'.format(i, x['path'])
73-
patch_changes.append(x)
74-
else:
75-
patch_changes.append({'op': 'add', 'path': '/{}'.format(i), 'value': j})
86+
prepare_patch(patch_changes, item, changes)
7687
return apply_patch(item, patch_changes)
7788

7889

src/openprocurement/api/views/auction.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ def patch_auction(request):
154154
bids = auction_data.get('bids', [])
155155
tender_bids_ids = [i.id for i in tender.bids]
156156
auction_data['bids'] = [x for (y, x) in sorted(zip([tender_bids_ids.index(i['id']) for i in bids], bids))]
157+
auction_data['status'] = 'active.qualification'
157158
src = tender.serialize("plain")
158159
tender.import_data(apply_data_patch(src, auction_data))
159160
save_tender(tender, src, request)
160-
return {'data': tender.serialize("auction_view")}
161+
return {'data': tender.serialize(tender.status)}

src/openprocurement/api/views/tender.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,12 @@ def collection_post(self):
253253
self.request.response.status = 201
254254
self.request.response.headers[
255255
'Location'] = self.request.route_url('Tender', id=tender_id)
256-
return {'data': tender.serialize(tender.status)}
256+
return {
257+
'data': tender.serialize(tender.status),
258+
'access': {
259+
'token': tender.owner_token
260+
}
261+
}
257262

258263
@view(renderer='json', validators=(validate_tender_exists,))
259264
def get(self):

0 commit comments

Comments
 (0)