Skip to content

Commit

Permalink
Fixed setting fields
Browse files Browse the repository at this point in the history
  • Loading branch information
kroman0 committed Jan 13, 2015
1 parent 3f23c8e commit 42d072d
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 11 deletions.
14 changes: 12 additions & 2 deletions src/openprocurement/api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from pytz import timezone
from pyramid.security import Allow
from schematics.exceptions import ConversionError, ValidationError
from schematics.models import Model
from schematics.transforms import whitelist, blacklist
from schematics.models import Model as SchematicsModel
from schematics.transforms import whitelist, blacklist, export_loop
from schematics.types import StringType, FloatType, IntType, URLType, BooleanType, BaseType, EmailType, MD5Type
from schematics.types.compound import ModelType, ListType, DictType
from schematics.types.serializable import serializable
Expand Down Expand Up @@ -61,6 +61,16 @@ def to_primitive(self, value, context=None):
return value.isoformat()


class Model(SchematicsModel):
def to_patch(self, role=None):
"""Return data as it would be validated. No filtering of output unless
role is defined.
"""
field_converter = lambda field, value: field.to_primitive(value)
data = export_loop(self.__class__, self, field_converter, role=role, raise_error_on_role=True, print_none=True)
return data


class Value(Model):
class Options:
serialize_when_none = False
Expand Down
5 changes: 4 additions & 1 deletion src/openprocurement/api/tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class BaseTenderWebTest(BaseWebTest):
initial_status = None
initial_bids = None

def set_status(self, status):
def set_status(self, status, extra=None):
data = {'status': status}
if status == 'active.enquiries':
data.update({
Expand Down Expand Up @@ -194,12 +194,15 @@ def set_status(self, status):
"endDate": (now - timedelta(days=10)).isoformat()
}
})
if extra:
data.update(extra)
authorization = self.app.authorization
self.app.authorization = ('Basic', ('chronograph', ''))
response = self.app.patch_json('/tenders/{}'.format(self.tender_id), {'data': data})
self.app.authorization = authorization
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
return response

def setUp(self):
super(BaseTenderWebTest, self).setUp()
Expand Down
19 changes: 17 additions & 2 deletions src/openprocurement/api/tests/tender.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import unittest
from datetime import timedelta

from openprocurement.api.models import Tender, get_now
from openprocurement.api.tests.base import test_tender_data, BaseWebTest, BaseTenderWebTest
Expand Down Expand Up @@ -405,6 +406,18 @@ def test_patch_tender(self):
owner_token = response.json['access']['token']
dateModified = tender.pop('dateModified')

response = self.app.patch_json('/tenders/{}'.format(
tender['id']), {'data': {'tenderPeriod': {'startDate': None}}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertNotIn('startDate', response.json['data']['tenderPeriod'])

response = self.app.patch_json('/tenders/{}'.format(
tender['id']), {'data': {'tenderPeriod': {'startDate': tender['enquiryPeriod']['endDate']}}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertIn('startDate', response.json['data']['tenderPeriod'])

response = self.app.patch_json('/tenders/{}'.format(
tender['id']), {'data': {'procurementMethod': 'Open'}})
self.assertEqual(response.status, '200 OK')
Expand Down Expand Up @@ -586,13 +599,15 @@ def test_one_valid_bid_tender(self):
tender_id = self.tender_id = response.json['data']['id']
owner_token = response.json['access']['token']
# switch to active.tendering
self.set_status('active.tendering')
response = self.set_status('active.tendering', {"auctionPeriod": {"startDate": (get_now() + timedelta(days=10)).isoformat()}})
self.assertIn("auctionPeriod", response.json['data'])
# create bid
self.app.authorization = ('Basic', ('broker', ''))
response = self.app.post_json('/tenders/{}/bids'.format(tender_id),
{'data': {'tenderers': [test_tender_data["procuringEntity"]], "value": {"amount": 500}}})
# switch to active.qualification
self.set_status('active.qualification')
response = self.set_status('active.qualification', {"auctionPeriod": {"startDate": None}})
self.assertNotIn("auctionPeriod", response.json['data'])
# get awards
self.app.authorization = ('Basic', ('broker', ''))
response = self.app.get('/tenders/{}/awards?acc_token={}'.format(tender_id, owner_token))
Expand Down
8 changes: 4 additions & 4 deletions src/openprocurement/api/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ def validate_data(request, model, partial=False):
m.import_data(new_patch)
m.validate()
if request.authenticated_role == 'chronograph':
data = m.serialize('chronograph')
data = m.to_patch('chronograph')
elif request.authenticated_role == 'auction':
data = m.serialize('auction_{}'.format(request.method.lower()))
data = m.to_patch('auction_{}'.format(request.method.lower()))
elif isinstance(request.context, Tender):
data = m.serialize('edit_{}'.format(request.context.status))
data = m.to_patch('edit_{}'.format(request.context.status))
else:
data = m.serialize('edit')
data = m.to_patch('edit')
elif partial:
m = model(data)
m.validate(partial=partial)
Expand Down
2 changes: 1 addition & 1 deletion src/openprocurement/api/views/question.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def collection_post(self):
"""Post a question
"""
tender = self.request.validated['tender']
if tender.status != 'active.enquiries' or get_now() > tender.enquiryPeriod.endDate:
if tender.status != 'active.enquiries' or get_now() < tender.enquiryPeriod.startDate or get_now() > tender.enquiryPeriod.endDate:
self.request.errors.add('body', 'data', 'Can add question only in enquiryPeriod')
self.request.errors.status = 403
return
Expand Down
3 changes: 2 additions & 1 deletion src/openprocurement/api/views/tender.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,8 @@ def collection_post(self):
tender_id = generate_id()
tender = Tender(tender_data)
tender.id = tender_id
tender.enquiryPeriod.startDate = get_now()
if not tender.enquiryPeriod.startDate:
tender.enquiryPeriod.startDate = get_now()
tender.tenderID = generate_tender_id(tender.enquiryPeriod.startDate, self.db)
if not tender.tenderPeriod.startDate:
tender.tenderPeriod.startDate = tender.enquiryPeriod.endDate
Expand Down

0 comments on commit 42d072d

Please sign in to comment.