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
8 changes: 7 additions & 1 deletion openprocurement/auction/chronograph.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from datetime import datetime, timedelta
from urlparse import urlparse

from openprocurement.auction.utils import FeedItem, check_workers
from openprocurement.auction.utils import FeedItem, check_workers, is_document_locked
from openprocurement.auction.core import components
from openprocurement.auction.interfaces import (
IAuctionsChronograph, IAuctionsManager
Expand Down Expand Up @@ -121,6 +121,12 @@ def sigusr1():
self.mapper(FeedItem(auction_item['value']))
if not worker_cmd_provider:
continue
elif is_document_locked(self, auction_item):
LOGGER.info(
'Auction {} is already running. '
'Skip it for scheduling.'.format(auction_item['id'])
)
continue
self.scheduler.schedule_auction(
auction_item['id'], auction_item['value'],
args=worker_cmd_provider(auction_item['id'])
Expand Down
29 changes: 28 additions & 1 deletion openprocurement/auction/plannings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
PreAnnounce_view
)
from openprocurement.auction.utils import (
do_until_success, prepare_auction_worker_cmd
do_until_success, prepare_auction_worker_cmd, is_document_locked
)


Expand Down Expand Up @@ -79,6 +79,15 @@ def __iter__(self):
'MESSAGE_ID':
DATA_BRIDGE_PLANNING_TENDER_ALREADY_PLANNED})
raise StopIteration
elif is_document_locked(self.bridge, self.item):
LOGGER.info(
"Auction {} is already running. "
"Skip it for planning".format(self.item['id']),
extra={
'MESSAGE_ID': DATA_BRIDGE_PLANNING_TENDER_SKIP
}
)
raise StopIteration
yield ("planning", str(self.item['id']), "")
elif 'lots' in self.item:
for lot in self.item['lots']:
Expand Down Expand Up @@ -126,6 +135,15 @@ def __iter__(self):
"Tender {} already planned on same "
"date".format(auction_id), extra=extra)
raise StopIteration
elif is_document_locked(self.bridge, self.item):
LOGGER.info(
"Auction {} is already running. "
"Skip it for planning".format(self.item['id']),
extra={
'MESSAGE_ID': DATA_BRIDGE_PLANNING_TENDER_SKIP
}
)
raise StopIteration
yield ("planning", str(self.item["id"]),
str(lot["id"]))
if self.item['status'] == "active.qualification" \
Expand Down Expand Up @@ -218,6 +236,15 @@ def __iter__(self):
}
)
raise StopIteration
elif is_document_locked(self.bridge, self.item):
LOGGER.info(
"Auction {} is already running. "
"Skip it for planning".format(self.item['id']),
extra={
'MESSAGE_ID': DATA_BRIDGE_PLANNING_TENDER_SKIP
}
)
raise StopIteration
yield ("planning", str(self.item['id']), "")
if self.item['status'] == "cancelled":
future_auctions = endDate_view(
Expand Down
32 changes: 30 additions & 2 deletions openprocurement/auction/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import logging
import json
import requests
import yaml

from retrying import retry
from datetime import MINYEAR, datetime
Expand All @@ -25,6 +26,7 @@
from fractions import Fraction
from munch import Munch
from zope.interface import implementer
from urlparse import urljoin

from openprocurement.auction.interfaces import IFeedItem
from openprocurement.auction.constants import DEFAULT_CONFIG
Expand Down Expand Up @@ -438,10 +440,15 @@ def get_auction_worker_configuration_path(_for, view_value, config, key='api_ver
return config['auction_worker_config']


def _get_worker_config_by_pmt(_for, item):
plugin = _for.mapper.pmt_configurator.get(item.get('procurementMethodType'), DEFAULT_CONFIG)
config = _for.mapper.plugins.get(plugin)
return config


def prepare_auction_worker_cmd(_for, tender_id, cmd, item,
lot_id='', with_api_version=''):
plugin = _for.mapper.pmt_configurator.get(item.get('procurementMethodType'))
config = _for.mapper.plugins.get(plugin, DEFAULT_CONFIG)
config = _get_worker_config_by_pmt(_for, item)
params = [
config['auction_worker'],
cmd, tender_id,
Expand All @@ -455,6 +462,27 @@ def prepare_auction_worker_cmd(_for, tender_id, cmd, item,
return params


def is_document_locked(_for, item):
auction_id = item.id
config = _get_worker_config_by_pmt(_for, item)

worker_defaults_path = get_auction_worker_configuration_path(
_for, item, config, key='api_version'
)
worker_defaults = yaml.load(open(worker_defaults_path))
auction_path = get_mapping(worker_defaults, auction_id)
if not auction_path:
return False

auction_path = urljoin(auction_path, '/health')
response = make_request(url=auction_path, method="get", retry_count=5)
if not response:
delete_mapping(worker_defaults, auction_id)
return False

return True


@implementer(IFeedItem)
class FeedItem(Munch):
""""""
Expand Down