Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/a245493633932394_remove_features'
Browse files Browse the repository at this point in the history
  • Loading branch information
kroman0 committed Jan 17, 2017
2 parents 6e3e38b + 9744ab1 commit 01bcfcc
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 2 deletions.
12 changes: 12 additions & 0 deletions openprocurement/tender/openua/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from schematics.types.compound import ModelType
from schematics.types.serializable import serializable
from openprocurement.api.models import Award as BaseAward
from openprocurement.api.models import Parameter as BaseParameter
from openprocurement.api.models import Bid as BaseBid
from openprocurement.api.models import Complaint as BaseComplaint
from openprocurement.api.models import ListType
Expand All @@ -29,6 +30,7 @@
embedded_lot_role, default_lot_role, calc_auction_end_time, get_tender,
ComplaintModelType, validate_cpv_group, validate_items_uniq, Model,
rounding_shouldStartAfter, PeriodEndRequired as BasePeriodEndRequired,
validate_parameters_uniq,
)
from openprocurement.api.models import ITender
from openprocurement.tender.openua.utils import (
Expand Down Expand Up @@ -61,6 +63,8 @@ def calculate_normalized_date(dt, tender, ceil=False):

def bids_validation_wrapper(validation_func):
def validator(klass, data, value):
while not isinstance(data['__parent__'], Tender):
data = data['__parent__']
if data['status'] in ('deleted', 'invalid', 'draft'):
# skip not valid bids
return
Expand Down Expand Up @@ -236,6 +240,13 @@ def validate_relatedLot(self, data, relatedLot):
if isinstance(data['__parent__'], Model) and (data['__parent__'].status not in ('invalid', 'deleted')) and relatedLot not in [i.id for i in get_tender(data['__parent__']).lots]:
raise ValidationError(u"relatedLot should be one of lots")

class Parameter(BaseParameter):

@bids_validation_wrapper
def validate_code(self, data, code):
BaseParameter._validator_functions['code'](self, data, code)


class Bid(BaseBid):

class Options:
Expand Down Expand Up @@ -265,6 +276,7 @@ class Options:
status = StringType(choices=['draft', 'active', 'invalid', 'deleted'], default='active')
selfQualified = BooleanType(required=True, choices=[True])
selfEligible = BooleanType(required=True, choices=[True])
parameters = ListType(ModelType(Parameter), default=list(), validators=[validate_parameters_uniq])

def serialize(self, role=None):
if role and self.status in ['invalid', 'deleted']:
Expand Down
4 changes: 2 additions & 2 deletions openprocurement/tender/openua/tests/lot.py
Original file line number Diff line number Diff line change
Expand Up @@ -1043,8 +1043,8 @@ def test_create_tender_bidder_invalid(self):
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['status'], 'error')
self.assertEqual(response.json['errors'], [
{u'description': [u'All features parameters is required.'], u'location': u'body', u'name': u'parameters'},
{u'description': [u'This field is required.'], u'location': u'body', u'name': u'lotValues'}
{u'description': [u'This field is required.'], u'location': u'body', u'name': u'lotValues'},
{u'description': [u'All features parameters is required.'], u'location': u'body', u'name': u'parameters'}
])

response = self.app.post_json(request_path, {'data': {'selfEligible': True, 'selfQualified': True,
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 @@ -1241,6 +1241,62 @@ def test_invalid_tender_conditions(self):
response = self.app.get('/tenders/{}'.format(tender_id))
self.assertEqual(response.json['data']['status'], 'cancelled')

def test_invalid_bid_tender_features(self):
self.app.authorization = ('Basic', ('broker', ''))
# empty tenders listing
response = self.app.get('/tenders')
self.assertEqual(response.json['data'], [])
# create tender
data = deepcopy(test_tender_data)
data['features'] = [
{
"code": "OCDS-123454-POSTPONEMENT",
"featureOf": "tenderer",
"title": u"Відстрочка платежу",
"description": u"Термін відстрочки платежу",
"enum": [
{
"value": 0.05,
"title": u"До 90 днів"
},
{
"value": 0.1,
"title": u"Більше 90 днів"
}
]
}
]
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']
tender_id = self.tender_id = response.json['data']['id']
owner_token = response.json['access']['token']

# create bid
self.app.authorization = ('Basic', ('broker', ''))
response = self.app.post_json('/tenders/{}/bids'.format(tender_id),
{'data': {'selfEligible': True, 'selfQualified': True,
'parameters': [{"code": "OCDS-123454-POSTPONEMENT" ,"value": 0.1}],
'tenderers': [test_organization], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
bid_id = response.json['data']['id']
bid_token = response.json['access']['token']

response = self.app.patch_json('/tenders/{}?acc_token={}'.format(tender_id, owner_token), {"data": {"features": []}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertNotIn("features",response.json['data'])

# switch to active.qualification
self.set_status('active.auction', {"auctionPeriod": {"startDate": None}, 'status': 'active.tendering'})
self.app.authorization = ('Basic', ('chronograph', ''))
response = self.app.patch_json('/tenders/{}'.format(tender_id), {"data": {"id": tender_id}})
self.assertEqual(response.json['data']['status'], 'unsuccessful')
self.assertNotEqual(response.json['data']['date'], tender['date'])

def test_one_valid_bid_tender_ua(self):
self.app.authorization = ('Basic', ('broker', ''))
# empty tenders listing
Expand Down

0 comments on commit 01bcfcc

Please sign in to comment.