Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions openprocurement/auctions/rubble/adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@
RubbleOther,
RubbleFinancial
)
from openprocurement.auctions.core.plugins.awarding.v2_1.adapters import (
AwardingV2_1ConfiguratorMixin
from openprocurement.auctions.core.plugins.awarding.v3_1.adapters import (
AwardingV3_1ConfiguratorMixin
)
from openprocurement.auctions.core.plugins.contracting.v3_1.adapters import (
ContractingV3_1ConfiguratorMixin
)


class AuctionRubbleOtherConfigurator(AuctionConfigurator,
AwardingV2_1ConfiguratorMixin):
AwardingV3_1ConfiguratorMixin,
ContractingV3_1ConfiguratorMixin):
name = 'Auction Rubble Configurator'
model = RubbleOther
pending_admission_for_one_bid = False
is_contract_signed_required = True


class AuctionRubbleFinancialConfigurator(AuctionConfigurator,
AwardingV2_1ConfiguratorMixin):
AwardingV3_1ConfiguratorMixin,
ContractingV3_1ConfiguratorMixin):
name = 'Auction Rubble Configurator'
model = RubbleFinancial

pending_admission_for_one_bid = False
is_contract_signed_required = True

class AuctionRubbleOtherManagerAdapter(AuctionManagerAdapter):

Expand Down
8 changes: 4 additions & 4 deletions openprocurement/auctions/rubble/includeme.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
get_evenly_plugins
)
from openprocurement.auctions.core.interfaces import IAuctionManager
from openprocurement.auctions.core.plugins.awarding.v2_1.adapters import (
AwardingNextCheckV2_1
from openprocurement.auctions.core.plugins.awarding.v3_1.adapters import (
AwardingNextCheckV3_1
)

from openprocurement.auctions.rubble.adapters import (
Expand Down Expand Up @@ -52,7 +52,7 @@ def includeme_other(config, plugin_map):
IContentConfigurator
)
config.registry.registerAdapter(
AwardingNextCheckV2_1,
AwardingNextCheckV3_1,
(IRubbleOtherAuction,),
IAwardingNextCheck
)
Expand Down Expand Up @@ -95,7 +95,7 @@ def includeme_financial(config, plugin_map):
IContentConfigurator
)
config.registry.registerAdapter(
AwardingNextCheckV2_1,
AwardingNextCheckV3_1,
(IRubbleFinancialAuction,),
IAwardingNextCheck
)
Expand Down
75 changes: 65 additions & 10 deletions openprocurement/auctions/rubble/migration.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# -*- coding: utf-8 -*-
import logging

from openprocurement.auctions.core.plugins.awarding.v2_1.migration import (
migrate_awarding_1_0_to_awarding_2_1
from openprocurement.auctions.core.plugins.awarding.v3.migration import (
migrate_awarding2_to_awarding3
)
from openprocurement.auctions.core.traversal import Root
from openprocurement.auctions.core.utils import (
get_plugins, get_procurement_method_types, get_now
get_now, get_plugins, get_procurement_method_types
)

LOGGER = logging.getLogger(__name__)
SCHEMA_VERSION = 1
SCHEMA_VERSION = 2
SCHEMA_DOC = 'openprocurement_auctions_dgf_schema'


Expand All @@ -26,7 +26,6 @@ def set_db_schema_version(db, version):


def migrate_data(registry, destination=None):
registry.app_meta.plugins
plugins_config = registry.app_meta.plugins
existing_plugins = get_plugins(plugins_config)
if registry.app_meta.plugins and not any(existing_plugins):
Expand All @@ -51,13 +50,15 @@ def __init__(self, registry):

request = Request(registry)
root = Root(request)
procurement_method_types = get_procurement_method_types(
registry, ['rubbleOther', 'rubbleFinancial']
)
procurement_method_types = get_procurement_method_types(registry, ('rubbleOther', 'rubbleFinancial'))

docs = []
for i in results:
auction = i.doc
migrate_awarding_1_0_to_awarding_2_1(auction, procurement_method_types)

changed = migrate_awarding2_to_awarding3(auction, registry.server_id, procurement_method_types)
if not changed:
continue
model = registry.auction_procurementMethodTypes.get(auction['procurementMethodType'])
if model:
try:
Expand All @@ -69,8 +70,62 @@ def __init__(self, registry):
else:
auction['dateModified'] = get_now().isoformat()
docs.append(auction)
if len(docs) >= 2 ** 7: # pragma: no cover
if len(docs) >= 2 ** 7: # pragma: no cover
registry.db.update(docs)
docs = []
if docs:
registry.db.update(docs)


def from1to2(registry):
class Request(object):
def __init__(self, registry):
self.registry = registry

results = registry.db.iterview('auctions/all', 2 ** 10, include_docs=True)

request = Request(registry)
root = Root(request)

docs = []
for i in results:
auction = i.doc

procurement_method_types = get_procurement_method_types(registry, ('rubbleOther', 'rubbleFinancial'))

if auction['procurementMethodType'] not in procurement_method_types or auction['status'] != 'active.awarded' or 'contracts' not in auction:
continue
changed = False
contract = filter(lambda x: x['status'] == 'pending', auction['contracts'])[0]
award = filter(lambda x: x['id'] == contract['awardID'], auction['awards'])[0]

if not award['complaintPeriod'].get('endDate', False):
award['complaintPeriod']['endDate'] = contract['date']
changed = True

if not auction['awardPeriod'].get('endDate', False):
auction['awardPeriod']['endDate'] = contract['date']
changed = True

if not changed:
continue

auction_id = auction['_id']

model = registry.auction_procurementMethodTypes.get(auction['procurementMethodType'])
if model:
try:
auction = model(auction)
auction.__parent__ = root
auction = auction.to_primitive()
except: # pragma: no cover
LOGGER.error("Failed migration of auction {} to schema 2.".format(auction_id), extra={'MESSAGE_ID': 'migrate_data_failed', 'AUCTION_ID': auction_id})
else:
LOGGER.info("Auction {} migrated to schema 2.".format(auction_id), extra={'MESSAGE_ID': 'migrate_data', 'AUCTION_ID': auction_id})
auction['dateModified'] = get_now().isoformat()
docs.append(auction)
if len(docs) >= 2 ** 7: # pragma: no cover
registry.db.update(docs)
docs = []
if docs:
registry.db.update(docs)
26 changes: 20 additions & 6 deletions openprocurement/auctions/rubble/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,19 @@
calc_auction_end_time,
dgfCDB2Complaint,
dgfCDB2Document,
dgfCDB2Item,
dgfCDB2Item as Item,
dgfCancellation,
edit_role,
get_auction,
validate_items_uniq,
validate_lots_uniq,
validate_not_available,
)
from openprocurement.auctions.core.plugins.awarding.v2_1.models import Award
from openprocurement.auctions.core.plugins.contracting.v2_1.models import Contract


from openprocurement.auctions.core.plugins.awarding.v3_1.models import Award
from openprocurement.auctions.core.plugins.contracting.v3_1.models import Contract

from openprocurement.auctions.core.utils import (
AUCTIONS_COMPLAINT_STAND_STILL_TIME as COMPLAINT_STAND_STILL_TIME,
SANDBOX_MODE,
Expand Down Expand Up @@ -168,6 +171,17 @@ class IRubbleFinancialAuction(IAuction):
"""Marker interface for RubbleFinancial auctions"""


class RubbleAward(Award):
items = ListType(ModelType(Item))

VERIFY_AUCTION_PROTOCOL_TIME = timedelta(days=6)
CONTRACT_SIGNING_TIME = timedelta(days=20)


class RubbleContract(Contract):
items = ListType(ModelType(Item))


@implementer(IRubbleOtherAuction)
class Auction(BaseAuction):
"""Data regarding auction process - publicly inviting prospective contractors to submit bids for evaluation and selecting a winner or winners."""
Expand All @@ -185,11 +199,11 @@ def __local_roles__(self):
return roles

_internal_type = "rubbleOther"
awards = ListType(ModelType(Award), default=list())
awards = ListType(ModelType(RubbleAward), default=list())
bids = ListType(ModelType(Bid), default=list()) # A list of all the companies who entered submissions for the auction.
cancellations = ListType(ModelType(Cancellation), default=list())
complaints = ListType(ModelType(dgfCDB2Complaint), default=list())
contracts = ListType(ModelType(Contract), default=list())
contracts = ListType(ModelType(RubbleContract), default=list())
dgfID = StringType()
documents = ListType(ModelType(dgfCDB2Document), default=list()) # All documents and attachments related to the auction.
enquiryPeriod = ModelType(Period) # The period during which enquiries may be made and will be answered.
Expand All @@ -200,7 +214,7 @@ def __local_roles__(self):
procurementMethodType = StringType()
status = StringType(choices=['draft', 'active.tendering', 'active.auction', 'active.qualification', 'active.awarded', 'complete', 'cancelled', 'unsuccessful'], default='active.tendering')
lots = ListType(ModelType(Lot), default=list(), validators=[validate_lots_uniq, validate_not_available])
items = ListType(ModelType(dgfCDB2Item), required=True, min_size=1, validators=[validate_items_uniq])
items = ListType(ModelType(Item), required=True, min_size=1, validators=[validate_items_uniq])
minNumberOfQualifiedBids = IntType(choices=[1, 2])

def __acl__(self):
Expand Down
Loading