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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
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)
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
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)
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)
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
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)
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')
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)
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)
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')