diff --git a/openprocurement/auction/chronograph.py b/openprocurement/auction/chronograph.py index 4a59b49..f39cd26 100644 --- a/openprocurement/auction/chronograph.py +++ b/openprocurement/auction/chronograph.py @@ -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 @@ -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']) diff --git a/openprocurement/auction/plannings.py b/openprocurement/auction/plannings.py index 1b9a5dc..7828fa8 100644 --- a/openprocurement/auction/plannings.py +++ b/openprocurement/auction/plannings.py @@ -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 ) @@ -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']: @@ -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" \ @@ -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( diff --git a/openprocurement/auction/utils.py b/openprocurement/auction/utils.py index ce897b9..e9e92ec 100644 --- a/openprocurement/auction/utils.py +++ b/openprocurement/auction/utils.py @@ -11,6 +11,7 @@ import logging import json import requests +import yaml from retrying import retry from datetime import MINYEAR, datetime @@ -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 @@ -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, @@ -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): """"""