Ejemplo n.º 1
0
def password_recovery_request():
    """check login data and returns user data with token"""
    req_data = request.get_json()
    user_data = DB.get_object('users', req_data, create=False)
    if not user_data or not user_data['email']:
        return bad_request('Пользователь или email не зарегистрирован.\n' +\
            'The username or email address is not registered.')
    token = _create_token({
        'login': req_data['login'],
        'type': 'passwordRecovery',
        'expires': time.time() + 60 * 60 * 60})
    text = """Пройдите по ссылкe, чтобы сменить пароль на ONEADIF.com: """\
        + CONF.get('web', 'address')\
        + '/#/passwordRecovery?token=' + token + """

Если вы не запрашивали смену пароля на ONEADIF.com, просто игнорируйте это письмо.
Ссылка будет действительна в течение 1 часа.

Follow this link to change your ONEADIF.com password: """ \
        + CONF.get('web', 'address')\
        + '/#/passwordRecovery?token=' + token + """

Ignore this message if you did not request password change


Служба поддержки ONEADIF.com support"""
    send_email.send_email(text=text,\
        fr=CONF.get('email', 'address'),\
        to=user_data['email'],\
        subject="ONEADIF.com - password change")
    return jsonify({'message':\
        'На ваш почтовый адрес было отправлено письмо с инструкциями по ' +\
        'сменен пароля.\n' +\
        'The message with password change instrunctions was sent to your ' +\
        'email address'})
Ejemplo n.º 2
0
def post_device_props(device_id):
    """saves updated device title/props to db"""
    device_id = int(device_id)
    req_data = request.get_json()
    error = None
    check_device = DB.execute("""
        select login, devices_types.props as props_headers
            from devices join devices_types
                on devices.device_type_id = devices_types.id
            where devices.id = %(id)s""", {'id': device_id},
                              keys=False)
    if check_device:
        if check_device['login'] == req_data['login']:
            upd_params = {}
            if 'delete' in req_data and req_data['delete']:
                upd_params = {'login': None}
            else:
                upd_params = {'title': req_data['title'],\
                    'schedule_id': req_data['schedule_id']\
                        if 'schedule_id' in req_data else None,\
                    'mode': req_data['mode'] if 'mode' in req_data else None,\
                    'props': json.dumps(req_data['props'])}
            DB.param_update('devices', {'id': device_id}, upd_params)
        else:
            error = 'Устройство зарегистрировано другим пользователем.'
    else:
        error = 'Устройство не найдено.'
    if error:
        return bad_request(error)
    else:
        return ok_response()
Ejemplo n.º 3
0
def post_switch_settings(device_id, switch_id):
    """updates switch title and other settings"""
    device_id = int(device_id)
    switch_id = int(switch_id)
    req_data = request.get_json()
    error = None
    check_switch = DB.execute("""
        select login 
        from devices join devices_switches 
            on devices.id = devices_switches.device_id
        where devices.id = %(device_id)s and 
            devices_switches.device_type_switch_id = %(switch_id)s""",\
        {'device_id': device_id, 'switch_id': switch_id}, keys=False)
    if check_switch:
        logging.debug('check_switch')
        logging.debug(check_switch)
        if check_switch == req_data['login']:
            DB.param_update('devices_switches',\
                {'device_id': device_id, 'device_type_switch_id': switch_id},\
                {'title': req_data['title'],\
                    'enabled': req_data['enabled']})
        else:
            error = 'Датчик зарегистрирован другим пользователем.'
    else:
        error = 'Датчик не найден.'
    if error:
        return bad_request(error)
    else:
        return ok_response()
Ejemplo n.º 4
0
def post_sensor_settings(sensor_id):
    """updates sensor title and other settings"""
    sensor_id = int(sensor_id)
    req_data = request.get_json()
    error = None
    check_sensor = DB.execute("""
        select login 
        from sensors join devices on sensors.device_id = devices.id
        where sensors.id = %(id)s""", {'id': sensor_id},
                              keys=False)
    if check_sensor:
        if check_sensor == req_data['login']:
            DB.param_update('sensors',\
                {'id': sensor_id},\
                {'title': req_data['title'],\
                    'enabled': req_data['enabled'],\
                    'correction': req_data['correction'],\
                    'is_master': req_data['is_master']})
        else:
            error = 'Датчик зарегистрирован другим пользователем.'
    else:
        error = 'Датчик не найден.'
    if error:
        return bad_request(error)
    else:
        return ok_response()
Ejemplo n.º 5
0
def delete_schedule(schedule_id):
    """deletes device schedule from db"""
    error = None
    req_data = request.get_json()
    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.execute(
                """
                delete from device_schedule_items
                where schedule_id = %(schedule_id)s
                """, {'schedule_id': schedule_id})
            DB.param_delete('device_schedules', {'id': schedule_id})
        else:
            error = 'Шаблон зарегистрирован другим пользователем.'
    else:
        error = 'Шаблон не найден.'
    if error:
        return bad_request(error)
    else:
        return ok_response()
Ejemplo n.º 6
0
def post_sensors_data():
    """stores sensors data in db"""
    req_data = request.get_json()
    update_device_last_contact(req_data['device_id'])
    device_sensors = DB.execute("""
        select device_type_sensor_id as id, id as sensor_id 
            from sensors 
            where device_id = %(device_id)s
        """,
                                req_data,
                                keys=True)
    if device_sensors:
        device_rtc = DB.execute(
            """
            select rtc 
            from devices_types join devices 
                on devices.device_type_id = devices_types.id
            where devices.id = %(device_id)s
            """, req_data)
        for item in req_data['data']:
            if item['sensor_id'] in device_sensors.keys():
                item['sensor_id'] = device_sensors[
                    item['sensor_id']]['sensor_id']
                if not device_rtc:
                    del item['tstamp']
                DB.get_object('sensors_data', item, create=True)
    else:
        return bad_request('Device sensors not found')
    return ok_response()
Ejemplo n.º 7
0
def register_device():
    """binds device to user's account"""
    req_data = request.get_json()
    device_id = HASHIDS.decode(req_data['device_hash'])
    error = None
    if device_id:
        check_device = DB.execute(
            """
            select id, login 
                from devices
                where id = %(device_id)s
            """, {'device_id': device_id}, False)
        if check_device:
            if check_device['login']:
                if check_device['login'] == req_data['login']:
                    error = 'Вы уже зарегистрировали это устройство.\n' +\
                            'You had already registered this device.'
                else:
                    error = 'Устройство уже зарегистрировано дркгим пользователем.\n' +\
                            'Another user had already registered this device.'
            else:
                DB.param_update('devices', {'id': device_id},
                                {'login': req_data['login']})
        else:
            error = 'Устройство не найдено. Device not found.'
    else:
        error = 'Неверный код устройства. Invalid device code.'
    if error:
        return bad_request(error)
    else:
        return ok_response()
Ejemplo n.º 8
0
def create_device():
    """registers device and it's sensors data in db;
    returns json {"device_id": _, "device_token": _}"""
    req_data = request.get_json()
    check_device_type = DB.execute(
        """
        select id 
            from devices_types 
            where id = %(device_type_id)s
        """, req_data)
    if not check_device_type:
        return bad_request('Неверный тип устройства. Invalid device type.')
    else:
        device_db_data = DB.get_object('devices',\
            splice_request("login", "device_type_id"), create=True)
        DB.execute(
            """insert into sensors (device_type_sensor_id, device_id)
            select id, %(id)s
            from device_type_sensors
            where device_type_id = %(device_type_id)s""", device_db_data)
        token = _create_token({'device_id': device_db_data['id']})
        return jsonify({
            'device_id': device_db_data['id'],
            'device_token': token
        })
Ejemplo n.º 9
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('Пользователь с этим именем уже зарегистрирован.\n' +\
                'This username is already exists.')
    return send_user_data(user_data, create=True)
Ejemplo n.º 10
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)
Ejemplo n.º 11
0
def upload_cancel():
    req_data = request.get_json()
    if DB.execute("""select upload_id
        from uploads join accounts on uploads.account_id = accounts.account_id
        where upload_id = %(upload_id)s and login = %(login)s""", req_data):
        with upload_client() as conn:
            conn.send(('cancel', req_data['upload_id']))
            rsp = conn.recv()
            return jsonify(rsp)
    else:
        return bad_request('Загрузка не найдена.\n' +\
                'Upload not found')
Ejemplo n.º 12
0
def send_user_data(user_data, create=False):
    """returns user data with auth token as json response"""
    data = DB.get_object('users', user_data, create=create)
    if data:
        token = _create_token({'login': data['login'], 'type': 'auth'})
        del data['password']
        data['token'] = token
        return jsonify(data)
    else:
        if create:
            raise Exception("User creation failed")
        else:
            return bad_request('Неверное имя пользователя или пароль.\n' +\
                    'Wrong username or password')
Ejemplo n.º 13
0
def get_sensor_info(sensor_id):
    """returns sensor info json"""
    sensor_id = int(sensor_id)
    sensor_data = DB.execute("""
        select sensors.title as sensor_title, 
                device_type_sensors.title as device_type_title,
                sensor_type, correction
            from sensors join device_type_sensors
                on device_type_sensor_id = device_type_sensors.id
            where sensors.id = %(sensor_id)s
        """, {'sensor_id': sensor_id},
                             keys=False)
    if not sensor_data:
        return bad_request('Сенсор не найден. Sensor not found.')
    return jsonify(sensor_data)
Ejemplo n.º 14
0
def get_schedule_data(schedule_id):
    """returns device schedule itesm (days) in json"""
    schedule_id = int(schedule_id)
    schedule_data = DB.execute("""
        select device_schedules.id, device_type_id as device_type_id, 
            device_schedules.title, devices_types.title as device_type_title,
            device_schedules.params
            from device_schedules join devices_types 
                on device_type_id = devices_types.id
            where device_schedules.id = %(schedule_id)s
        """, {'schedule_id': schedule_id},
                               keys=False)
    if not schedule_data:
        return bad_request('Шаблон не найден.')
    schedule_data['items'] = schedule_items(schedule_id)
    return jsonify(schedule_data)
Ejemplo n.º 15
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})
Ejemplo n.º 16
0
def get_device_info(device_id):
    """returns device info json"""
    device_id = int(device_id)
    device_data = DB.execute("""
        select device_type_id as device_type_id, 
            devices_types.title as device_type,
            devices.title as title, 
            schedule_id, mode,
            devices_types.props as props_titles,
            devices.props as props_values
            from devices join devices_types 
                on device_type_id = devices_types.id
            where devices.id = %(device_id)s
        """, {'device_id': device_id},
                             keys=False)
    if not device_data:
        return bad_request('Устройство не найдено. Device not found.')
    timezone_ts, timezone_dev, _ = get_timezones(device_id=device_id)
    device_data['hash'] = HASHIDS.encode(device_id)
    device_data['sensors'] = DB.execute("""
		select * from
		(select sensors.id, sensors.is_master, sensor_type as type, device_type_sensor_id,
					sensors.title as title, device_type_sensors.title as default_title,
					sensors.enabled, sensors.correction, device_type_sensors.modes,
                    device_type_sensors.computed_expression,
                    device_type_sensors.sensors_group as group
				from sensors join device_type_sensors on
						device_type_sensors.id = sensors.device_type_sensor_id
						where device_id = %(device_id)s) as sensors
					left join lateral (select value,
						to_char(tstamp::timestamp at time zone %(timezone_ts)s 
                            at time zone %(timezone_dev)s, 'YYYY-MM-DD HH24:MI:SS') as tstamp
						from sensors_data
							where sensor_id = sensors.id
						order by sensors_data.tstamp desc
						limit 1) as last_data 
						on true
        order by device_type_sensor_id
        """, {'device_id': device_id, 'timezone_ts': timezone_ts, 'timezone_dev': timezone_dev},\
            keys=False)
    if device_data['sensors']:
        for computed_sensor in device_data['sensors']:
            if computed_sensor['computed_expression']:
                sensors_group = [sensor for sensor in device_data['sensors']\
                    if not sensor['computed_expression'] and\
                    sensor['group'] == computed_sensor['group']]
                if sensors_group:
                    sensors_group_values = {
                        'v' + str(idx): sensor['value']
                        for idx, sensor in enumerate(sensors_group)
                    }
                    try:
                        computed_sensor['value'] = round(eval(computed_sensor['computed_expression'],\
                            {}, sensors_group_values), 2)
                        computed_sensor['tstamp'] = sensors_group[0]['tstamp']
                    except Exception as exc:
                        logging.exception(exc)
                        logging.error('Error computing sensor value')
                        logging.error('Exxpression: %s',
                                      computed_sensor['computed_expression'])
                        logging.error('Values:')
                        logging.error(sensors_group_values)

    device_data['switches'] = DB.execute("""
		select * from
		(select device_type_switch_id as id,
					devices_switches.title as title, device_type_switches.title as default_title,
					enabled, device_type_switches.type, device_type_switches.modes
				from devices_switches join device_type_switches on
						device_type_switches.id = devices_switches.device_type_switch_id
						where device_id = %(device_id)s) as switches
					left join lateral (select state,
						to_char(tstamp, 'YYYY-MM-DD HH24:MI:SS') as tstamp
						from devices_switches_state
							where devices_switches_state.device_id = %(device_id)s
                                and devices_switches_state.device_type_switch_id = switches.id
						order by devices_switches_state.tstamp desc
						limit 1) as last_data 
						on true
        order by id
        """, {'device_id': device_id},
                                         keys=False)

    timezone_dev_shift = tz_shift(timezone_dev)

    for data_type in ('sensors', 'switches'):
        if isinstance(device_data[data_type], dict):
            device_data[data_type] = [
                device_data[data_type],
            ]
        if device_data[data_type]:
            for row in device_data[data_type]:
                if row['tstamp']:
                    row['tstamp'] += timezone_dev_shift

    return jsonify(device_data)