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})
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)
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()
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)
def splice_request(*params): return splice_params(request.get_json(), *params)
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')
def splice_request(*params): """return splice of request's json hash""" return splice_params(request.get_json(), *params)