Пример #1
0
def get_user(res, user_id=None):
    """get user information

    Keyword arguments:
    res -- instance of Response class
    user_id --  id of user (default None)
    """

    if not user_id:
        if not utils.has_scopes(db, request.user_id, 'self.info'):
            raise FailedRequest(config['ERROR']['permission'], 403)

    elif not utils.has_scopes(db, request.user_id, 'user.info'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    user_id = user_id or request.user_id
    result = user.get_user(user_id)

    if result['role'] == 'music_provider' or result['role'] == 'admin':
        music_providers = music_provider.get_user_music_providers(user_id)
        result['music_providers'] = music_providers

    elif result['role'] == 'artist':
        artist = user.get_user_artist(user_id)
        result['artist'] = artist['results'][0]

    elif result['role'] == 'user':
        invitations = user.get_user_invitations(result['email'])
        result['invitations'] = invitations

    return res.send(result)
Пример #2
0
def get_contract(res):
    if not utils.has_scopes(db, request.user_id, 'self.info'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    application_status = user.get_user(request.user_id)['application_status']

    if application_status != 'applied':
        raise FailedRequest(config['ERROR']['permission'], 403)

    result = user.get_contract()

    return res.send(result)
Пример #3
0
def export_applications_csv(res):
    if not utils.has_scopes(db, request.user_id, 'user.info'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    secret_id = request.mida + '.' + request.access_token

    return res.send('/user/applications/secret/' + secret_id)
Пример #4
0
def edit_user_active(_params):
    """edit user preferences

    Keyword arguments:
    _params includes:
        active -- activity state of user
        user_id -- id of user
    """

    if _params['active'] not in ['0', '1']:
        raise FailedRequest('Invalid active', 400)

    get_user(_params['user_id'])

    _params['active'] = int(_params['active'])

    database.query(
        db.music_db, '''
            UPDATE  users
            SET     active = :active
            WHERE   user_id = :user_id
            LIMIT   1
        ''', _params)

    elastic_search.update_from_index('users', 'user', _params['user_id'],
                                     ['active'], _params)
Пример #5
0
def edit_user(res, user_id=None):
    """edit user information

    Keyword arguments:
    res -- instance of Response class
    user_id --  id of user to be edited (default None)
    """

    if not user_id:
        if not utils.has_scopes(db, request.user_id, 'self.info'):
            raise FailedRequest(config['ERROR']['permission'], 403)

        user_id = request.user_id

        params = utils.get_data([], ['genre', 'mood', 'instrument', 'picture'],
                                request.values)

    else:
        if not utils.has_scopes(db, request.user_id, 'user.info'):
            raise FailedRequest(config['ERROR']['permission'], 403)

        params = utils.get_data(['active'], [], request.values)

    params['user_id'] = user_id

    if 'active' in params:
        user.edit_user_active(params)

    else:
        user_image = request.files.get('image')

        if user_image and utils.is_file_type(user_image.filename,
                                             user_image.mimetype, 'image'):
            params.update({
                'image':
                user_image,
                'image_filename':
                secure_filename(user_image.filename)
            })
            user.edit_user_picture(params)

        user.edit_user_preference(params)

    result = dict(params)
    result.pop('image', None)

    return res.send(result)
Пример #6
0
def check_tokens(db, config, secret_id):
    if '.' not in secret_id:
        raise FailedRequest(config['ERROR']['permission'], 403)

    secret_id = secret_id.split('.')

    data = database.get(
        db.music_db, '''
            SELECT  *
            FROM    session s
                    JOIN    users u
                    ON      s.user_id = u.user_id
            WHERE   mida = :mida
        ''', {'mida': secret_id[0]})

    if not data or mida(secret_id[1]) != secret_id[0]:
        raise FailedRequest('Session expired', 401)
Пример #7
0
def search_users(res):
    if not utils.has_scopes(db, request.user_id, 'user.list'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    params = utils.get_data(['query'], ['page', 'entries'], request.args)

    result = user.search_users(params)

    return res.send(result)
Пример #8
0
def apply(res):
    if not utils.has_scopes(db, request.user_id, 'self.info'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    application_status = user.get_user(request.user_id)['application_status']

    if application_status != 'applied':
        raise FailedRequest(config['ERROR']['permission'], 403)

    params = utils.get_data(
        ['contract_id', 'original_music', 'name', 'source'],
        ['skype', 'genre', 'music_location'], request.values)

    params['user_id'] = request.user_id

    user.apply(params)

    return res.send(params)
Пример #9
0
def get_user(_params):
    data = database.get(db.app_db,
                        'SELECT * from users WHERE user_id = :user_id',
                        _params)

    if not data:
        raise FailedRequest('User not found')

    return data
Пример #10
0
def get_user_flagged_tracks(res):
    if not utils.has_scopes(db, request.user_id, 'user.music.list'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    params = utils.get_data([], ['page', 'entries'], request.args)

    params['user_id'] = request.user_id

    result = user.get_user_flagged_tracks(params)

    return res.send(result)
Пример #11
0
def decline_invitation(res):
    if not utils.has_scopes(db, request.user_id, 'self.info'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    params = utils.get_data(['role'], ['music_provider_id', 'artist_id'],
                            request.values)

    params['user_id'] = request.user_id
    user.decline_invitation(params)

    return res.send(params)
Пример #12
0
def autocomplete_users(res):
    if not utils.has_scopes(db, request.user_id, 'user.available.list'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    params = utils.get_data(['query'], ['entries'], request.args)

    params['entries'] = int(params['entries'] or config['ENTRIES'])

    result = user.autocomplete_users(params)

    return res.send(result)
Пример #13
0
def get_data(res):
    """get air_check information"""

    params = utils.get_data(['country'], [], request.args)

    result = air_check.get_data_by_country(params['country'])

    if len(result) == 0:
    	raise FailedRequest('Seems the ninjas cannot find any record. Sorry :(', 404)

    return res.send(result)
Пример #14
0
def get_data(reqd, optional, body):
    ret = {}

    i = len(reqd) - 1
    while i >= 0:
        temp = reqd[i]

        if not temp in body or type(body[temp]) == object:
            raise FailedRequest('Missing required parameter: ' + str(temp),
                                400)

        ret[temp] = body[temp]

        if isinstance(ret[temp], str):
            ret[temp] = clean_string(ret[temp])

            if ret[temp] == '':
                raise FailedRequest('Missing required parameter: ' + str(temp),
                                    400)

        i -= 1

    i = len(optional) - 1
    while i >= 0:
        temp = optional[i]

        if not temp in body or type(body[temp]) == object:
            ret[temp] = None

        else:
            ret[temp] = body[temp]

        if isinstance(ret[temp], str):
            ret[temp] = clean_string(ret[temp])

            if ret[temp] == '':
                ret[temp] = None

        i -= 1

    return ret
Пример #15
0
def get_data2(res):
    """get air_check information"""

    params = utils.get_data(['lat','lng'], ['distance'], request.args)

    if not params['distance']:
    	params['distance'] = 15 #15KM default

    result = air_check.get_data_by_point(params['lng'], params['lat'], params['distance'])

    if len(result) == 0:
    	raise FailedRequest('Seems the ninjas cannot find any record. Sorry :(', 404)

    return res.send(result)
Пример #16
0
def get_all_users(res):
    """get all users information sorted by email

    Keyword arguments:
    res -- instance of Response class
    """

    if not utils.has_scopes(db, request.user_id, 'user.list'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    params = utils.get_data([], ['page', 'entries'], request.args)

    result = user.get_all_users(params)

    return res.send(result)
Пример #17
0
def get_user(user_id, raise_exception=True):
    """get user

    Keyword arguments:
    user_id -- id of user
    """

    data = elastic_search.get('users', 'user', user_id)

    if not data:
        if raise_exception:
            raise FailedRequest('Invalid user_id', 400)

        return {}

    return data
Пример #18
0
def gateway_all(res):
    """gateway all tracks

    Keyword arguments:
    res -- instance of Response class
    """

    params = utils.get_data(['access_token', 'subscriber_number'], [],
                            request.args)

    result = gateway.store_mobile_info(params)

    if not result:
        raise FailedRequest('Cannot do that. Sorry :(', 403)

    return res.send(request.args)
Пример #19
0
def delete_user(res, user_id):
    """delete a user, set active to 0

    Keyword arguments:
    res -- instance of Response class
    user_id --  id of user to be deleted
    """

    if not utils.has_scopes(db, request.user_id, 'user.delete'):
        raise FailedRequest(config['ERROR']['permission'], 403)

    user.delete_user(user_id)

    auth.remove_scopes(user_id)
    auth.remove_session(user_id)

    return res.send('User deleted')
Пример #20
0
    def wrapper(*args, **kwargs):
        access_token = request.headers.get('Access-Token')
        mida = request.headers.get('mida')
        request.user_id = None
        request.artist_id = None
        request.music_provider_id = None
        request.is_admin = False

        if mida and access_token:
            data = database.get(
                app.db.music_db,
                '''
                    SELECT  *
                    FROM    session s
                            JOIN    users u
                            ON      s.user_id = u.user_id
                    WHERE   mida = :mida
                ''',
                {'mida': mida}
            )

            if not data or utils.mida(access_token) != mida:
                raise FailedRequest('Session expired', 401)

            request.user_id = data[0]['user_id']
            request.is_admin = data[0]['role'] == 'admin'
            request.mida = mida
            request.access_token = access_token
            music_provider_name = request.headers.get('music-provider-name')

            if not music_provider_name:
                if data[0]['role'] != 'artist':
                    return func(*args, **kwargs)

                filters = {
                    'term': {
                        'user_id': request.user_id
                    }
                }
                data = app.elastic_search.filter('artists', filters, 1)

                request.artist_id = data['results'][0]['artist_id']

                return func(*args, **kwargs)

            filters = {
                'exists': {
                    'field': 'users.' + request.user_id
                }
            }
            queries = [
                {
                    'key': 'music-provider-name',
                    'value': music_provider_name
                }
            ]
            data = app.elastic_search.filter('music_providers', filters, 1,
                                             queries=queries)

            if not data['results']:
                raise FailedRequest('Invalid music_provider_name', 400)

            request.music_provider_id = data['results'][0]['id']

            return func(*args, **kwargs)

        elif mida or access_token:
            raise FailedRequest('Session expired', 401)

        else:
            return func(*args, **kwargs)
Пример #21
0
def accept_invitation(_params):
    data = get_user(_params['user_id'])

    _params['email'] = data['email']
    mp_op = '=' if _params['music_provider_id'] else 'IS'
    a_op = '=' if _params['artist_id'] else 'IS'

    data = database.get(
        db.music_db, '''
            SELECT  *
            FROM    user_invites
            WHERE   email = :email
                    AND role = :role
                    AND music_provider_id %s :music_provider_id
                    AND artist_id %s :artist_id
        ''' % (mp_op, a_op), _params)

    if not data:
        raise FailedRequest('Invalid parameters', 400)

    if _params['role'] == 'artist':
        database.query(
            db.music_db, '''
                UPDATE  artists
                SET     user_id = :user_id
                WHERE   artist_id = :artist_id
                LIMIT   1
            ''', _params)

        elastic_search.update_from_index('artists', 'artist',
                                         _params['artist_id'],
                                         ['user_id', 'email'], _params)

        database.query(
            db.music_db, '''
                DELETE FROM user_invites
                WHERE       artist_id = :artist_id
            ''', _params)

    else:
        database.query(
            db.music_db, '''
                INSERT IGNORE INTO music_provider_owners_managers
                VALUES (
                    :user_id,
                    :music_provider_id,
                    :role
                )
            ''', _params)

        data = music_provider.get_music_provider(_params['music_provider_id'])

        _params['users'] = data['users']
        _params['users'][_params['user_id']] = _params['role']

        elastic_search.update_from_index('music_providers', 'music_provider',
                                         _params['music_provider_id'],
                                         ['users'], _params)

        database.query(
            db.music_db, '''
                DELETE FROM user_invites
                WHERE       music_provider_id = :music_provider_id
            ''', _params)

    if _params['role'] != 'artist':
        _params['role'] = 'music_provider'

    database.query(
        db.music_db, '''
            UPDATE  users
            SET     role = :role
            WHERE   user_id = :user_id
            LIMIT   1
        ''', _params)

    elastic_search.update_from_index('users', 'user', _params['user_id'],
                                     ['role'], _params)

    _params['scopes'] = config['SCOPES'][_params['role']]

    auth.remove_scopes(_params['user_id'])
    auth.add_scopes(_params)

    database.query(
        db.music_db, '''
            DELETE FROM user_invites
            WHERE       email = :email
        ''', _params)
Пример #22
0
def receive_message(res):
    """autocomplete gateway query

    Keyword arguments:
    res -- instance of Response class
    """
    help_msg = 'AirVironment allows everyone to submit a rating for  air quality of a place.\n\n'
    help_msg += 'All ratings are on a 1-10 scale, 10 being the highest\n'
    help_msg += 'Just send: do rating <air pollution>, <coughing>,  <shortness of breath>, <sneezing> @ <location>\n'
    help_msg += 'Example: do rating 8,7,6,6 @ eastwood quezon city philippines'

    invalid_location = 'Sorry, we cannot find that location'
    success_msg = 'The monkeys are now processing your feedback! The average air pollution rating in your place is  '
    low_quality = 'Seems there are pollutants causing this, please coordinate with your local government'
    high_quality = 'Wow! Seems you are breathing good air overthere. Lets try to keep it that way by protecting the environment.'

    notify_url = 'http://6848a814.ngrok.io/gateway/'

    request_body = request.get_json(force=True)
    request_body = request_body['inboundSMSMessageList']
    msg = request_body['inboundSMSMessage'][0]['message']
    msg_id = request_body['inboundSMSMessage'][0]['messageId']
    sender = request_body['inboundSMSMessage'][0]['senderAddress'].strip()
    msg = msg.strip()

    sender = gateway.get_sender_info(sender)
    if not len(sender):
        raise FailedRequest('No record of you. Sorry :(', 403)
    sender = sender[0]

    payload = {
        'address': sender['mobile_number'],
        'clientCorrelator': '00100',
        'senderAddress': 'tel:' + config['GOBE_NUMBER_SUFF'],
        'message': ''
    }
    endpoint = config['GLOBE_SMS_ENDPOINT'].format(sender['access_token'])
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': 'application/json'
    }

    # Keyword submit rating
    if msg.lower() == 'how to':
        payload['message'] = help_msg
        r = requests.post(endpoint, data=payload, headers=headers)

    elif msg.startswith('do rating'):
        full_location = msg.split('@')
        rating_data = full_location[0].lstrip('do rating').strip()
        full_location = full_location[1].strip()

        rating = rating_data.split(',')
        location = geolocator.geocode(full_location,
                                      language='en',
                                      exactly_one=True,
                                      addressdetails=True)

        if not location:
            payload['message'] = invalid_location
            r = requests.post(endpoint, data=payload, headers=headers)
            return res.send('ok')

        longitude = location.longitude
        latitude = location.latitude

        average = 0
        health_index = 0
        _ap_sum = 0
        _ac_sum = 0
        _sb_sum = 0
        _s_sum = 0

        to_average = air_check.get_data_by_point(longitude, latitude, 15)

        for item in to_average:
            _ap_sum += item['air_pollution']
            _ac_sum += item['caugh']
            _sb_sum += item['shortness_of_breath']
            _s_sum += item['sneezing']

        if len(to_average) != 0:
            average = _ap_sum / len(to_average)
            health_index += (_ac_sum / len(to_average))
            health_index += (_sb_sum / len(to_average))
            health_index += (_s_sum / len(to_average))

            success_msg += str(round(average, 2)) + ' of 10!\n\n'

            if average > 6:
                success_msg += low_quality + '\n\n'
            elif average < 4:
                success_msg += high_quality + '\n\n'

            if health_index > 20:
                success_msg += 'We also noticed that there are lots of symptoms of coughing, shortness of breath, sneezing, etc in your area. '
                success_msg += 'It is highly recommended to wear face mask or go to the doctor for checkup. \n\n'

        else:
            success_msg += '"cannot be determine". We are still gathering information about that area.'

        cols = '''
                    `country`, `state`, `raw_location`, `longitude`,
                    `latitude`, `air_pollution`, `caugh`, `shortness_of_breath`,
                    `sneezing`, `source`, `mobile_number`
                '''
        air_check_data = [
            location.raw['address']['country'],
            location.raw['address']['country_code'], location.address,
            longitude, latitude, rating[0].strip(), rating[1].strip(),
            rating[2].strip(), rating[3].strip(), 'sms.globe',
            sender['mobile_number']
        ]

        air_check_data = [tuple(air_check_data)]
        to_insert = air_check.add_data(cols, air_check_data)

        payload['message'] = success_msg + 'Location: {}'.format(
            location.address)

        r = requests.post(endpoint, data=payload, headers=headers)
        print(r.text)
        print(r.status_code)

    return res.send('ok')