Пример #1
0
def post_schedule_data(schedule_id):
    """saves new/edited device schedule to db"""
    error = None
    req_data = request.get_json()
    req_data['hash'] = hashlib.md5(
        json.dumps(req_data, sort_keys=True).encode('utf-8')).hexdigest()
    if schedule_id == 'new':
        schedule = DB.get_object('device_schedules',\
            splice_params(req_data, 'login', 'title', 'device_type_id', 'hash', 'params'),\
            create=True)
        if schedule:
            schedule_id = schedule['id']
        else:
            raise Exception('Ошибка создания шаблона.')
    else:
        schedule_id = int(schedule_id)
        check_schedule = DB.execute("""
            select login 
            from device_schedules
            where id = %(id)s""", {'id': schedule_id},
                                    keys=False)
        if check_schedule:
            if check_schedule == req_data['login']:
                DB.param_update('device_schedules',\
                    {'id': schedule_id},\
                    splice_params(req_data, 'title', 'device_type_id', 'hash', 'params'))
                DB.execute(
                    """
                    delete from device_schedule_items
                    where schedule_id = %(schedule_id)s
                    """, {'schedule_id': schedule_id})
            else:
                error = 'Шаблон зарегистрирован другим пользователем.'
        else:
            error = 'Шаблон не найдено.'
    if error:
        return bad_request(error)
    else:
        DB.execute("""
            insert into device_schedule_items (schedule_id, day_no, params)
            values (%(schedule_id)s, %(day_no)s, %(params)s)""",\
            [{'schedule_id': schedule_id,\
                'day_no': item['day_no'],\
                'params': json.dumps(item['params'])}\
                for item in req_data['items']])
        return jsonify({'id': schedule_id})
Пример #2
0
def register_user():
    """registers user and returns user data with token"""
    user_data = request.get_json()
    user_exists = DB.get_object('users', {'login': user_data['login']},
                                create=False)
    if user_exists:
        return bad_request('Пользователь с этим именем уже зарегистрирован.')
    user_data['public_id'] = _create_public_id()
    return send_user_data(splice_params(user_data, 'login', 'public_id', 'password'),\
        create=True)
Пример #3
0
def account():
    """checks login data and returns user data with token"""
    req_data = request.get_json()
    account_key = splice_params(req_data, 'login', 'elog')
    if request.method == 'POST':
        elog = ELog(account_key['elog'])
        status = False
        try:
            status = bool(elog.login(req_data['login_data']))
        except Exception:
            logging.exception(req_data['elog'] + ' login error')
        account_data = splice_params(req_data, 'login_data')
        account_data['status'] = status
        if not DB.param_upsert('accounts', account_key, account_data):
            raise Exception('Account update or creation failed')
        return jsonify({'status': status})
    else:
        if not DB.param_delete('accounts', account_key):
            raise Exception('Account delete failed')
    return ok_response()
Пример #4
0
def test_account():
    #elogs accounts management
    data = {}
    token_data = {
        'login': LOGIN,
        'type': 'auth'}
    login_data = {'callsign': 'TEST1ADIF', 'password': '******'}
    post_data = {'login': LOGIN, 
        'token': _create_token(token_data), 
        'elog': 'dev.cfmrda',
        'login_data': login_data}
    login_data['password'] += '_'
    acc_key = splice_params(post_data, 'login', 'elog')
    DB.param_delete('accounts', acc_key)
    #--create / wrong elog password
    req = requests.post(API_URI + 'account', json=post_data)
    req.raise_for_status()
    logging.debug(req.text)
    rsp_data = req.json()
    assert 'status' in rsp_data
    assert not rsp_data['status']
    db_data = DB.get_object('accounts', acc_key, create=False)
    assert db_data
    del db_data['status']
    cmp_data(db_data['login_data'], post_data['login_data'])
    #--update / good elog password
    post_data['login_data']['password'] = '******'
    req = requests.post(API_URI + 'account', json=post_data)
    req.raise_for_status()
    logging.debug(req.text)
    rsp_data = req.json()
    assert 'status' in rsp_data
    assert rsp_data['status']
    db_data = DB.get_object('accounts', acc_key, create=False)
    assert db_data
    del db_data['status']
    cmp_data(db_data['login_data'], post_data['login_data'])
    #--delete
    del post_data['login_data']
    req = requests.delete(API_URI + 'account', json=post_data)
    req.raise_for_status()
    db_data = DB.get_object('accounts', acc_key, create=False)
    assert not db_data
    post_data['login_data'] = login_data
    req = requests.post(API_URI + 'account', json=post_data)
Пример #5
0
def splice_request(*params):
    return splice_params(request.get_json(), *params)
Пример #6
0
def main(conf):
    """does the job"""
    db_params = conf.items('db')

    _db = DBConn(db_params)
    yield from _db.connect()

    loggers = yield from _db.execute(
        """
        select id, callsign, logger, login_data, qso_count, 
            to_char(last_updated, 'YYYY-MM-DD') as last_updated
        from ext_loggers
        where state = 0 and 
            (last_updated is null or last_updated < now() - interval '14 days')
        """, None, True)
    if not loggers:
        logging.debug('No updates are due today.')
        return
    for row in loggers.values():
        logger = ExtLogger(row['logger'])
        update_params = {}
        adifs = None
        try:
            adifs = logger.load(row['login_data'])
            logging.debug(row['callsign'] + ' ' + row['logger'] +
                          ' data was downloaded.')
        except Exception:
            logging.exception(row['callsign'] + ' ' + row['logger'] +
                              ' error occured')
            update_params['state'] = 1

        if adifs:

            prev_uploads = yield from _db.execute(
                """
                select id from uploads where ext_logger_id = %(id)s""", row,
                True)
            if prev_uploads:
                for upload_id in prev_uploads:
                    yield from _db.remove_upload(upload_id)

            qso_count = 0

            for adif in adifs:
                adif = adif.upper()
                qso_count += adif.count('<EOR>')
                parsed = load_adif(adif, 'STATION_CALLSIGN', ignore_activator=True,\
                    strip_callsign_flag=False)
                date_start, date_end = None, None
                sql_rda = """
                    select distinct rda 
                    from callsigns_rda
                    where callsign = %(callsign)s and rda <> '***' and 
                        (dt_start is null or dt_start <= %(tstamp)s) and
                        (dt_stop is null or dt_stop >= %(tstamp)s)
                """
                qsos = []

                with (yield from _db.pool.cursor()) as cur:
                    for qso in parsed['qso']:
                        yield from exec_cur(cur, sql_rda, qso)
                        if cur.rowcount == 1:
                            qso['rda'] = (yield from cur.fetchone())[0]
                            qso['callsign'], qso['station_callsign'] = \
                                qso['station_callsign'], qso['callsign']
                            if not date_start or date_start > qso['tstamp']:
                                date_start = qso['tstamp']
                            if not date_end or date_end < qso['tstamp']:
                                date_end = qso['tstamp']
                            qsos.append(qso)

                if qsos:
                    logging.debug(str(len(qsos)) + ' rda qso found.')
                    file_hash = yield from _db.check_upload_hash(
                        adif.encode('utf-8'))

                    db_res = yield from _db.create_upload(\
                        callsign=row['callsign'],\
                        upload_type=row['logger'],\
                        date_start=date_start,\
                        date_end=date_end,\
                        file_hash=file_hash,\
                        activators=set([]),
                        ext_logger_id=row['id'],
                        qsos=qsos)

                    logging.debug(
                        str(db_res['qso']['ok']) + ' qso were stored in db.')

            update_params = {\
                'qso_count': qso_count,\
                'state': 0,\
                'last_updated': datetime.now().strftime("%Y-%m-%d")}

        yield from _db.param_update('ext_loggers', splice_params(row, ('id',)),\
            update_params)
        logging.debug('logger data updated')
Пример #7
0
def splice_request(*params):
    """return splice of request's json hash"""
    return splice_params(request.get_json(), *params)