Skip to content

Commit

Permalink
Invalidate on update lots and upload documentaion
Browse files Browse the repository at this point in the history
  • Loading branch information
ktarasz committed Jan 19, 2016
1 parent f66ffb1 commit f1ab0a2
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 38 deletions.
13 changes: 5 additions & 8 deletions openprocurement/tender/openua/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
TZ, get_now, schematics_embedded_role,
)
from openprocurement.tender.openua.interfaces import ITenderUA
from schematics.exceptions import ConversionError, ValidationError
from schematics.exceptions import ValidationError
from openprocurement.tender.openua.utils import calculate_buisness_date
from schematics.types.serializable import serializable


def bids_validation_wrapper(validation_func):
def validator(klass, data, value):
if data['status'] in ('deleted', 'invalidBid'):
Expand Down Expand Up @@ -200,10 +201,10 @@ class Options:

def validate_enquiryPeriod(self, data, period):
if period and calculate_buisness_date(period.endDate, -timedelta(days=12)) < period.startDate:
raise ValidationError(u"enquiryPeriod should be greater than 12 days")
raise ValidationError(u"enquiryPeriod should be greater than 12 days")

def validate_tenderPeriod(self, data, period):
if period and calculate_buisness_date(period.endDate, -timedelta(days=15)) < period.startDate:
if period and calculate_buisness_date(period.endDate, -timedelta(days=15)) < period.startDate:
raise ValidationError(u"tenderPeriod should be greater than 15 days")

def initialize(self):
Expand All @@ -216,11 +217,7 @@ def initialize(self):
def next_check(self):
now = get_now()
checks = []
if self.status == 'active.enquiries' and self.tenderPeriod.startDate:
checks.append(self.tenderPeriod.startDate.astimezone(TZ))
elif self.status == 'active.enquiries' and self.enquiryPeriod.endDate:
checks.append(self.enquiryPeriod.endDate.astimezone(TZ))
elif self.status == 'active.tendering' and self.tenderPeriod.endDate:
if self.status == 'active.tendering' and self.tenderPeriod.endDate:
checks.append(self.tenderPeriod.endDate.astimezone(TZ))
elif not self.lots and self.status == 'active.awarded':
standStillEnds = [
Expand Down
41 changes: 26 additions & 15 deletions openprocurement/tender/openua/views/lot.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from datetime import timedelta
from logging import getLogger
from openprocurement.api.views.lot import TenderLotResource

Expand All @@ -7,18 +8,18 @@
save_tender,
opresource,
json_view,
context_unpack,
context_unpack
)
from openprocurement.api.validation import (
validate_lot_data,
validate_patch_lot_data,
)

from openprocurement.api.models import get_now
from openprocurement.tender.openua.utils import calculate_buisness_date

LOGGER = getLogger(__name__)


# TODO: Remove COPY&PASTE (diff in tender.status not in ['active.tendering'])

@opresource(name='Tender UA Lots',
collection_path='/tenders/{tender_id}/lots',
Expand All @@ -27,16 +28,31 @@
description="Tender Ua lots")
class TenderUaLotResource(TenderLotResource):

def validate_update_tender(self, operation):
tender = self.request.validated['tender']
if tender.status not in ['active.tendering']:
self.request.errors.add('body', 'data', 'Can\'t {} lot in current ({}) tender status'.format(operation, tender.status))
self.request.errors.status = 403
return
if self.request.authenticated_role == 'tender_owner' and self.request.validated['tender_status'] == 'active.tendering':
if calculate_buisness_date(get_now(), timedelta(days=4)) >= tender.enquiryPeriod.endDate:
self.request.errors.add('body', 'data', 'enquiryPeriod should be extended by 4 days')
self.request.errors.status = 403
return
elif calculate_buisness_date(get_now(), timedelta(days=7)) >= tender.tenderPeriod.endDate:
self.request.errors.add('body', 'data', 'tenderPeriod should be extended by 7 days')
self.request.errors.status = 403
return
return True

@json_view(content_type="application/json", validators=(validate_lot_data,), permission='edit_tender')
def collection_post(self):
"""Add a lot
"""
tender = self.request.validated['tender']
if tender.status not in ['active.tendering']:
self.request.errors.add('body', 'data', 'Can\'t add lot in current ({}) tender status'.format(tender.status))
self.request.errors.status = 403
if not self.validate_update_tender('add'):
return
lot = self.request.validated['lot']
tender = self.request.validated['tender']
tender.lots.append(lot)
if save_tender(self.request):
LOGGER.info('Created tender lot {}'.format(lot.id),
Expand All @@ -49,10 +65,7 @@ def collection_post(self):
def patch(self):
"""Update of lot
"""
tender = self.request.validated['tender']
if tender.status not in ['active.tendering']:
self.request.errors.add('body', 'data', 'Can\'t update lot in current ({}) tender status'.format(tender.status))
self.request.errors.status = 403
if not self.validate_update_tender('update'):
return
if apply_patch(self.request, src=self.request.context.serialize()):
LOGGER.info('Updated tender lot {}'.format(self.request.context.id),
Expand All @@ -63,13 +76,11 @@ def patch(self):
def delete(self):
"""Lot deleting
"""
tender = self.request.validated['tender']
if tender.status not in ['active.tendering']:
self.request.errors.add('body', 'data', 'Can\'t delete lot in current ({}) tender status'.format(tender.status))
self.request.errors.status = 403
if not self.validate_update_tender('delete'):
return
lot = self.request.context
res = lot.serialize("view")
tender = self.request.validated['tender']
tender.lots.remove(lot)
if save_tender(self.request):
LOGGER.info('Deleted tender lot {}'.format(self.request.context.id),
Expand Down
3 changes: 1 addition & 2 deletions openprocurement/tender/openua/views/tender.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# -*- coding: utf-8 -*-
from logging import getLogger
from openprocurement.api.views.tender import TenderResource
from openprocurement.api.validation import validate_patch_tender_data, validate_tender_data
from openprocurement.tender.openua.utils import get_invalidated_bids_data, calculate_buisness_date
from openprocurement.api.validation import validate_patch_tender_data
from openprocurement.tender.openua.utils import (
get_invalidated_bids_data,
check_status,
calculate_buisness_date
)
from openprocurement.api.utils import (
save_tender,
Expand Down
38 changes: 25 additions & 13 deletions openprocurement/tender/openua/views/tender_document.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,45 @@
# -*- coding: utf-8 -*-
from datetime import timedelta
from logging import getLogger
from openprocurement.api.utils import opresource, upload_file, context_unpack, save_tender, json_view, apply_patch, update_file_content_type
from openprocurement.api.views.tender_document import TenderDocumentResource
from openprocurement.api.validation import validate_file_upload, validate_file_update, validate_patch_document_data
from openprocurement.api.models import get_now

from openprocurement.tender.openua.utils import calculate_buisness_date
LOGGER = getLogger(__name__)


@opresource(name='Tender UA Documents',
collection_path='/tenders/{tender_id}/documents',
path='/tenders/{tender_id}/documents/{document_id}',
procurementMethodType='aboveThresholdUA',
description="Tender related binary files (PDFs, etc.)")
description="Tender UA related binary files (PDFs, etc.)")
class TenderUaDocumentResource(TenderDocumentResource):

@json_view(permission='upload_tender_documents', validators=(validate_file_upload,))
def collection_post(self):
"""Tender Document Upload"""
def validate_update_tender(self, operation):
tender = self.request.validated['tender']
if self.request.authenticated_role != 'auction' and self.request.validated['tender_status'] != 'active.tendering' or \
self.request.authenticated_role == 'auction' and self.request.validated['tender_status'] not in ['active.auction', 'active.qualification']:
self.request.errors.add('body', 'data', 'Can\'t add document in current ({}) tender status'.format(self.request.validated['tender_status']))
self.request.errors.add('body', 'data', 'Can\'t {} document in current ({}) tender status'.format(operation, self.request.validated['tender_status']))
self.request.errors.status = 403
return
if self.request.authenticated_role == 'tender_owner' and self.request.validated['tender_status'] == 'active.tendering':
if calculate_buisness_date(get_now(), timedelta(days=4)) >= tender.enquiryPeriod.endDate:
self.request.errors.add('body', 'data', 'enquiryPeriod should be extended by 4 days')
self.request.errors.status = 403
return
elif calculate_buisness_date(get_now(), timedelta(days=7)) >= tender.tenderPeriod.endDate:
self.request.errors.add('body', 'data', 'tenderPeriod should be extended by 7 days')
self.request.errors.status = 403
return
return True

@json_view(permission='upload_tender_documents', validators=(validate_file_upload,))
def collection_post(self):
"""Tender Document Upload"""
if not self.validate_update_tender('add'):
return
document = upload_file(self.request)
self.context.documents.append(document)
if save_tender(self.request):
Expand All @@ -35,10 +53,7 @@ def collection_post(self):
@json_view(permission='upload_tender_documents', validators=(validate_file_update,))
def put(self):
"""Tender Document Update"""
if self.request.authenticated_role != 'auction' and self.request.validated['tender_status'] != 'active.tendering' or \
self.request.authenticated_role == 'auction' and self.request.validated['tender_status'] not in ['active.auction', 'active.qualification']:
self.request.errors.add('body', 'data', 'Can\'t update document in current ({}) tender status'.format(self.request.validated['tender_status']))
self.request.errors.status = 403
if not self.validate_update_tender('update'):
return
document = upload_file(self.request)
self.request.validated['tender'].documents.append(document)
Expand All @@ -50,10 +65,7 @@ def put(self):
@json_view(content_type="application/json", permission='upload_tender_documents', validators=(validate_patch_document_data,))
def patch(self):
"""Tender Document Update"""
if self.request.authenticated_role != 'auction' and self.request.validated['tender_status'] != 'active.tendering' or \
self.request.authenticated_role == 'auction' and self.request.validated['tender_status'] not in ['active.auction', 'active.qualification']:
self.request.errors.add('body', 'data', 'Can\'t update document in current ({}) tender status'.format(self.request.validated['tender_status']))
self.request.errors.status = 403
if not self.validate_update_tender('update'):
return
if apply_patch(self.request, src=self.request.context.serialize()):
update_file_content_type(self.request)
Expand Down

0 comments on commit f1ab0a2

Please sign in to comment.