Ejemplo n.º 1
0
def get_connection(connection_name):
    """Получение подключения"""
    if connection_name not in get_available_connections():
        print('Unknown connection %s' % connection_name)
        s_exit(UNKNOWN)

    return Mc().__getattribute__(connection_name)
Ejemplo n.º 2
0
def auction_cancel(auction):
    """Функция отмены процедуры"""
    auction_info = found_procedure_223_db(auction, get_id=True)
    print('БД процедуры: %s' % auction_info['db'])

    if input('Установить процедуре статус "Прием заявок"? Y/n: ') in 'YН':
        cn = Mc(connection=auction_info['connection'])
        cn.execute_query(procedure_published_update_query % auction_info['id'])
        cn.execute_query(lot_published_update_query % auction_info['id'])
        print('''Установлен статус "Прием заявок"''')

    xml_file, find_error = new_223_auction_cancel_finder(auction, out_dir)
    if find_error:
        print(find_error)
        if input('Продолжить? Y/n: ') not in 'YН':
            return 1

    correction_status, correction_error = new_223_xml_corrector(xml_file)
    if correction_status:
        print('Пакет валиден')
    else:
        print('Пакет не валиден: ', correction_error)
    if input('Опубликовать отмену аукциона? Y/n: ') not in 'YН':
        return 1

    imp_status, imp_info = new_223_import_xml(xml_file, auction_info['db'])
    if imp_status:
        print(imp_info)
        return 0
    else:
        print('Пакет импортирован с ошибкой: %s' % imp_info)
        return 1
Ejemplo n.º 3
0
                        action='store_true',
                        help='''Удалить неактивные записи из базы данных.
                        Аргументы:
                        --minutes - за указанное количество минут (по умолчанию 0, необязательный)'''
                        )

    parser.add_argument('-m',
                        '--minutes',
                        type=int,
                        default=d_minutes,
                        help="Установить количество минут")

    return parser


cn = Mc(connection=Mc.MS_CERT_INFO_CONNECT)


def insert_worker(force=False):
    cn.connect()
    insert_datetime = datetime.now()

    f = uc.accredited_uc_file_get(filename=accredited_uc_file)
    uc_f = uc.AccreditedUcFile(f)
    new_file_version = uc_f.get_version()

    actual_file_version = cn.execute_query(get_actual_file_version_query)[0][0]
    actual_file_version = actual_file_version if actual_file_version else 0

    if actual_file_version >= new_file_version and not force:
        info = 'Данные актуальны. Версия файла не изменялась (%s)' % actual_file_version
Ejemplo n.º 4
0
def procedure_archiving(procedure_number):
    global DATA_PROCESSED

    # инициализация sql подключений
    db_info = found_procedure_223_db(procedure_number)
    if not db_info:
        print('Процедура %(procedure_number)s не найдена' % vars())
        return

    cn = Mc(connection=db_info['connection'])
    is_smsp = db_info['db'] in [
        '223smsp_ea', '223smsp_ek', '223smsp_zk', '223smsp_zp'
    ]

    print('Обработка %(procedure_number)s начата' % vars())
    print(db_info['name'])
    # проверяем, существует ли уже архив для данной процедуры
    archive_procedures_list = [
        archive[0:11] for archive in listdir(work_dir)
        if archive.endswith('.zip') and isfile(join(work_dir, archive))
    ]

    if procedure_number in archive_procedures_list:
        print('Архив %(procedure_number)s.zip уже существует' % vars())
        return 0

    # создаем директорию процедуры и делаем ее рабочей директорией
    chdir(work_dir)
    create_dir(procedure_number)
    chdir(procedure_number)
    work_procedures_dir = join(work_dir, procedure_number)

    # Здесь будем хранить основной массив данных
    all_data = []

    print('- Получение данных')
    # обрабатываем заявки
    chdir(work_procedures_dir)
    with cn.open():
        requests_data = cn.execute_query(get_requests_data_query % vars())

    requests_data = found_location_dir(is_smsp, requests_data, 5)

    # находим для каждого файла составляющие пути, куда будем класть данный файл в архив
    # собираем их в лист allData
    for data in requests_data:
        archive_location_dir_parts = [
            str(data[1]), requests_dir,
            str(data[2]),
            str(data[3])
        ]
        # uri, links_list, name
        request_data = [data[5], archive_location_dir_parts, str(data[4])]
        all_data.append(request_data)

    # обрабатываем протоколы
    chdir(work_procedures_dir)
    with cn.open():
        protocols_data = cn.execute_query(get_protocols_data_query % vars())
    protocols_data = found_location_dir(is_smsp, protocols_data, 4)

    # находим для каждого файла составляющие пути, куда будем класть данный файл в архив
    # собираем их в лист allData
    for data in protocols_data:
        archive_location_dir_parts = [
            str(data[1]), protocols_dir,
            str(data[2])
        ]
        # uri, links_list, name
        protocol_data = [data[4], archive_location_dir_parts, str(data[3])]
        all_data.append(protocol_data)

    # обрабатываем фичи
    chdir(work_procedures_dir)
    with cn.open():
        features_data = cn.execute_query(get_features_data_query % vars())
    features_data = found_location_dir(is_smsp, features_data, 5)

    # находим для каждого файла составляющие пути, куда будем класть данный файл в архив
    # собираем их в лист allData
    for data in features_data:
        archive_location_dir_parts = [
            str(data[1]), requests_dir,
            str(data[2]), features_dir,
            str(data[3])
        ]
        # uri, links_list, name
        feature_data = [data[5], archive_location_dir_parts, str(data[4])]
        all_data.append(feature_data)

    # если установлен флаг organisations, то добавляем в архив сведения об организации
    if namespace.organisation:
        # обрабатываем сведения о файлах организации
        chdir(work_procedures_dir)
        with cn.open():
            organisation_data = cn.execute_query(get_organisation_data_query %
                                                 vars())
        organisation_data = found_location_dir(is_smsp, organisation_data, 5)

        # находим для каждого файла составляющие пути, куда будем класть данный файл в архив
        # собираем их в лист allData
        for data in organisation_data:
            archive_location_dir_parts = [
                str(data[2]), requests_dir,
                str(data[3]), organisation_data_dir,
                str(data[1])
            ]
            # uri, links_list, name
            organisation_data = [
                data[5], archive_location_dir_parts,
                str(data[4])
            ]
            all_data.append(organisation_data)

    # переименование директорий в соответствии со словарем dirNamesDict
    # замена обычных и фигурных скобок из-за проблем с re
    for data in all_data:
        renamed_dirs = []
        for location in data[1]:
            if location in dir_names_dict.keys():
                location = dir_names_dict[location]
            renamed_dirs.append(location)
        data[1] = renamed_dirs
        data[2] = re.sub(r'(\(|\)|\[|\])', '_', data[2])

    # собираем excel файл с ценовыми предложениями (если они есть)
    if db_info['db'] not in [
            '223smsp_ea', '223smsp_ek', '223smsp_zk', '223smsp_zp'
    ]:
        with cn.open():
            offers_data = list(cn.execute_query(get_offers_data_query %
                                                vars()))
        if offers_data:
            offer_top = get_query_top(get_offers_data_query % vars())
            excel_file = Excel()
            excel_list = excel_file.create_list(
                sheet_name='Ценовые предложения')
            excel_list.set_numeral(6)
            excel_list.write_data_from_iter(offers_data, offer_top)
            excel_list.set_default_column_width(150)
            excel_file.save_file(save_dir=work_procedures_dir,
                                 file_name='Ценовые предложения участников ' +
                                 procedure_number)

    # вычленяем из allData листы с директориями для формирования пути
    archive_locations = [
        archiveLocationDirParts[1] for archiveLocationDirParts in all_data
    ]

    # создаем все необходимые нам директории
    for location in archive_locations:
        chdir(work_procedures_dir)
        for directory in location:
            directory = str(directory)
            create_dir(directory)
            chdir(directory)

    # формируем путь и добавляем его в archiveLocationsFromAndTo вместе с путем источника
    archive_locations_from_and_to = []
    for archive_location_dir_parts in all_data:
        archive_location_dir = join(*([work_procedures_dir] +
                                      archive_location_dir_parts[1] +
                                      [archive_location_dir_parts[2]]))

        archive_locations_from_and_to.append([
            normpath(archive_location_dir_parts[0]),
            normpath(archive_location_dir)
        ])

    print('- Копирование файлов')
    # копируем файлы по директориям
    chdir(work_procedures_dir)
    for from_location, to_location in archive_locations_from_and_to:
        # если возникла ошибка OSError: [Errno 36] File name too long
        try:
            copyfile(from_location, to_location)
        except OSError as exc:
            if exc.errno == 36:
                to_location = get_rand_name(to_location)
                copyfile(from_location, to_location)
            else:
                raise  # re-raise previously caught exception

    # архивируем директорию и удаляем ее
    print('- Создание архива')
    chdir(work_dir)
    archive = make_archive(procedure_number, 'zip', work_procedures_dir)

    print('- Удаление временных файлов')
    rmtree(work_procedures_dir)

    archive_byte_size = getsize(archive)
    archive_MB_size = round(archive_byte_size / 1024 / 1024, 2)

    DATA_PROCESSED += archive_byte_size

    print('Создан архив: %(archive)s' % vars())
    print('Размер архива: %(archive_MB_size)s МБ' % vars())
    print('Обработка %(procedure_number)s завершена' % vars())
    return archive
Ejemplo n.º 5
0
    print(PROGNAME, VERSION, '\n', DESCRIPTION, '\nAuthor:', AUTHOR,
          '\nRelease date:', RELEASE_DATE)


if __name__ == '__main__':
    try:
        # парсим аргументы командной строки
        my_parser = create_parser()
        namespace = my_parser.parse_args()

        # вывод версии
        if namespace.version:
            show_version()
            s_exit(OK)

        cn = Mc(connection=Mc.MS_44_1_CONNECT).connect()
        requests_info = cn.execute_query(get_requests_info_query, dicted=True)

        for request_info in requests_info:
            additional_information = json.loads(
                request_info['additional_information'])
            additional_information['status'] = int(
                additional_information['status'])
            additional_information[
                'status_description'] = additional_information.get(
                    'status_description', '')

            # если статус 0, то просто ответ, в сраку его
            if additional_information['status'] == 0:
                continue
@set_critical
@out_printer
@only_if_trade_record_exists
def check_pid_t(auction_data):
    """Проверка установки pid за час до торгов"""
    if datetime.now() + timedelta(hours=-1) > auction_data[
            't_start_trade_datetime'] and not auction_data['t_pid']:
        auction_data['error'] = \
            'не установлен pid за час до торгов' % auction_data
    return auction_data


if __name__ == '__main__':
    try:
        # инициализируем подключения
        cn_procedures = Mc(connection=PROCEDURE_223_TYPES[namespace.type]
                           ['connection']).connect()
        cn_catalog = Mc(connection=Mc.MS_223_CATALOG_CONNECT).connect()
        cn_trade = Mc(connection=PROCEDURE_223_TYPES[namespace.type]
                      ['connection_trade']).connect()

        if namespace.auction:
            all_published_procedures_info = cn_procedures.execute_query(
                get_one_trade_awaiting_procedures_info_query %
                namespace.auction,
                dicted=True)
        else:
            all_published_procedures_info = cn_procedures.execute_query(
                get_all_trade_awaiting_procedures_info_query, dicted=True)

        # если поиск по базе с текущими условиями ничего не дал, то указываем, что ничего не нашлось
        if namespace.auction and not all_published_procedures_info:
Ejemplo n.º 7
0
from config import *
import logger_module
import requests
import json
import re

MAIL_TEXT = ''
SQL_TEXT = ''
C_COUNT = 0

tmp_html = join(normpath(tmp_dir), tmp_html)
tmp_sql = join(normpath(tmp_dir), tmp_sql)
tmp_json = join(normpath(tmp_dir), tmp_json)

counter = count(start=1, step=1)
cn_44 = Mc(connection=Mc.MS_44_2_CONNECT)


def main():
    global MAIL_TEXT, SQL_TEXT, C_COUNT
    # получаем данные json если есть откуда, если нет, то создаем файл с пустым дампом
    if not exists(tmp_json):
        json_loads_data = []
        with open(tmp_json, mode='w') as tmp_json_f:
            tmp_json_f.write(json.dumps(json_loads_data))
    else:
        with open(tmp_json, mode='r') as tmp_json_f:
            tmp_json_r = tmp_json_f.read()
        json_loads_data = json.loads(tmp_json_r)

    # получаем данные о новых опубликованных процедурах
Ejemplo n.º 8
0
def get_available_connections():
    """Функция получения доступных подключений mysql"""
    m = Mc()
    return sorted([cn for cn in m.__dir__() if cn.startswith('MS')])
Ejemplo n.º 9
0
            show_nagios_nm(data_file)
            s_exit(OK)

        # если указан запрос, то выполняем его
        if namespace.query:

            check_arguments(('nagios_name', 'connection'))

            last_update_datetime = get_datetime(data_file, nagios_name)
            query = re.sub(date_sub_string, '\'' + last_update_datetime + '\'',
                           get_query(query))
            connection = get_connection(connection)

            # получаем данные по запросу
            mc = Mc(connection=connection)
            with mc.open():
                query_data = mc.execute_query(query)

            # преобразовываем все данные в строки
            out_info = tuple(
                map(lambda x: [str(line) for line in x], query_data))

            # если
            if out_info:
                out_info_len = len(out_info)

                print(error_text % out_info_len)
                for info_line in out_info:
                    print(
                        translit(str(data_separator.join(info_line)),
Ejemplo n.º 10
0
def main():

    # инициализируем счетчик записей
    counter = count(start=1, step=1)

    # инициализируем подключение к ftp
    connect = Ftp(connection=Ftp.CONNECT_223_FREE_FTP)
    # инициализируем подключения к бд
    cn_catalog = Mc(connection=Mc.MS_223_CATALOG_CONNECT)

    # искать будем за вчерашний день
    YESTERDAY = (datetime.now() - timedelta(days=1)).__format__('%Y%m%d')

    MAIL_TEXT = ''

    # в этот временный файл мы будем писать загруженные архивы
    tmp_zip = join(tmp_dir, zip_file)

    connect.open()

    # сюда мы запишем все локальные пути до xml, которые нам подошли
    files_for_send = []

    for search_dir in search_dirs:

        # собираем содержимое всех указанных директорий (внутри они разбиты по регионам, нам нужно обойти все)
        archive_dirs = [
            region_dir + search_dir
            for region_dir in connect.nlst(all_data_dir)
        ]

        # получим полные пути до всех архивов за вчерашний день и зачем то упорядочим
        # просто потому что все должно быть красиво)
        all_new_archives = []
        for archive_dir in archive_dirs:
            region_files = sorted(connect.nlst(archive_dir),
                                  key=lambda k: k,
                                  reverse=True)
            region_files = filter(lambda k: re.findall(YESTERDAY, k),
                                  region_files)
            for file in region_files:
                all_new_archives.append(file)

        # поочередно скачиваем архивы
        for archive in all_new_archives:
            connect.get(tmp_zip, archive)

            # распакуем архив, а его самого удалим
            shutil.unpack_archive(tmp_zip, tmp_dir)
            os.remove(tmp_zip)

            # обрабатываем каждую xml, которая распаковалась в директорию
            for xml_file in os.listdir(tmp_dir):
                file_r = join(tmp_dir + xml_file)
                with open(file_r, mode='r', encoding='utf8') as xml:
                    XML = xml.read()

                # находим условия, которые будем проверять
                OUR_PLACE = re.findall(
                    r'<electronicPlaceId>(104|2580|3)</electronicPlaceId>',
                    XML)

                # если для нашей площадки и метод не от старой секции, то забираем xml
                if OUR_PLACE:
                    auction = re.findall(
                        r'<ns2:registrationNumber>(.*?)</ns2:registrationNumber>',
                        XML)[0]
                    version = re.findall(r'<ns2:version>(.*?)</ns2:version>',
                                         XML)[0]
                    method_name = re.findall(
                        r'<ns2:purchaseCodeName>(.*?)</ns2:purchaseCodeName>',
                        XML)[0]
                    method_code = re.findall(
                        r'<ns2:purchaseMethodCode>(.*?)</ns2:purchaseMethodCode>',
                        XML)[0]
                    number = str(next(counter))
                    publication_info = found_procedure_223_db(auction,
                                                              version=version)

                    with cn_catalog.open():
                        ON_CATALOG = cn_catalog.execute_query(
                            check_catalog_query % (auction, version))

                    if publication_info:
                        MAIL_TEXT += '%s) %s версия %s (%s, код %s): опубликован как %s' % (
                            number, auction, version, method_name, method_code,
                            publication_info['name'])
                    else:
                        MAIL_TEXT += '%s) %s версия %s (%s, код %s): не опубликован на площадке' % (
                            number, auction, version, method_name, method_code)

                    if ON_CATALOG:
                        MAIL_TEXT += ', в каталоге присутствует\n\n'
                    else:
                        MAIL_TEXT += ', в каталоге отсутствует\n\n'

                    xml_with_link = join(
                        found_xml_dir,
                        number + '_' + auction + '_' + version + '.xml')
                    files_for_send.append(xml_with_link)
                    shutil.copyfile(file_r, xml_with_link)

                os.remove(file_r)

    XML_COUNT = len(files_for_send)
    MAIL_THEME = 'Отчет по новым извещениям 223'

    if XML_COUNT:
        MAIL_TEXT = 'Найдены новые извещения (во вложении)\n\n' + MAIL_TEXT
    else:
        MAIL_TEXT = 'Новые извещения отсутствуют'

    connect.close()

    email.mail_sender(MAIL_THEME,
                      MAIL_TEXT,
                      recipients=recipients,
                      add_files=files_for_send,
                      report=True,
                      counter=XML_COUNT,
                      datetime=True)