Exemple #1
0
    def get_measures_results_planned(self, system_code, entity_code, stream_id):
        from sirius.blueprints.api.local_service.producer import LocalProducer
        from sirius.blueprints.api.remote_service.producer import RemoteProducer
        from sirius.blueprints.api.local_service.risar.entities import \
            RisarEntityCode

        implement = Implementation()
        reformer = implement.get_reformer(system_code, stream_id)

        # /api/integration/<int:api_version>/card/list/
        card_list_method = reformer.get_api_method(
            SystemCode.LOCAL, RisarEntityCode.CARD, OperationCode.READ_MANY
        )
        msg = Message(None, stream_id)
        msg.to_local_service()
        msg.set_request_type()
        msg.set_immediate_answer()
        msg.set_method(card_list_method['method'], card_list_method['template_url'])
        producer = RemoteProducer()
        card_msg = producer.send(msg, async=False)
        for card_data in card_msg.get_data():

            # /api/integration/<int:api_version>/card/<card_id>/measures/list/
            measures_list_method = reformer.get_api_method(
                SystemCode.LOCAL, RisarEntityCode.MEASURE, OperationCode.READ_MANY
            )
            dst_url_params = {}
            dst_url_params.update({
                'card_id': {
                    'entity': RisarEntityCode.CARD,
                    'id': str(card_data['card_id']),
                }
            })
            dst_url_entities = dict((val['entity'], val['id']) for val in dst_url_params.values())
            dst_param_ids = [dst_url_entities[param_entity] for param_entity in measures_list_method['params_entities']]
            dst_url = measures_list_method['template_url'].format(*dst_param_ids)

            msg = Message(None, stream_id)
            msg.to_local_service()
            msg.set_request_type()
            msg.set_immediate_answer()
            msg.set_method(
                measures_list_method['method'],
                dst_url,
            )
            producer = RemoteProducer()
            measures_msg = producer.send(msg, async=False)
            for measure_data in measures_msg.get_data():

                msg = self.create_message(system_code, entity_code)  # searchServiceRend
                meta = msg.get_header().meta
                meta['local_parents_params'] = {
                    'card_id': {'entity': RisarEntityCode.CARD, 'id': card_data['card_id']},
                    'measure_id': {'entity': RisarEntityCode.MEASURE, 'id': measure_data['measure_id']},
                }
                producer = LocalProducer()
                producer.send(msg)
Exemple #2
0
def api_client_local_id():
    data = request.get_json()
    rld = RequestLocalData(data)
    implement = Implementation()
    reformer = implement.get_reformer(rld.data.get('remote_system_code'),
                                      rld.stream_id)
    local_id = reformer.get_local_id_by_remote(
        RisarEntityCode.CLIENT,
        rld.data.get('remote_entity_code'),
        rld.data.get('remote_main_id'),
    )
    return local_id, rld.stream_id
Exemple #3
0
def api_card_register():
    data = request.get_json()
    rld = RequestLocalData(data)
    implement = Implementation()
    reformer = implement.get_reformer(rld.data.get('remote_system_code'),
                                      rld.stream_id)
    res = reformer.register_entity_match(
        RisarEntityCode.CARD,
        rld.data.get('local_main_id'),
        rld.data.get('remote_entity_code'),
        rld.data.get('remote_main_id'),
    )
    return res, rld.stream_id
Exemple #4
0
    def process(self, msg, rmt_sys_code):
        assert isinstance(msg, Message)
        res = True
        implement = Implementation()
        reformer = implement.get_reformer(rmt_sys_code, msg.get_stream_id())

        # сценарий обработки сообщения
        if msg.is_to_remote:
            if msg.is_send_data:
                if remote_system.is_passive(rmt_sys_code):
                    reformed_data = reformer.reform_msg(msg)
                    reformer.send_to_remote_data(reformed_data)
                    hdr = msg.get_header()
                    op_res = OperationResult(msg.get_stream_id())
                    result_msg = op_res.check(hdr.method, hdr.url)
                    if result_msg:
                        self.producer_send_msgs([result_msg])
                elif remote_system.is_active(rmt_sys_code):
                    # todo: не готов вариант взаимодействия с мис
                    miss_req_msgs = reformer.get_missing_requests(msg)
                    miss_data_msgs = self.producer_send_msgs(miss_req_msgs)
                    remote_reformed_data = reformer.get_reformed_data(
                        msg, miss_data_msgs)
                    data_store = Difference()
                    data_store.place(remote_reformed_data)
                    data_store.commit_all_changes()
                else:
                    raise InternalError(
                        'Type of remote system is not define: %s' %
                        rmt_sys_code)
            elif msg.is_send_event:
                reformed_data = reformer.reform_msg(msg)
                res = reformer.send_to_remote_data(reformed_data)
            elif msg.is_result:
                remote_data = msg.get_source_data()
                reformer.conformity_local(remote_data, msg)
            elif msg.is_request:
                reformed_req = reformer.reform_req(msg)
                entity_package = reformer.get_entity_package_by_req(
                    reformed_req)
                self.send_diff_data(entity_package, reformer, reformed_req)
            else:
                raise InternalError('Unexpected message type')
        elif msg.is_to_local:
            raise InternalError('Wrong message direct')
        else:
            raise InternalError('Message direct is not define')
        return res
Exemple #5
0
    def get_hospital_rec(self, system_code, entity_code, stream_id):
        from sirius.blueprints.api.local_service.producer import LocalProducer
        from sirius.blueprints.api.remote_service.producer import RemoteProducer
        from sirius.blueprints.api.local_service.risar.entities import \
            RisarEntityCode
        from sirius.blueprints.api.remote_service.tambov.entities import \
            TambovEntityCode

        implement = Implementation()
        reformer = implement.get_reformer(system_code, stream_id)

        # /api/integration/<int:api_version>/card/list/
        card_list_method = reformer.get_api_method(
            SystemCode.LOCAL, RisarEntityCode.CARD, OperationCode.READ_MANY
        )
        # data = {
        #     'filters': {
        #         'id': 3  # todo: при тестировании работаем пока с одной картой
        #     }
        # }
        msg = Message(None, stream_id)
        msg.to_local_service()
        msg.set_request_type()
        msg.set_immediate_answer()
        msg.set_method(card_list_method['method'],
                       card_list_method['template_url'])
        producer = RemoteProducer()
        card_msg = producer.send(msg, async=False)
        for card_data in card_msg.get_data():
            try:
                if not reformer.find_remote_id_by_local(
                    TambovEntityCode.SMART_PATIENT,
                    RisarEntityCode.CARD,
                    card_data['card_id'],
                ):
                    continue

                msg = self.create_message(system_code, entity_code)  # searchHspRecord
                meta = msg.get_header().meta
                meta['local_parents_params'] = {
                    'card_id': {'entity': RisarEntityCode.CARD, 'id': card_data['card_id']},
                }
                producer = LocalProducer()
                producer.send(msg)
            except LoggedException:
                pass
Exemple #6
0
    def _test_create_miss_prototype_list(self):
        from sirius.models.protocol import ProtocolCode
        from sirius.blueprints.api.remote_service.tambov.active.referral.srv_prototype_match import \
            SrvPrototypeMatch
        from sirius.blueprints.api.remote_service.tambov.entities import \
            TambovEntityCode
        from sirius.blueprints.reformer.api import DataRequest
        from sirius.lib.implement import Implementation
        from sirius.models.operation import OperationCode
        from sirius.models.system import SystemCode

        SrvPrototypeMatch.init()
        pr_code_map = SrvPrototypeMatch.prototype_code__srv_prototype__map

        stream_id = '_test_create_miss_prototype_list'
        implement = Implementation()
        reformer = implement.get_reformer(SystemCode.TAMBOV, stream_id)
        with app.app_context():
            srv_api_method = reformer.get_api_method(
                reformer.remote_sys_code,
                TambovEntityCode.SERVICE,
                OperationCode.READ_MANY,
            )
        org_code = '1434663'  # Контрольная МО Тамбова
        with open('missing_prototype_code_for_1434663_01.csv', 'w') as pr:

            for pr_code in pr_code_map:
                prototype_id = SrvPrototypeMatch.get_prototype_id_by_prototype_code(
                    pr_code)

                req = DataRequest(stream_id)
                req.set_req_params(
                    url=srv_api_method['template_url'],
                    method=srv_api_method['method'],
                    protocol=ProtocolCode.SOAP,
                    data={
                        'clinic': org_code,
                        'prototype': prototype_id,
                    },
                )
                srvs_data = reformer.transfer.execute(req)
                if not srvs_data:
                    pr.write(pr_code + '\n')
Exemple #7
0
    def process(self, msg):
        assert isinstance(msg, Message)
        res = None
        hdr = msg.get_header()
        # сценарий обработки сообщения
        if msg.is_request:
            parser, answer = request_by_url(
                hdr.method, hdr.url, msg.get_data(), msg.get_stream_id()
            )
            local_data = parser.get_data(answer)

            next_msg = Message(local_data, msg.get_stream_id())
            next_msg.to_remote_service()
            next_msg.set_send_data_type()
            next_msg.get_header().meta.update(hdr.meta)

            if msg.is_immediate_answer:
                res = next_msg
            else:
                prod = LocalProducer()
                prod.send(next_msg)
        elif msg.is_result:
            parser, answer = request_by_url(
                hdr.method, hdr.url, msg.get_data(), msg.get_stream_id()
            )
            req_res = parser.get_data(answer)
        elif msg.is_send_data:
            implement = Implementation()
            rmt_sys_code = msg.get_header().meta['remote_system_code']
            reformer = implement.get_reformer(rmt_sys_code, msg.get_stream_id())
            entities = reformer.reform_msg(msg)
            reformer.send_to_local_data(entities, request_by_url)
        else:
            raise InternalError('Message has not type')

        return res
Exemple #8
0
    def send(self, msg):
        assert isinstance(msg, Message)

        res = True
        if msg.is_to_local:
            # доп. очередь, т.к. основная может быть забита входящим потоком
            local_back_task.apply_async(args=(msg, ), queue=back_queue_name)
        elif msg.is_to_remote:
            if msg.is_send_data:
                implement = Implementation()
                for rmt_sys_code in remote_system.get_codes():
                    for queue_name in remote_system.get_queue_names(
                            rmt_sys_code):
                        reformer = implement.get_reformer(
                            rmt_sys_code, msg.get_stream_id())
                        entity_package = reformer.get_entity_package_by_msg(
                            msg)
                        self.send_diff_data(entity_package, reformer, msg,
                                            rmt_sys_code, queue_name)
            elif msg.is_send_event:
                implement = Implementation()
                rmt_sys_code = remote_system.get_event_system_code()
                reformer = implement.get_reformer(rmt_sys_code,
                                                  msg.get_stream_id())
                entity_package = reformer.get_entity_package_by_msg(msg)
                msgs = reformer.create_to_remote_messages(entity_package)
                res = all(self.send_msgs(msgs, rmt_sys_code, async=False))
            elif msg.is_request:
                rmt_sys_code = msg.get_header().meta['remote_system_code']
                sync_remote_task(msg, rmt_sys_code)
            elif msg.is_result:
                rmt_sys_code = msg.get_header().meta['remote_system_code']
                sync_remote_task(msg, rmt_sys_code)
            else:
                raise InternalError('Unexpected message type')
        else:
            raise InternalError('Message direct missing')
        return res
Exemple #9
0
    def get_tula_schedules_notused(self, system_code, entity_code, stream_id):
        from sirius.blueprints.api.local_service.producer import LocalProducer
        from sirius.blueprints.api.remote_service.producer import RemoteProducer
        from sirius.blueprints.api.local_service.risar.entities import \
            RisarEntityCode

        implement = Implementation()
        reformer = implement.get_reformer(system_code, stream_id)

        org_list_method = reformer.get_api_method(
            SystemCode.LOCAL, RisarEntityCode.ORGANIZATION, OperationCode.READ_MANY
        )
        msg = Message(None, stream_id)
        msg.to_local_service()
        msg.set_request_type()
        msg.set_immediate_answer()
        msg.set_method(org_list_method['method'],
                       org_list_method['template_url'])
        producer = RemoteProducer()
        org_msg = producer.send(msg, async=False)
        for org_data in org_msg.get_data():

            doctor_list_method = reformer.get_api_method(
                SystemCode.LOCAL, RisarEntityCode.DOCTOR, OperationCode.READ_MANY
            )
            dst_url_params = {}
            dst_url_params.update({
                'organization': {
                    'entity': RisarEntityCode.ORGANIZATION,
                    'id': str(org_data['LPU_id']),
                }
            })
            dst_url_entities = dict(
                (val['entity'], val['id']) for val in dst_url_params.values())
            dst_param_ids = [dst_url_entities[param_entity] for param_entity in
                             doctor_list_method['params_entities']]
            dst_url = doctor_list_method['template_url'].format(*dst_param_ids)

            msg = Message(None, stream_id)
            msg.to_local_service()
            msg.set_request_type()
            msg.set_immediate_answer()
            msg.set_method(
                doctor_list_method['method'],
                dst_url,
            )
            producer = RemoteProducer()
            doctor_msg = producer.send(msg, async=False)
            for doctor_data in doctor_msg.get_data():
                if not doctor_data['regional_code']:
                    # мусор
                    continue
                try:
                    msg = self.create_message(
                        system_code, entity_code, OperationCode.ADD
                    )  # WebSchedule
                    meta = msg.get_header().meta
                    meta['local_parents_params'] = {
                        'LPU_id': {'entity': RisarEntityCode.ORGANIZATION,
                                       'id': org_data['LPU_id']},
                        'regional_code': {'entity': RisarEntityCode.DOCTOR,
                                       'id': doctor_data['regional_code']},
                    }
                    producer = LocalProducer()
                    producer.send(msg)
                except LoggedException:
                    pass
Exemple #10
0
    def send_exchange_card(self, system_code, entity_code, stream_id):
        from sirius.blueprints.api.local_service.producer import LocalProducer
        from sirius.blueprints.api.remote_service.producer import RemoteProducer
        from sirius.blueprints.api.local_service.risar.entities import \
            RisarEntityCode
        from sirius.blueprints.api.remote_service.tambov.entities import \
            TambovEntityCode

        implement = Implementation()
        reformer = implement.get_reformer(system_code, stream_id)

        # /api/integration/<int:api_version>/card/list/
        card_list_method = reformer.get_api_method(
            SystemCode.LOCAL, RisarEntityCode.CARD, OperationCode.READ_MANY
        )
        # todo: фильтр для двойняшек
        data = {
            'filters': {
                'pregnancyWeek': 32,  # в рисар нет таких пока
                # 'id': 22,
            }
        }
        # data = {
        #     'filters': {
        #         'id': 14  # todo: при тестировании работаем пока с одной картой
        #     }
        # }
        msg = Message(data, stream_id)
        msg.to_local_service()
        msg.set_request_type()
        msg.set_immediate_answer()
        msg.set_method(card_list_method['method'], card_list_method['template_url'])
        producer = RemoteProducer()
        card_msg = producer.send(msg, async=False)

        fname = 'exchange_card_template.xml'
        rel_path = 'sirius/blueprints/api/remote_service/tambov/active/service/'
        with open(os.path.join(rel_path, fname)) as pr:
            template_text = pr.read()
        exch_card_req = {
            'doc': {
                'context_type': 'risar_exchange_card',
                'template_text': template_text,
                'template_name': 'exchange_card',
                'id': 0,
                'context': '',
                'event_id': 345
            }
        }
        for card_data in card_msg.get_data():
            try:
                if not reformer.find_remote_id_by_local(
                    TambovEntityCode.SMART_PATIENT,
                    RisarEntityCode.CARD,
                    card_data['card_id'],
                ):
                    continue

                sub_stream_id = get_stream_id()
                exch_card_req['doc']['event_id'] = card_data['card_id']
                # POST /print_subsystem/fill_template
                exch_card_method = reformer.get_api_method(
                    SystemCode.LOCAL, RisarEntityCode.EXCHANGE_CARD,
                    OperationCode.ADD
                )
                msg = Message(exch_card_req, sub_stream_id)
                msg.to_local_service()
                msg.set_request_type()
                msg.set_immediate_answer()
                msg.set_method(exch_card_method['method'], exch_card_method['template_url'])
                exch_card_msg = producer.send(msg, async=False)

                exch_card_data = {
                    'card_LPU': card_data['card_LPU'],
                    'exch_card': exch_card_msg.get_data(),
                }
                msg = Message(exch_card_data, sub_stream_id)
                msg.to_remote_service()
                msg.set_send_data_type()
                meta = msg.get_header().meta
                meta['local_entity_code'] = entity_code
                meta['local_operation_code'] = OperationCode.ADD
                meta['local_main_param_name'] = 'card_id'
                meta['local_main_id'] = card_data['card_id']
                meta['remote_system_code'] = system_code

                meta['local_parents_params'] = {
                    'card_id': {'entity': RisarEntityCode.CARD, 'id': card_data['card_id']},
                    'regionalCode': {'entity': RisarEntityCode.ORGANIZATION, 'id': card_data['card_LPU']},
                }
                LocalProducer().send(msg)
            except LoggedException:
                pass