API: activities - minor refactor

This commit is contained in:
Sam 2018-05-09 16:32:06 +02:00
parent 436476c55d
commit d912dfc835

View File

@ -14,6 +14,52 @@ from .utils import get_gpx_info
activities_blueprint = Blueprint('activities', __name__) activities_blueprint = Blueprint('activities', __name__)
def create_activity_with_gpx(auth_user_id, gpx_data, file_path, sport_id):
new_activity = Activity(
user_id=auth_user_id,
sport_id=sport_id,
activity_date=gpx_data['start'],
duration=timedelta(seconds=gpx_data['duration'])
)
new_activity.gpx = file_path
new_activity.pauses = timedelta(seconds=gpx_data['stop_time'])
new_activity.moving = timedelta(seconds=gpx_data['moving_time'])
new_activity.distance = gpx_data['distance']
new_activity.min_alt = gpx_data['elevation_min']
new_activity.max_alt = gpx_data['elevation_max']
new_activity.descent = gpx_data['downhill']
new_activity.ascent = gpx_data['uphill']
new_activity.max_speed = gpx_data['max_speed']
new_activity.ave_speed = gpx_data['average_speed']
return new_activity
def create_activity_wo_gpx(auth_user_id, activity_data):
new_activity = Activity(
user_id=auth_user_id,
sport_id=activity_data.get('sport_id'),
activity_date=datetime.strptime(
activity_data.get('activity_date'), '%Y-%m-%d %H:%M'),
duration=timedelta(seconds=activity_data.get('duration'))
)
new_activity.moving = new_activity.duration
new_activity.distance = activity_data.get('distance')
new_activity.ave_speed = new_activity.distance / (
new_activity.duration.seconds / 3600)
new_activity.max_speed = new_activity.ave_speed
return new_activity
def get_file_path(auth_user_id, activity_file):
filename = secure_filename(activity_file.filename)
dir_path = os.path.join(
current_app.config['UPLOAD_FOLDER'], 'activities', str(auth_user_id))
if not os.path.exists(dir_path):
os.makedirs(dir_path)
file_path = os.path.join(dir_path, filename)
return file_path
@activities_blueprint.route('/activities', methods=['GET']) @activities_blueprint.route('/activities', methods=['GET'])
@authenticate @authenticate
def get_activities(auth_user_id): def get_activities(auth_user_id):
@ -64,18 +110,6 @@ def get_activity(auth_user_id, activity_id):
def get_activity_gpx(auth_user_id, activity_id): def get_activity_gpx(auth_user_id, activity_id):
"""Get gpx file for an activity""" """Get gpx file for an activity"""
activity = Activity.query.filter_by(id=activity_id).first() activity = Activity.query.filter_by(id=activity_id).first()
gpx_content = ''
message = ''
code = 500
response_object = {
'status': 'error',
'message': 'internal error',
'data': {
'gpx': gpx_content
}
}
if activity: if activity:
if not activity.gpx or activity.gpx == '': if not activity.gpx or activity.gpx == '':
response_object = { response_object = {
@ -84,19 +118,27 @@ def get_activity_gpx(auth_user_id, activity_id):
activity_id activity_id
) )
} }
code = 400 return jsonify(response_object), 400
return jsonify(response_object), code
try: try:
with open(activity.gpx, encoding='utf-8') as f: with open(activity.gpx, encoding='utf-8') as f:
gpx_content = gpx_content + f.read() gpx_content = f.read()
except Exception as e: except Exception as e:
appLog.error(e) appLog.error(e)
return jsonify(response_object), code response_object = {
'status': 'error',
'message': 'internal error',
'data': {
'gpx': ''
}
}
return jsonify(response_object), 500
status = 'success' status = 'success'
message = ''
code = 200 code = 200
else: else:
gpx_content = ''
status = 'not found' status = 'not found'
message = 'Activity not found (id: {})'.format(activity_id) message = 'Activity not found (id: {})'.format(activity_id)
code = 404 code = 404
@ -115,10 +157,9 @@ def get_activity_gpx(auth_user_id, activity_id):
@authenticate @authenticate
def post_activity(auth_user_id): def post_activity(auth_user_id):
"""Post an activity""" """Post an activity"""
code = 400
response_object = verify_extension('activity', request) response_object = verify_extension('activity', request)
if response_object['status'] != 'success': if response_object['status'] != 'success':
return jsonify(response_object), code return jsonify(response_object), 400
activity_data = json.loads(request.form["data"]) activity_data = json.loads(request.form["data"])
if not activity_data or activity_data.get('sport_id') is None: if not activity_data or activity_data.get('sport_id') is None:
@ -129,19 +170,11 @@ def post_activity(auth_user_id):
return jsonify(response_object), 400 return jsonify(response_object), 400
activity_file = request.files['file'] activity_file = request.files['file']
filename = secure_filename(activity_file.filename) file_path = get_file_path(auth_user_id, activity_file)
dirpath = os.path.join(
current_app.config['UPLOAD_FOLDER'],
'activities',
str(auth_user_id)
)
if not os.path.exists(dirpath):
os.makedirs(dirpath)
filepath = os.path.join(dirpath, filename)
try: try:
activity_file.save(filepath) activity_file.save(file_path)
gpx_data = get_gpx_info(filepath) gpx_data = get_gpx_info(file_path)
except Exception as e: except Exception as e:
appLog.error(e) appLog.error(e)
response_object = { response_object = {
@ -151,25 +184,10 @@ def post_activity(auth_user_id):
return jsonify(response_object), 500 return jsonify(response_object), 500
try: try:
new_activity = Activity( new_activity = create_activity_with_gpx(
user_id=auth_user_id, auth_user_id, gpx_data, file_path, activity_data.get('sport_id'))
sport_id=activity_data.get('sport_id'),
activity_date=gpx_data['start'],
duration=timedelta(seconds=gpx_data['duration'])
)
new_activity.gpx = filepath
new_activity.pauses = timedelta(seconds=gpx_data['stop_time'])
new_activity.moving = timedelta(seconds=gpx_data['moving_time'])
new_activity.distance = gpx_data['distance']
new_activity.min_alt = gpx_data['elevation_min']
new_activity.max_alt = gpx_data['elevation_max']
new_activity.descent = gpx_data['downhill']
new_activity.ascent = gpx_data['uphill']
new_activity.max_speed = gpx_data['max_speed']
new_activity.ave_speed = gpx_data['average_speed']
db.session.add(new_activity) db.session.add(new_activity)
db.session.commit() db.session.commit()
response_object = { response_object = {
'status': 'created', 'status': 'created',
'data': { 'data': {
@ -204,18 +222,7 @@ def post_activity_no_gpx(auth_user_id):
return jsonify(response_object), 400 return jsonify(response_object), 400
try: try:
new_activity = Activity( new_activity = create_activity_wo_gpx(auth_user_id, activity_data)
user_id=auth_user_id,
sport_id=activity_data.get('sport_id'),
activity_date=datetime.strptime(
activity_data.get('activity_date'), '%Y-%m-%d %H:%M'),
duration=timedelta(seconds=activity_data.get('duration'))
)
new_activity.moving = new_activity.duration
new_activity.distance = activity_data.get('distance')
new_activity.ave_speed = new_activity.distance / (
new_activity.duration.seconds / 3600)
new_activity.max_speed = new_activity.ave_speed
db.session.add(new_activity) db.session.add(new_activity)
db.session.commit() db.session.commit()