Skip to content

Commit 1e877c8

Browse files
committed
Implement new awarding
1 parent 513456f commit 1e877c8

File tree

14 files changed

+243
-98
lines changed

14 files changed

+243
-98
lines changed

src/openprocurement/tender/pricequotation/models/award.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from openprocurement.api.models import\
44
schematics_default_role, schematics_embedded_role
55
from openprocurement.tender.core.models import BaseAward
6+
from openprocurement.tender.pricequotation.utils import get_bid_owned_award_acl
67

78

89
class Award(BaseAward):
@@ -18,9 +19,29 @@ class Options:
1819
"status", "title", "title_en", "title_ru",
1920
"description", "description_en", "description_ru"
2021
),
22+
"edit_tender_owner": whitelist(
23+
"status", "title", "title_en", "title_ru",
24+
"description", "description_en", "description_ru"
25+
),
26+
"edit_bid_owner": whitelist(
27+
"status", "title", "title_en", "title_ru",
28+
"description", "description_en", "description_ru"
29+
),
2130
"embedded": schematics_embedded_role,
2231
"view": schematics_default_role,
2332
"Administrator": whitelist(),
2433
}
2534

2635
bid_id = MD5Type(required=True)
36+
37+
def __acl__(self):
38+
return get_bid_owned_award_acl(self)
39+
40+
def get_role(self):
41+
root = self.get_root()
42+
request = root.request
43+
if request.authenticated_role in ("tender_owner", "bid_owner"):
44+
role = "edit_{}".format(request.authenticated_role)
45+
else:
46+
role = request.authenticated_role
47+
return role

src/openprocurement/tender/pricequotation/models/tender.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from schematics.types import IntType, StringType
66
from schematics.types.compound import ModelType
77
from schematics.types.serializable import serializable
8+
from pyramid.security import Allow
89
from zope.interface import implementer
910
from openprocurement.api.constants import TZ, CPV_ITEMS_CLASS_FROM
1011
from openprocurement.api.models import\
@@ -81,7 +82,6 @@ class Options:
8182
"tenderPeriod",
8283
"procuringEntity",
8384
"guarantee",
84-
"value",
8585
"minimalStep",
8686
)
8787
_edit_role = _core_roles["edit"] \
@@ -92,12 +92,16 @@ class Options:
9292
"profile"
9393
)
9494
_create_role = _core_roles["create"] + _edit_role
95-
_edit_pq_bot_role = whitelist("items", "shortlistedFirms", "status", "criteria", "value")
95+
_edit_pq_bot_role = whitelist(
96+
"items", "shortlistedFirms",
97+
"status", "criteria", "value",
98+
)
9699
_view_tendering_role = (
97100
_core_roles["view"]
98101
+ _edit_fields
99102
+ whitelist(
100103
"awards",
104+
'value',
101105
"awardPeriod",
102106
"cancellations",
103107
"contracts",
@@ -113,7 +117,7 @@ class Options:
113117
"edit": _edit_role,
114118
"edit_draft": _edit_role,
115119
"edit_draft.unsuccessful": _edit_role,
116-
"edit_draft.publishing": _all_forbidden,
120+
"edit_draft.publishing": _edit_pq_bot_role,
117121
"edit_active.tendering": _all_forbidden,
118122
"edit_active.qualification": _all_forbidden,
119123
"edit_active.awarded": _all_forbidden,
@@ -161,7 +165,7 @@ class Options:
161165
validators=[validate_items_uniq],
162166
)
163167
# The total estimated value of the procurement.
164-
value = ModelType(Value, required=True)
168+
value = ModelType(Value)
165169
# The period when the tender is open for submissions.
166170
# The end date is the closing date for tender submissions.
167171
tenderPeriod = ModelType(
@@ -211,8 +215,6 @@ def get_role(self):
211215
if request.authenticated_role in\
212216
("Administrator", "chronograph", "contracting", "bots"):
213217
role = request.authenticated_role
214-
elif request.authenticated_role == "auction":
215-
role = "auction_{}".format(request.method.lower())
216218
else:
217219
role = "edit_{}".format(request.context.status)
218220
return role
@@ -225,6 +227,12 @@ def next_check(self):
225227

226228
if self.status.startswith("active"):
227229
for award in self.awards:
230+
if award.status == 'pending':
231+
checks.append(
232+
calculate_tender_business_date(award.date,
233+
timedelta(days=2),
234+
self)
235+
)
228236
if award.status == "active" and not\
229237
any([i.awardID == award.id for i in self.contracts]):
230238
checks.append(award.date)
@@ -271,3 +279,16 @@ def validate_tenderPeriod(self, data, period):
271279
and period.endDate < calculate_tender_business_date(period.startDate, timedelta(days=2), data, True)
272280
):
273281
raise ValidationError(u"the tenderPeriod cannot end earlier than 2 business days after the start")
282+
283+
def __local_roles__(self):
284+
roles = dict([("{}_{}".format(self.owner, self.owner_token), "tender_owner")])
285+
for i in self.bids:
286+
roles["{}_{}".format(i.owner, i.owner_token)] = "bid_owner"
287+
return roles
288+
289+
def __acl__(self):
290+
acl = [
291+
(Allow, "g:bots", "upload_award_documents"),
292+
]
293+
self._acl_cancellation(acl)
294+
return acl

src/openprocurement/tender/pricequotation/tests/award.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
patch_tender_award,
1919
# patch_tender_award_unsuccessful,
2020
get_tender_award,
21-
# TenderLotAwardCheckResourceTest
2221
check_tender_award,
22+
check_tender_award_disqualification,
2323
# TenderAwardDocumentResourceTest
2424
not_found_award_document,
2525
create_tender_award_document,
@@ -51,10 +51,12 @@ class TenderAwardDocumentResourceTestMixin(object):
5151
class TenderAwardResourceTest(TenderContentWebTest, TenderAwardResourceTestMixin):
5252
initial_status = "active.qualification"
5353
initial_bids = test_bids
54+
maxAwards = 1
5455

5556
test_create_tender_award = snitch(create_tender_award)
5657
test_patch_tender_award = snitch(patch_tender_award)
5758
test_check_tender_award = snitch(check_tender_award)
59+
test_check_tender_award_disqualification = snitch(check_tender_award_disqualification)
5860

5961

6062
class TenderAwardResourceScaleTest(TenderContentWebTest):

0 commit comments

Comments
 (0)