Skip to content

Commit

Permalink
Added 2PC
Browse files Browse the repository at this point in the history
  • Loading branch information
kroman0 committed Apr 29, 2016
1 parent ff8160f commit c407a77
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 4 deletions.
6 changes: 4 additions & 2 deletions openprocurement/tender/openua/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
auction_view_role, auction_post_role, auction_patch_role, enquiries_role,
auction_role, chronograph_role, chronograph_view_role, view_bid_role,
Administrator_bid_role, Administrator_role, schematics_default_role,
TZ, get_now, schematics_embedded_role, validate_lots_uniq,
TZ, get_now, schematics_embedded_role, validate_lots_uniq, draft_role,
embedded_lot_role, default_lot_role, calc_auction_end_time, get_tender,
ComplaintModelType, validate_cpv_group, validate_items_uniq, Model,
)
Expand Down Expand Up @@ -400,6 +400,7 @@ class Options:
'plain': plain_role,
'create': create_role,
'edit': edit_role_ua,
'edit_draft': draft_role,
'edit_active.tendering': edit_role_ua,
'edit_active.auction': whitelist(),
'edit_active.qualification': whitelist(),
Expand All @@ -412,6 +413,7 @@ class Options:
'auction_view': auction_view_role,
'auction_post': auction_post_role,
'auction_patch': auction_patch_role,
'draft': enquiries_role,
'active.tendering': enquiries_role,
'active.auction': auction_role,
'active.qualification': view_role,
Expand All @@ -436,7 +438,7 @@ class Options:
complaints = ListType(ComplaintModelType(Complaint), default=list())
procurementMethodType = StringType(default="aboveThresholdUA")
lots = ListType(ModelType(Lot), default=list(), validators=[validate_lots_uniq])
status = StringType(choices=['active.tendering', 'active.auction', 'active.qualification', 'active.awarded', 'complete', 'cancelled', 'unsuccessful'], default='active.tendering')
status = StringType(choices=['draft', 'active.tendering', 'active.auction', 'active.qualification', 'active.awarded', 'complete', 'cancelled', 'unsuccessful'], default='active.tendering')
items = ListType(ModelType(Item), required=True, min_size=1, validators=[validate_cpv_group, validate_items_uniq]) # The goods and services to be purchased, broken into line items wherever possible. Items should not be duplicated, but a quantity of 2 specified instead.
cancellations = ListType(ModelType(Cancellation), default=list())

Expand Down
56 changes: 56 additions & 0 deletions openprocurement/tender/openua/tests/tender.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,38 @@ def test_listing_changes(self):
self.assertEqual(response.status, '200 OK')
self.assertEqual(len(response.json['data']), 4)

def test_listing_draft(self):
response = self.app.get('/tenders')
self.assertEqual(response.status, '200 OK')
self.assertEqual(len(response.json['data']), 0)

tenders = []
data = test_tender_data.copy()
data.update({'status': 'draft'})

for i in range(3):
response = self.app.post_json('/tenders', {'data': test_tender_data})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
tenders.append(response.json['data'])
response = self.app.post_json('/tenders', {'data': data})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')

ids = ','.join([i['id'] for i in tenders])

while True:
response = self.app.get('/tenders')
self.assertTrue(ids.startswith(','.join([i['id'] for i in response.json['data']])))
if len(response.json['data']) == 3:
break

self.assertEqual(len(response.json['data']), 3)
self.assertEqual(set(response.json['data'][0]), set([u'id', u'dateModified']))
self.assertEqual(set([i['id'] for i in response.json['data']]), set([i['id'] for i in tenders]))
self.assertEqual(set([i['dateModified'] for i in response.json['data']]), set([i['dateModified'] for i in tenders]))
self.assertEqual([i['dateModified'] for i in response.json['data']], sorted([i['dateModified'] for i in tenders]))

def test_create_tender_invalid(self):
request_path = '/tenders'
response = self.app.post(request_path, 'data', status=415)
Expand Down Expand Up @@ -539,6 +571,30 @@ def test_create_tender_generated(self):
self.assertNotEqual(data['doc_id'], tender['id'])
self.assertNotEqual(data['tenderID'], tender['tenderID'])

def test_create_tender_draft(self):
data = test_tender_data.copy()
data.update({'status': 'draft'})
response = self.app.post_json('/tenders', {'data': data})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
tender = response.json['data']
owner_token = response.json['access']['token']
self.assertEqual(tender['status'], 'draft')

response = self.app.patch_json('/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': {'value': {'amount': 100}}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': u"Can't update tender in current (draft) status", u'location': u'body', u'name': u'data'}
])

response = self.app.patch_json('/tenders/{}?acc_token={}'.format(tender['id'], owner_token), {'data': {'status': 'active.tendering'}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
tender = response.json['data']
self.assertEqual(tender['status'], 'active.tendering')

def test_create_tender(self):
response = self.app.get('/tenders')
self.assertEqual(response.status, '200 OK')
Expand Down
13 changes: 11 additions & 2 deletions openprocurement/tender/openua/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,18 @@

def validate_patch_tender_ua_data(request):
data = validate_json_data(request)
items = request.context.items
if request.context.status == 'draft':
default_status = type(request.tender).fields['status'].default
if data.get('status') != default_status:
request.errors.add('body', 'data', 'Can\'t update tender in current (draft) status')
request.errors.status = 403
return
request.validated['data'] = {}
request.context.status = default_status
return
if data:
if 'items' in data:
items = request.context.items
cpv_group_lists = [i.classification.id[:3] for i in items]
for item in data['items']:
if 'classification' in item and 'id' in item['classification']:
Expand All @@ -20,4 +29,4 @@ def validate_patch_tender_ua_data(request):
request.errors.status = 403
return None

return validate_data(request, request.tender.__class__, True, data)
return validate_data(request, type(request.tender), True, data)

0 comments on commit c407a77

Please sign in to comment.