Skip to content

Commit

Permalink
Merge pull request #17 from gorserg/add_bid_views
Browse files Browse the repository at this point in the history
add bid views, add validation for new bid
add views for EU FinancialDocument, EligibilityDocument, QualificationDocument
now functions prepare_shortlistedFirms and prepare_bid_identifier return set
If set with bid exist in set with firms then broker can create bid
  • Loading branch information
kroman0 committed Jul 18, 2016
2 parents c947644 + 0ed8bf3 commit 715a78d
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 1 deletion.
81 changes: 80 additions & 1 deletion openprocurement/tender/competitivedialogue/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@
from openprocurement.tender.openeu.models import PREQUALIFICATION_COMPLAINT_STAND_STILL as COMPLAINT_STAND_STILL
from openprocurement.tender.openua.utils import BLOCK_COMPLAINT_STATUS, check_complaint_status
from openprocurement.tender.openeu.utils import prepare_qualifications
from openprocurement.api.utils import (
save_tender,
set_ownership as api_set_ownership,
apply_patch,
context_unpack,
generate_id,
)

from barbecue import vnmax

LOGGER = getLogger(__name__)
Expand Down Expand Up @@ -177,4 +185,75 @@ def check_status(request):
return

def set_ownership(item):
item.owner_token = generate_id()
item.owner_token = generate_id()


def prepare_shortlistedFirms(shortlistedFirms):
""" Make list with keys
key = {identifier_id}_{identifier_scheme}_{lot_id}
"""
all_keys = set()
for firm in shortlistedFirms:
key = "{firm_id}_{firm_scheme}".format(firm_id=firm['identifier']['id'], firm_scheme=firm['identifier']['scheme'])
if firm.get('lots'):
keys = set(["{key}_{lot_id}".format(key=key, lot_id=lot['id']) for lot in firm.get('lots')])
else:
keys = set([key])
all_keys |= keys
return all_keys


def prepare_bid_identifier(bid):
""" Make list with keys
key = {identifier_id}_{identifier_scheme}_{lot_id}
"""
all_keys = set()
for tenderer in bid['tenderers']:
key = '{id}_{scheme}'.format(id=tenderer['identifier']['id'], scheme=tenderer['identifier']['scheme'])
if bid.get('lotValues'):
keys = set(['{key}_{lot_id}'.format(key=key, lot_id=lot['relatedLot']) for lot in bid.get('lotValues')])
else:
keys = set([key])
all_keys |= keys
return all_keys


def stage2_bid_post(self):
tender = self.request.validated['tender']
if self.request.validated['tender_status'] != 'active.tendering':
self.request.errors.add('body', 'data', 'Can\'t add bid in current ({}) tender status'.format(
self.request.validated['tender_status']))
self.request.errors.status = 403
return
if tender.tenderPeriod.startDate and \
get_now() < tender.tenderPeriod.startDate or \
get_now() > tender.tenderPeriod.endDate:
self.request.errors.add('body', 'data',
'Bid can be added only during the tendering period: from ({}) to ({}).'.format(
tender.tenderPeriod.startDate, tender.tenderPeriod.endDate))
self.request.errors.status = 403
return
bid = self.request.validated['bid']
firm_keys = prepare_shortlistedFirms(tender.shortlistedFirms)
bid_keys = prepare_bid_identifier(bid)
if not (bid_keys <= firm_keys):
self.request.errors.add('body', 'data', 'Firm can\'t create bid')
self.request.errors.status = 403
return

tender.modified = False
api_set_ownership(bid, self.request)
tender.bids.append(bid)
if save_tender(self.request):
self.LOGGER.info('Created tender bid {}'.format(bid.id),
extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_bid_create'},
{'bid_id': bid.id}))
self.request.response.status = 201
self.request.response.headers['Location'] = self.request.route_url('Tender Bids', tender_id=tender.id,
bid_id=bid['id'])
return {
'data': bid.serialize('view'),
'access': {
'token': bid.owner_token
}
}
38 changes: 38 additions & 0 deletions openprocurement/tender/competitivedialogue/views/stage2/bid.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
from openprocurement.tender.openeu.views.bid import TenderBidResource as BaseResourceEU
from openprocurement.tender.openua.views.bid import TenderBidResource as BaseResourceUA
from openprocurement.tender.competitivedialogue.models import STAGE_2_UA_TYPE, STAGE_2_EU_TYPE
from openprocurement.tender.competitivedialogue.utils import stage2_bid_post
from openprocurement.api.utils import (
opresource,
json_view,
)
from openprocurement.api.validation import (
validate_bid_data
)


@opresource(name='Competitive Dialogue Stage2 EU Bids',
collection_path='/tenders/{tender_id}/bids',
path='/tenders/{tender_id}/bids/{bid_id}',
procurementMethodType=STAGE_2_EU_TYPE,
description="Competitive Dialogue Stage2EU bids")
class CompetitiveDialogueStage2EUBidResource(BaseResourceEU):
""" Tender Stage2 EU bids """

@json_view(content_type="application/json", permission='create_bid', validators=(validate_bid_data,))
def collection_post(self):
return stage2_bid_post(self)


@opresource(name='Competitive Dialogue Stage2 UA Bids',
collection_path='/tenders/{tender_id}/bids',
path='/tenders/{tender_id}/bids/{bid_id}',
procurementMethodType=STAGE_2_UA_TYPE,
description="Competitive Dialogue Stage2 UA bids")
class CompetitiveDialogueStage2UABidResource(BaseResourceUA):
""" Tender Stage2 UA Stage2 bids """

@json_view(content_type="application/json", permission='create_bid', validators=(validate_bid_data,))
def collection_post(self):
return stage2_bid_post(self)
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
from openprocurement.api.utils import opresource
from openprocurement.tender.openeu.views.bid_document import (
bid_financial_documents_resource,
bid_eligibility_documents_resource,
bid_qualification_documents_resource,
TenderEUBidDocumentResource,
TenderEUBidFinancialDocumentResource,
TenderEUBidEligibilityDocumentResource,
TenderEUBidQualificationDocumentResource
)
from openprocurement.tender.openua.views.bid_document import TenderUaBidDocumentResource
from openprocurement.tender.competitivedialogue.models import STAGE_2_UA_TYPE, STAGE_2_EU_TYPE


@opresource(
name='Competitive Dialogue Stage2 EU Bid Documents',
collection_path='/tenders/{tender_id}/bids/{bid_id}/documents',
path='/tenders/{tender_id}/bids/{bid_id}/documents/{document_id}',
procurementMethodType=STAGE_2_EU_TYPE,
description="Competitive Dialogue Stage2 EU bidder documents")
class CompetitiveDialogueStage2EUBidDocumentResource(TenderEUBidDocumentResource):
pass


@opresource(
name='Competitive Dialogue Stage2 UA Bid Documents',
collection_path='/tenders/{tender_id}/bids/{bid_id}/documents',
path='/tenders/{tender_id}/bids/{bid_id}/documents/{document_id}',
procurementMethodType=STAGE_2_UA_TYPE,
description="Competitive Dialogue Stage2 UA bidder documents")
class CompetitiveDialogueStage2UaBidDocumentResource(TenderUaBidDocumentResource):
pass


@bid_financial_documents_resource(
name='Competitive Dialogue Stage2 EU Bid Financial Documents',
collection_path='/tenders/{tender_id}/bids/{bid_id}/financial_documents',
path='/tenders/{tender_id}/bids/{bid_id}/financial_documents/{document_id}',
procurementMethodType=STAGE_2_EU_TYPE,
description="Competitive Dialogue Stage2 EU bidder financial documents")
class CompetitiveDialogueStage2EUBidFinancialDocumentResource(TenderEUBidFinancialDocumentResource):
pass


@bid_eligibility_documents_resource(
name='Competitive Dialogue Stage2 EU Bid Eligibility Documents',
collection_path='/tenders/{tender_id}/bids/{bid_id}/eligibility_documents',
path='/tenders/{tender_id}/bids/{bid_id}/eligibility_documents/{document_id}',
procurementMethodType=STAGE_2_EU_TYPE,
description="Competitive Dialogue Stage2 EU bidder eligibility documents")
class CompetitiveDialogueStage2EUBidEligibilityDocumentResource(TenderEUBidEligibilityDocumentResource):
pass


@bid_qualification_documents_resource(
name='Competitive Dialogue Stage2 EU Bid Qualification Documents',
collection_path='/tenders/{tender_id}/bids/{bid_id}/qualification_documents',
path='/tenders/{tender_id}/bids/{bid_id}/qualification_documents/{document_id}',
procurementMethodType=STAGE_2_EU_TYPE,
description="Competitive Dialogue Stage2 EU bidder qualification documents")
class CompetitiveDialogueStage2EUBidQualificationDocumentResource(TenderEUBidQualificationDocumentResource):
pass

0 comments on commit 715a78d

Please sign in to comment.