Exemplo n.º 1
0
def api_move_client():
    j = request.get_json()
    try:
        ticket_id = int(j['ticket_id'])
        destination_tid = j['destination_ticket_id']
    except (ValueError, KeyError):
        return jsonify(
            None, 418,
            'Both ticket_id and destination_ticket_id must be specified')
    source = ScheduleTicket.query.get(ticket_id)
    oldCT = source.client_ticket

    dest = ScheduleTicket.query.get(destination_tid)
    if dest.client:
        return jsonify(None, 418, 'Destination ticket is busy')
    ct = ScheduleClientTicket()
    ct.appointmentType_id = oldCT.appointmentType_id
    ct.client_id = oldCT.client_id
    ct.createDatetime = datetime.datetime.now()
    ct.modifyDatetime = ct.createDatetime
    ct.isUrgent = oldCT.isUrgent
    ct.infisFrom = oldCT.infisFrom
    ct.ticket_id = destination_tid
    oldCT.deleted = 1

    db.session.add(ct)
    db.session.add(oldCT)

    db.session.commit()
    return jsonify(None)
Exemplo n.º 2
0
def api_patient_appointments():
    client_id = parse_id(request.args, 'client_id')
    every = request.args.get('every', False)
    if client_id is False:
        return abort(404)
    context = ClientVisualizer()
    if client_id:
        if Client.query.filter(Client.id == client_id).count():
            return jsonify(context.make_appointments(client_id, every))
        else:
            return abort(404)
    return jsonify(None, 400, 'Can\'t!')
Exemplo n.º 3
0
def kladr_search_street(city_code=None, search_query=None, limit=100):
    result = []
    if city_code is None or search_query is None:
        return jsonify([])
    response = requests.get(u'{0}kladr/street/search/{1}/{2}/{3}/'.format(
        app.config['VESTA_URL'], city_code, search_query, limit))
    for street in response.json()['data']:
        data = {
            'code': street['identcode'],
            'name': u'{0} {1}'.format(street['fulltype'], street['name'])
        }
        result.append(data)
    return jsonify(result)
Exemplo n.º 4
0
def api_delete_event():
    event_id = request.json.get('event_id')
    if not event_id:
        return abort(404)
    event = Event.query.get_or_404(event_id)

    def can_delete_event(event):
        # TODO: check payments
        if current_user.has_right('evtDelAll') or current_user.has_right(
                'adm'):
            return True, ''
        elif current_user.has_right('evtDelOwn'):
            if event.execPerson_id == current_user.id:
                return True, ''
            elif event.createPerson_id == current_user.id:
                # Проверка, что все действия не были изменены после создания обращения
                # или, что не появилось новых действий
                for action in event.actions:
                    if action.modifyPerson_id != event.createPerson_id:
                        return False, u'В обращении были созданы новые или отредактированы первоначальные документы'
                return True, ''
        return False, u'У пользователя нет прав на удаление обращения'

    ok, msg = can_delete_event(event)
    if ok:
        event.deleted = 1
        db.session.add(event)
        db.session.query(Action).filter(Action.event_id == event.id).update(
            {
                Action.deleted: 1,
            }, synchronize_session=False)
        db.session.query(Visit).filter(Visit.event_id == event.id).update(
            {
                Visit.deleted: 1,
            }, synchronize_session=False)
        db.session.query(ScheduleClientTicket).filter(
            ScheduleClientTicket.event_id == event.id).update(
                {
                    ScheduleClientTicket.event_id: None,
                },
                synchronize_session=False)
        db.session.commit()
        return jsonify(None)

    return jsonify({
        'name': msg,
        'data': {
            'err_msg': u'Удаление запрещено'
        }
    }, 403, 'delete event error')
Exemplo n.º 5
0
def api_kladr_street_get():
    from application.models.kladr_models import Street
    city = request.args['city']
    street = request.args['street']
    res = Street.query.filter(Street.CODE.startswith(city[:-2]),
                              Street.NAME.startswith(street)).all()
    return jsonify([{'name': r.NAME, 'code': r.CODE} for r in res])
Exemplo n.º 6
0
def api_search_persons():
    try:
        query_string = request.args['q']
    except (KeyError, ValueError):
        return abort(404)
    result = SearchPerson.search(query_string)

    def cat(item):
        return {
            'display':
            u'#%d - %s %s %s (%s)' %
            (item['id'], item['lastname'], item['firstname'], item['patrname'],
             item['speciality']),
            'name':
            u'%s %s %s' %
            (item['lastname'], item['firstname'], item['patrname']),
            'speciality':
            item['speciality'],
            'id':
            item['id'],
            'tokens': [item['lastname'], item['firstname'], item['patrname']] +
            item['speciality'].split(),
        }

    data = map(cat, result['result']['items'])
    return jsonify(data)
Exemplo n.º 7
0
def handle_event_error(err):
    return jsonify({
        'name': err.message,
        'data': {
            'err_msg': err.data
        }
    }, 422, 'error')
Exemplo n.º 8
0
def api_event_new_get():
    event = Event()
    event.eventType = EventType.get_default_et()
    event.organisation = Organisation.query.filter_by(
        infisCode=str(ORGANISATION_INFIS_CODE)).first()
    event.isPrimaryCode = EventPrimary.primary[0]
    event.order = EventOrder.planned[0]

    ticket_id = request.args.get('ticket_id')
    if ticket_id:
        ticket = ScheduleClientTicket.query.get(int(ticket_id))
        client_id = ticket.client_id
        setDate = ticket.ticket.begDateTime
        note = ticket.note
        exec_person_id = ticket.ticket.schedule.person_id
    else:
        client_id = int(request.args['client_id'])
        setDate = datetime.datetime.now()
        note = ''
        exec_person_id = safe_current_user_id()
    event.execPerson_id = exec_person_id
    event.execPerson = Person.query.get(exec_person_id)
    event.orgStructure = event.execPerson.org_structure
    event.client = Client.query.get(client_id)
    event.setDate = setDate
    event.note = note
    db.session.add(event)
    v = EventVisualizer()
    return jsonify({
        'event': v.make_event(event),
        'payment': v.make_event_payment(None)
    })
Exemplo n.º 9
0
def page_not_found(e):
    if request_wants_json():
        return jsonify(unicode(e),
                       result_code=404,
                       result_name=u'Page not found')
    flash(u'Указанный вами адрес не найден')
    return render_template('404.html'), 404
Exemplo n.º 10
0
def api_schedule():
    person_id_s = request.args.get('person_ids')
    client_id_s = request.args.get('client_id')
    start_date_s = request.args.get('start_date')
    one_day = bool(request.args.get('one_day', False))
    reception_type = request.args.get('reception_type')
    related = bool(request.args.get('related', False))
    try:
        start_date = datetime.datetime.strptime(start_date_s,
                                                '%Y-%m-%d').date()
        if one_day:
            end_date = start_date + datetime.timedelta(days=1)
        else:
            end_date = start_date + datetime.timedelta(weeks=1)
        client_id = int(client_id_s) if client_id_s else None
    except ValueError:
        return abort(400)

    result = {
        'schedules': [],
    }

    context = ScheduleVisualizer()
    context.client_id = client_id
    context.reception_type = reception_type

    if person_id_s and not person_id_s == '[]':
        if person_id_s.startswith('[') and person_id_s.endswith(']'):
            person_ids = set(
                int(person_id) for person_id in person_id_s[1:-1].split(','))
        else:
            try:
                person_ids = {int(person_id_s)}
            except ValueError:
                person_ids = set()
    else:
        person_ids = set()

    if related:
        if not client_id:
            return abort(400)
        persons = Person.query.\
            join(ScheduleClientTicket.ticket, ScheduleTicket.schedule, Schedule.person).\
            filter(start_date <= Schedule.date, Schedule.date <= end_date).\
            filter(ScheduleClientTicket.client_id == client_id, ScheduleClientTicket.deleted == 0).\
            distinct()
        related_schedules = context.make_persons_schedule(
            persons, start_date, end_date)
        related_person_ids = set(person.id for person in persons)
        person_ids -= related_person_ids
        result['related_schedules'] = related_schedules

    if person_ids:
        persons = Person.query.filter(Person.id.in_(person_ids))
        schedules = context.make_persons_schedule(persons, start_date,
                                                  end_date)
        result['schedules'] = schedules

    return jsonify(result)
Exemplo n.º 11
0
def api_delete_action():
    action_id = request.json['action_id']
    if action_id:
        action = Action.query.filter(Action.id == action_id)
        action.update({Action.deleted: 1}, synchronize_session=False)
        db.session.commit()

    return jsonify(None)
Exemplo n.º 12
0
def api_get_action_ped():
    at_id = parse_id(request.args, 'action_type_id')
    if at_id is False:
        return abort(404)
    at = ActionType.query.get(at_id)
    if not at:
        return abort(404)
    return jsonify({'ped': get_planned_end_datetime(at_id)})
Exemplo n.º 13
0
def api_persons_tree_schedule_info():
    beg_date = safe_date(request.args.get('beg_date'))
    end_date = safe_date(request.args.get('end_date'))
    if not (beg_date and end_date):
        return abort(404)
    result = db.session.query(Schedule.person_id).filter(
        Schedule.deleted == 0, Schedule.reasonOfAbsence_id.is_(None),
        beg_date <= Schedule.date, Schedule.date <= end_date).distinct()
    return jsonify({'persons_with_scheds': [row[0] for row in result]})
Exemplo n.º 14
0
def api_service_delete_service():
    # TODO: validations
    action_ids = request.json['action_id_list']
    if action_ids:
        actions = Action.query.filter(Action.id.in_(action_ids))
        actions.update({Action.deleted: 1}, synchronize_session=False)
        db.session.commit()

    return jsonify(None)
Exemplo n.º 15
0
def api_refbook(name):
    for mod in (enums, ):
        if hasattr(mod, name):
            ref_book = getattr(mod, name)
            res = jsonify(ref_book.rb()['objects'])
            return res
    for mod in (exists, schedule, actions, client, event):
        if hasattr(mod, name):
            ref_book = getattr(mod, name)
            if 'deleted' in ref_book.__dict__:
                res = jsonify(
                    ref_book.query.filter_by(deleted=0).order_by(
                        ref_book.id).all())
            else:
                res = ref_book.query.order_by(ref_book.id).all()
                res = jsonify(res)
            return res
    return abort(404)
Exemplo n.º 16
0
def kladr_search_city(search_query=None, limit=300):
    result = []
    if search_query is None:
        return jsonify([])
    response = requests.get(u'{0}kladr/psg/search/{1}/{2}/'.format(
        app.config['VESTA_URL'], search_query, limit))
    for city in response.json()['data']:
        data = {
            'code': city['identcode'],
            'name': u'{0}. {1}'.format(city['shorttype'], city['name'])
        }
        if city['parents']:
            for parent in city['parents']:
                data['name'] = u'{0}, {1}. {2}'.format(data['name'],
                                                       parent['shorttype'],
                                                       parent['name'])
        result.append(data)
    return jsonify(result)
Exemplo n.º 17
0
def api_atl_get():
    # not used?
    at_class = int(request.args['at_class'])
    if not (0 <= at_class < 4):
        return abort(401)

    result = int_get_atl(at_class)

    return jsonify(result)
Exemplo n.º 18
0
def api_appointment():
    """
    Запись (отмена записи) пациента на приём.
    Параметры:
        client_id (int) - id пациента
        ticket_id (int) - ScheduleTicket.id
        [opt] appointment_type_code (str) - rbAppointmentType.code
        [opt] delete (bool) - удалять ли запись
        [opt] note (str) - жалобы
    """
    data = request.get_json()
    client_id = int(data['client_id'])
    ticket_id = int(data['ticket_id'])
    create_person = data.get('create_person', current_user.get_id())
    appointment_type_code = data.get('appointment_type_code', 'amb')
    delete = bool(data.get('delete', False))
    ticket = ScheduleTicket.query.get(ticket_id)
    if not ticket:
        return abort(404)
    client_ticket = ticket.client_ticket
    if client_ticket and client_ticket.client_id != client_id:
        return jsonify(
            None, 400,
            u'Талончик занят другим пациентом (%d)' % client_ticket.client_id)
    if delete:
        if not client_ticket:
            return abort(404)
        client_ticket.deleted = 1
        db.session.commit()
        return jsonify(None)
    if not client_ticket:
        client_ticket = ScheduleClientTicket()
        client_ticket.client_id = client_id
        client_ticket.ticket_id = ticket_id
        client_ticket.createDatetime = client_ticket.modifyDatetime = datetime.datetime.now(
        )
        client_ticket.createPerson_id = client_ticket.modifyPerson_id = create_person
        client_ticket.appointmentType = rbAppointmentType.query.filter(
            rbAppointmentType.code == appointment_type_code).first()
        db.session.add(client_ticket)
    if 'note' in data:
        client_ticket.note = data['note']
    db.session.commit()
    return jsonify(None)
Exemplo n.º 19
0
def api_service_change_account():
    # not used
    data = request.json
    if data['actions']:
        actions = Action.query.filter(Action.id.in_(data['actions']))
        actions.update({Action.account: data['account']},
                       synchronize_session=False)
        db.session.commit()

    return jsonify(None)
Exemplo n.º 20
0
def api_get_events():
    from application.models.event import Event
    from application.models.exists import Contract
    flt = request.get_json()
    base_query = Event.query.join(Client)
    context = EventVisualizer()
    if 'id' in flt:
        event = base_query.filter(Event.id == flt['id']).first()
        return jsonify({
            'pages':
            1,
            'items': [context.make_short_event(event)] if event else []
        })
    if 'client_id' in flt:
        base_query = base_query.filter(Event.client_id == flt['client_id'])
    if 'exec_person_id' in flt:
        base_query = base_query.filter(
            Event.execPerson_id == flt['exec_person_id'])
    if 'beg_date' in flt:
        base_query = base_query.filter(
            Event.setDate >= datetime.datetime.strptime(
                flt['beg_date'], '%Y-%m-%d').date())
    if 'unfinished' in flt:
        base_query = base_query.filter(Event.execDate.is_(None))
    elif 'end_date' in flt:
        base_query = base_query.filter(
            Event.execDate <= datetime.datetime.strptime(
                flt['end_date'], '%Y-%m-%d').date())
    if 'request_type_id' in flt:
        base_query = base_query.join(EventType).filter(
            EventType.requestType_id == flt['request_type_id'])
    if 'finance_id' in flt:
        base_query = base_query.join(Contract).filter(
            Contract.finance_id == flt['finance_id'])
    per_page = int(flt.get('per_page', 20))
    page = int(flt.get('page', 1))
    base_query = base_query.order_by(Event.setDate)
    paginate = base_query.paginate(page, per_page, False)
    return jsonify({
        'pages':
        paginate.pages,
        'items': [context.make_short_event(event) for event in paginate.items]
    })
Exemplo n.º 21
0
def api_client_payment_info_get():
    try:
        client_id = int(request.args['client_id'])
    except (KeyError, ValueError):
        return abort(400)

    client = Client.query.get(client_id)
    vis = EventVisualizer()
    res = vis.make_event_payment(None, client)
    return jsonify(res)
Exemplo n.º 22
0
def api_patient_get():
    client_id = parse_id(request.args, 'client_id')
    if client_id is False:
        return abort(404)
    context = ClientVisualizer()
    if client_id:
        client = Client.query.get(client_id)
        if not client:
            return abort(404)

        if 'for_servicing' in request.args:
            return jsonify(context.make_client_info_for_servicing(client))
        elif 'short' in request.args:
            return jsonify(context.make_short_client_info(client))
        return jsonify({'client_data': context.make_client_info(client)})
    else:
        client = Client()
        db.session.add(
            client
        )  # требуется привязанный к сессии клиент для доступа к некоторым атрибутам (documents)
        return jsonify({'client_data': context.make_client_info(client)})
Exemplo n.º 23
0
def api_action_new_get():
    src_action = Action.query.get(int(request.args['src_action_id'])) \
        if 'src_action_id' in request.args else None
    action_type_id = int(request.args['action_type_id'])
    event_id = int(request.args['event_id'])

    action = create_action(action_type_id, event_id, src_action=src_action)

    v = ActionVisualizer()
    result = v.make_action(action)
    db.session.rollback()
    return jsonify(result)
Exemplo n.º 24
0
def api_diagnosis_save():
    current_datetime = datetime.datetime.now()
    data = request.json
    diagnosis_id = data.get('diagnosis_id')
    diagnostic_id = data.get('diagnostic_id')
    if diagnosis_id:
        diagnosis = Diagnosis.query.get(diagnosis_id)
    else:
        diagnosis = Diagnosis()
        diagnosis.createDatetime = current_datetime
    if diagnostic_id:
        diagnostic = Diagnostic.query.get(diagnostic_id)
    else:
        diagnostic = Diagnostic()
        diagnostic.createDatetime = current_datetime

    diagnosis.modifyDatetime = current_datetime
    diagnostic.modifyDatetime = current_datetime

    diagnosis.client_id = data['client_id']
    diagnosis.person_id = data['person']['id']
    diagnosis.diagnosisType_id = safe_traverse(data, 'diagnosis_type', 'id')
    diagnosis.character_id = safe_traverse(data, 'character', 'id')
    diagnosis.dispanser_id = safe_traverse(data, 'dispanser', 'id')
    diagnosis.traumaType_id = safe_traverse(data, 'trauma', 'id')
    diagnosis.MKB = safe_traverse(data, 'mkb', 'code') or ''
    diagnosis.MKBEx = safe_traverse(data, 'mkb_ex', 'code') or ''
    if not diagnosis.endDate:
        diagnosis.endDate = current_datetime
    db.session.add(diagnosis)

    diagnostic.event_id = data['event_id']
    diagnostic.diagnosis = diagnosis
    diagnostic.diagnosisType_id = safe_traverse(data, 'diagnosis_type', 'id')
    diagnostic.character_id = safe_traverse(data, 'character', 'id')
    diagnostic.stage_id = safe_traverse(data, 'stage', 'id')
    diagnostic.phase_id = safe_traverse(data, 'phase', 'id')
    diagnostic.dispanser_id = safe_traverse(data, 'dispanser', 'id')
    diagnostic.traumaType_id = safe_traverse(data, 'trauma', 'id')
    diagnostic.healthGroup_id = safe_traverse(data, 'health_group', 'id')
    diagnostic.result_id = safe_traverse(data, 'result', 'id')
    diagnostic.notes = data.get('notes', '')
    diagnostic.sanatorium = 0
    diagnostic.hospital = 0
    diagnostic.speciality_id = 1
    diagnostic.version = 0
    diagnostic.rbAcheResult_id = safe_traverse(data, 'ache_result', 'id')
    if not diagnostic.setDate:
        diagnostic.setDate = current_datetime
    db.session.add(diagnostic)

    db.session.commit()
    return jsonify(None)
Exemplo n.º 25
0
def api_create_lab_direction():
    ja = request.get_json()
    event_id = ja['event_id']
    event = Event.query.get(event_id)
    org_structure = event.current_org_structure
    if not org_structure:
        return jsonify(
            {'message': u'Пациент не привязан ни к одному из отделений.'}, 422,
            'ERROR')

    for j in ja['directions']:
        action_type_id = j['type_id']
        assigned = j['assigned']
        data = {'plannedEndDate': dateutil_parse(j['planned_end_date'])}
        action = create_new_action(action_type_id,
                                   event_id,
                                   assigned=assigned,
                                   data=data)
        db.session.add(action)

    db.session.commit()
    return jsonify(None)
Exemplo n.º 26
0
def api_service_remove_coord():
    # not used
    data = request.json
    if data['action_id']:
        actions = Action.query.filter(Action.id.in_(data['action_id']))
        actions.update({
            Action.coordDate: None,
            Action.coordPerson_id: None
        },
                       synchronize_session=False)
        db.session.commit()

    return jsonify(None)
Exemplo n.º 27
0
def api_search_clients():
    try:
        query_string = request.args['q']
        limit = int(request.args.get('limit', 100))
    except (KeyError, ValueError):
        return abort(404)

    base_query = Client.query
    id_list = []

    if query_string:
        result = SearchPatient.search(query_string)
        id_list = [item['id'] for item in result['result']['items']]
        if id_list:
            base_query = base_query.filter(Client.id.in_(id_list))
        else:
            return jsonify([])
    clients = base_query.order_by(db.func.field(Client.id,
                                                *id_list)).limit(limit).all()
    context = ClientVisualizer()
    if 'short' in request.args:
        return jsonify(map(context.make_short_client_info, clients))
    else:
        return jsonify(map(context.make_search_client_info, clients))
Exemplo n.º 28
0
def api_day_schedule():
    person_id = parse_id(request.args, 'person_id')
    if person_id is False:
        return abort(400)
    try:
        start_date = datetime.datetime.strptime(request.args.get('start_date'),
                                                '%Y-%m-%d').date()
        end_date = start_date + datetime.timedelta(days=1)
    except ValueError:
        return abort(400)

    context = ScheduleVisualizer()
    person = Person.query.get(person_id)
    return jsonify(
        context.make_person_schedule_description(person, start_date, end_date))
Exemplo n.º 29
0
def api_schedule_description():
    person_id = parse_id(request.args, 'person_id')
    if person_id is False:
        return abort(400)
    start_date_s = request.args.get('start_date')
    try:
        start_date = datetime.datetime.strptime(start_date_s, '%Y-%m').date()
        end_date = start_date + datetime.timedelta(
            calendar.monthrange(start_date.year, start_date.month)[1])
    except ValueError:
        return abort(400)

    context = ScheduleVisualizer()
    person = Person.query.get(person_id)
    return jsonify(
        context.make_person_schedule_description(person, start_date, end_date))
Exemplo n.º 30
0
def api_event_info():
    event_id = int(request.args['event_id'])
    event = Event.query.get(event_id)
    vis = EventVisualizer()
    data = {
        'event': vis.make_event(event),
    }
    if current_user.role_in('admin'):
        data['diagnoses'] = vis.make_diagnoses(event)
        data['payment'] = vis.make_event_payment(event)
        data['services'] = vis.make_event_services(event_id)
    elif current_user.role_in('doctor'):
        data['diagnoses'] = vis.make_diagnoses(event)
    elif current_user.role_in(('rRegistartor', 'clinicRegistrator')):
        data['payment'] = vis.make_event_payment(event)
        data['services'] = vis.make_event_services(event_id)
    return jsonify(data)