Skip to content

Commit

Permalink
Merge branch 'a157335104845450_next_check'
Browse files Browse the repository at this point in the history
  • Loading branch information
kroman0 committed Aug 15, 2016
2 parents afef031 + b398253 commit c0c0d67
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 60 deletions.
47 changes: 31 additions & 16 deletions openprocurement/tender/openua/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
)
from openprocurement.api.models import ITender
from openprocurement.tender.openua.utils import (
calculate_business_date, BLOCK_COMPLAINT_STATUS,
calculate_business_date,
)

edit_role_ua = edit_role + blacklist('enquiryPeriod', 'status')
Expand Down Expand Up @@ -466,6 +466,8 @@ class Options:
create_accreditation = 3
edit_accreditation = 4
procuring_entity_kinds = ['general', 'special', 'defense']
block_tender_complaint_status = ['claim', 'pending', 'accepted', 'satisfied', 'stopping']
block_complaint_status = ['pending', 'accepted', 'satisfied', 'stopping']

def __acl__(self):
acl = [
Expand Down Expand Up @@ -522,7 +524,7 @@ def next_check(self):
now = get_now()
checks = []
if self.status == 'active.tendering' and self.tenderPeriod.endDate and \
not any([i.status in BLOCK_COMPLAINT_STATUS for i in self.complaints]) and \
not any([i.status in self.block_tender_complaint_status for i in self.complaints]) and \
not any([i.id for i in self.questions if not i.answer]):
checks.append(self.tenderPeriod.endDate.astimezone(TZ))
elif not self.lots and self.status == 'active.auction' and self.auctionPeriod and self.auctionPeriod.startDate and not self.auctionPeriod.endDate:
Expand All @@ -538,34 +540,47 @@ def next_check(self):
checks.append(lot.auctionPeriod.startDate.astimezone(TZ))
elif now < calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ):
checks.append(calc_auction_end_time(lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ))
elif not self.lots and self.status == 'active.awarded':
elif not self.lots and self.status == 'active.awarded' and not any([
i.status in self.block_complaint_status
for i in self.complaints
]) and not any([
i.status in self.block_complaint_status
for a in self.awards
for i in a.complaints
]):
standStillEnds = [
a.complaintPeriod.endDate.astimezone(TZ)
for a in self.awards
if a.complaintPeriod.endDate
]
if standStillEnds:
standStillEnd = max(standStillEnds)
if standStillEnd > now:
checks.append(standStillEnd)
elif self.lots and self.status in ['active.qualification', 'active.awarded']:
lots_ends = []
last_award_status = self.awards[-1].status if self.awards else ''
if standStillEnds and last_award_status == 'unsuccessful':
checks.append(max(standStillEnds))
elif self.lots and self.status in ['active.qualification', 'active.awarded'] and not any([
i.status in self.block_complaint_status and i.relatedLot is None
for i in self.complaints
]):
for lot in self.lots:
if lot['status'] != 'active':
continue
lot_awards = [i for i in self.awards if i.lotID == lot.id]
pending_complaints = any([
i['status'] in self.block_complaint_status and i.relatedLot == lot.id
for i in self.complaints
])
pending_awards_complaints = any([
i.status in self.block_complaint_status
for a in lot_awards
for i in a.complaints
])
standStillEnds = [
a.complaintPeriod.endDate.astimezone(TZ)
for a in lot_awards
if a.complaintPeriod.endDate
]
if not standStillEnds:
continue
standStillEnd = max(standStillEnds)
if standStillEnd > now:
lots_ends.append(standStillEnd)
if lots_ends:
checks.append(min(lots_ends))
last_award_status = lot_awards[-1].status if lot_awards else ''
if not pending_complaints and not pending_awards_complaints and standStillEnds and last_award_status == 'unsuccessful':
checks.append(max(standStillEnds))
return min(checks).isoformat() if checks else None

def invalidate_bids_data(self):
Expand Down
46 changes: 6 additions & 40 deletions openprocurement/tender/openua/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
from barbecue import chef
PKG = get_distribution(__package__)
LOGGER = getLogger(PKG.project_name)
BLOCK_COMPLAINT_STATUS = ['claim', 'pending', 'accepted', 'satisfied', 'stopping']
PENDING_COMPLAINT_STATUS = ['pending', 'accepted', 'satisfied', 'stopping']


def check_bids(request):
Expand All @@ -40,7 +38,7 @@ def check_status(request):
tender = request.validated['tender']
now = get_now()
if not tender.lots and tender.status == 'active.tendering' and tender.tenderPeriod.endDate <= now and \
not any([i.status in BLOCK_COMPLAINT_STATUS for i in tender.complaints]) and \
not any([i.status in tender.block_tender_complaint_status for i in tender.complaints]) and \
not any([i.id for i in tender.questions if not i.answer]):
for complaint in tender.complaints:
check_complaint_status(request, complaint)
Expand All @@ -53,7 +51,7 @@ def check_status(request):
tender.auctionPeriod.startDate = None
return
elif tender.lots and tender.status == 'active.tendering' and tender.tenderPeriod.endDate <= now and \
not any([i.status in BLOCK_COMPLAINT_STATUS for i in tender.complaints]) and \
not any([i.status in tender.block_tender_complaint_status for i in tender.complaints]) and \
not any([i.id for i in tender.questions if not i.answer]):
for complaint in tender.complaints:
check_complaint_status(request, complaint)
Expand All @@ -74,26 +72,9 @@ def check_status(request):
return
standStillEnd = max(standStillEnds)
if standStillEnd <= now:
pending_complaints = any([
i['status'] in PENDING_COMPLAINT_STATUS
for i in tender.complaints
])
pending_awards_complaints = any([
i['status'] in PENDING_COMPLAINT_STATUS
for a in tender.awards
for i in a.complaints
])
awarded = any([
i['status'] == 'active'
for i in tender.awards
])
if not pending_complaints and not pending_awards_complaints and not awarded:
LOGGER.info('Switched tender {} to {}'.format(tender.id, 'unsuccessful'),
extra=context_unpack(request, {'MESSAGE_ID': 'switched_tender_unsuccessful'}))
check_tender_status(request)
return
check_tender_status(request)
elif tender.lots and tender.status in ['active.qualification', 'active.awarded']:
if any([i['status'] in PENDING_COMPLAINT_STATUS and i.relatedLot is None for i in tender.complaints]):
if any([i['status'] in tender.block_complaint_status and i.relatedLot is None for i in tender.complaints]):
return
for lot in tender.lots:
if lot['status'] != 'active':
Expand All @@ -108,23 +89,8 @@ def check_status(request):
continue
standStillEnd = max(standStillEnds)
if standStillEnd <= now:
pending_complaints = any([
i['status'] in PENDING_COMPLAINT_STATUS and i.relatedLot == lot.id
for i in tender.complaints
])
pending_awards_complaints = any([
i['status'] in PENDING_COMPLAINT_STATUS
for a in lot_awards
for i in a.complaints
])
awarded = any([
i['status'] == 'active'
for i in lot_awards
])
if not pending_complaints and not pending_awards_complaints and not awarded:
LOGGER.info('Switched lot {} of tender {} to {}'.format(lot['id'], tender.id, 'unsuccessful'),
extra=context_unpack(request, {'MESSAGE_ID': 'switched_lot_unsuccessful'}, {'LOT_ID': lot['id']}))
check_tender_status(request)
check_tender_status(request)
return


def add_next_award(request):
Expand Down
5 changes: 2 additions & 3 deletions openprocurement/tender/openua/views/contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
save_tender,
)
from openprocurement.api.validation import validate_patch_contract_data
from openprocurement.tender.openua.utils import PENDING_COMPLAINT_STATUS


@opresource(name='Tender UA Contracts',
Expand Down Expand Up @@ -62,13 +61,13 @@ def patch(self):
pending_complaints = [
i
for i in tender.complaints
if i.status in PENDING_COMPLAINT_STATUS and i.relatedLot in [None, award.lotID]
if i.status in tender.block_complaint_status and i.relatedLot in [None, award.lotID]
]
pending_awards_complaints = [
i
for a in tender.awards
for i in a.complaints
if i.status in PENDING_COMPLAINT_STATUS and a.lotID == award.lotID
if i.status in tender.block_complaint_status and a.lotID == award.lotID
]
if pending_complaints or pending_awards_complaints:
self.request.errors.add('body', 'data', 'Can\'t sign contract before reviewing all complaints')
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
import os

version = '2.3.8'
version = '2.3.10'

requires = [
'setuptools',
Expand Down

0 comments on commit c0c0d67

Please sign in to comment.