def api_project_moment_comment(proj_id, moment_id, comment_id): if not auth_consultant(): abort(401) if request.method == "DELETE": try: if not db_models.Project(proj_id).consultant_is_assigned( get_active_consultant()): abort(401) c = db_models.MomentComment(comment_id) if c.parent_moment_id != int(moment_id) or db_models.Moment( moment_id).parent_participant.project_id != int(proj_id): abort(400) c.delete_from_db() return "MomentComment ID {} deleted".format(c.id), 200 except db_models.MomentCommentNotFoundError: abort(404) except db_models.ProjectNotFound: abort(404) except db_models.MomentNotFoundError: abort(404) except: abort(400)
def api_projects_moments(proj_id, moment_id): if not auth_consultant(): abort(401) if request.method == "DELETE": try: if not db_models.Project(proj_id).consultant_is_assigned( get_active_consultant()): abort(401) m = db_models.Moment(moment_id) if not m.parent_participant.project_id == int(proj_id): abort(400) return m.delete_from_db().to_json() except db_models.MomentNotFoundError: abort(404) except db_models.ProjectNotFound: abort(404) except: abort(400)
def test_projects_add_moments(proj_id): tests.add_moment_to_project(proj_id) moments = [] for p in db_models.Project(proj_id).participants: participant_moments = db_models.Moment.get_moments_for_participant( p.id)['moments'] moments.append([m.to_dict() for m in participant_moments]) return json.dumps(moments, indent=4)
def project_download(proj_id): c = get_active_consultant() if not c: return redirect(url_for('consultant_login')) try: p = db_models.Project(proj_id) download_path = p.generate_download_bundle() return send_file(download_path, as_attachment=True, mimetype='application/zip') except db_models.ProjectNotFound: return redirect('/projects/{}/'.format(proj_id)), 404
def participant_moment_capture(): participant = get_active_participant() page_data = {'support_details': app.config['SUPPORT_DETAILS']} if participant == None or not participant.active: return render_template('participant/not_auth.html', hide_nav_links=True, page_data=page_data) if request.method == 'GET': project = db_models.Project(participant.project_id) page_data = { 'participant_id': participant.id, 'researcher_details': { 'name': project.consultants[0].display_name, 'email': project.consultants[0].email }, 'support_details': app.config['SUPPORT_DETAILS'], 'onload': None } return render_template('participant/capture_moment.html', page_data=page_data) elif request.method == 'POST': media = [] if request.form['media_path'] != "": media = [request.form['media_path']] location_status = None try: gps_long = float(request.form['gps_long']) gps_lat = float(request.form['gps_lat']) except ValueError: gps_long = None gps_lat = None location_status = request.form['gps_long'] new_moment = participant.add_moment(int(request.form['rating']), request.form['text_comment'], gps_long, gps_lat, media, location_status) #return new_moment.to_json() # Useful if posting data via AJAX and need to wait for response data before moving on return redirect(url_for('participant_moments'))
def project_modal_edit(project_id): c = get_active_consultant() if not c or not c.admin: abort(401) try: project = db_models.Project(project_id) return render_template('dashboard/modals/add_edit_project.html', active_consultant=c.to_dict(), project=project.to_dict()) except db_models.ProjectNotFound: abort(404)
def get_project_client(project_id): if not auth_consultant(): abort(401) try: return db_models.Project(project_id).client.to_json() except db_models.ProjectNotFound: return json.dumps({ "error_code": 201, "error_text": "No project found with ID {}".format(project_id) }), 404
def get_project_consultants(project_id): if not auth_consultant(): abort(401) consultant_dicts = [] try: for c in db_models.Project(project_id).consultants: consultant_dicts.append(c.to_dict()) return json.dumps(consultant_dicts, indent=4) except db_models.ProjectNotFound: return json.dumps({ "error_code": 201, "error_text": "No project found with ID {}".format(project_id) }), 404
def project_page(proj_id): c = get_active_consultant() if not c: return redirect(url_for('consultant_login')) try: p = db_models.Project(proj_id) # Get names of consultants for this project p_dict = p.to_dict() p_dict['consultants'] = [c.to_dict() for c in p.consultants] print(p_dict) return render_template('dashboard/project.html', project=p_dict, consultant=c.to_dict(), active_projects=c.get_active_project_details(), page_data=get_page_data()) except db_models.ProjectNotFound: # TODO: 404 project not found page return render_template('dashboard/project.html', project=None, consultant=c.to_dict(), active_projects=c.get_active_project_details(), page_data=get_page_data())
def api_projects_participant(project_id, participant_id): if not auth_consultant(): abort(401) c = get_active_consultant() try: if request.method == "PUT": if not db_models.Project(project_id).consultant_is_assigned(c): return 'Only consultants assigned to this project can update its participants.', 401 p = db_models.Participant(participant_id) if p.project_id != int(project_id): abort(401) p.display_name = request.values['display_name'] p.description = request.values['description'] p.update_in_db() return p.to_json() elif request.method == "GET": return db_models.Participant(participant_id).to_json() elif request.method == "DELETE": p = db_models.Participant(participant_id) p.delete_from_db(c) return p.to_json() except db_models.DeleteActiveParticipantError: return 'You cannot delete an active participant. Please deactivate this participant before deleting.', 400 except db_models.ConsultantNotAssignedToProjectError: return 'Only those consultants that are assigned to a project can delete its participants.', 401 except db_models.ParticipantNotFoundError: abort(404) except Exception as e: return str(e), 400
def set_project_active_state(project_id): if not auth_consultant(): abort(401) p = db_models.Project(project_id) try: if request.values['active'].lower() == 'true': p.activate(get_active_consultant()) elif request.values['active'].lower() == 'false': p.deactivate(get_active_consultant()) p.update_in_db() return str(p.active) except db_models.ProjectActivationError: return 'Consultant not authorised to set the active state of this project', 401 except ValueError: abort(400)
def get_project_participants(project_id): if not auth_consultant(): abort(401) try: if request.method == 'GET': project_participants = db_models.Participant.get_participants_for_project( project_id) participants_dicts = [] for p in project_participants: participants_dicts.append(p.to_dict()) return json.dumps(participants_dicts, indent=4) elif request.method == "POST": project = db_models.Project(project_id) consultant = get_active_consultant() if not project.consultant_is_assigned( consultant) and not consultant.admin: return 'Only consultants assigned to this project can add participants.', 401 new_participant = project.add_new_participant( request.values['display_name'], True, request.values['description']) return new_participant.to_json() except db_models.ProjectNotFound: return json.dumps({ "error_code": "201", "error_text": "No project found with ID {}".format(project_id) }), 404
def participant_moments(): participant = get_active_participant() page_data = {'support_details': app.config['SUPPORT_DETAILS']} if participant == None or not participant.active: return render_template('participant/not_auth.html', hide_nav_links=True, page_data=page_data) project = db_models.Project(participant.project_id) page_data = { 'participant_id': participant.id, 'researcher_details': { 'name': project.consultants[0].display_name, 'email': project.consultants[0].email }, 'support_details': app.config['SUPPORT_DETAILS'], 'onload': 'start_moments_and_comments_feed_ajax({})'.format(participant.id) } return render_template('participant/moments.html', page_data=page_data)
def get_project(project_id): if not auth_consultant(): abort(401) try: p = db_models.Project(project_id) if request.method == "GET": return p.to_json() elif request.method == "PUT": # Update project's data start_date = [] for s in request.values['start_ts'].split('-'): start_date.append(int(s)) start_date_object = datetime.datetime(start_date[0], start_date[1], start_date[2]) if request.values['code'] != p.bf_code: p.update_bf_code(request.values['code'], get_active_consultant()) p.title = request.values['title'] if request.values['active'] == 'true': p.activate(get_active_consultant()) elif request.values['active'] == 'false': p.deactivate(get_active_consultant()) p.client_id = int(request.values['client']) p.start_ts = start_date_object # If the consultant assignments have been provided, then need to check for any consultant IDs not already assigned and add them, also check if there are assigned consultants to remove. Might be best to simply remove all consultants and reassign. c_ids = [] for id in request.values['consultants'].split("consultants="): if id != '': id = id.rstrip('&') c_ids.append(int(id)) if len(c_ids) > 0: for c in p.consultants: p.remove_consultant_from_project(c, get_active_consultant()) for id in c_ids: p.assign_consultant_to_project(db_models.Consultant(id)) p.update_last_activity_ts() p.update_in_db() return p.to_json() if request.method == "DELETE": p.delete_from_db(get_active_consultant()) return p.to_json() except db_models.ProjectBFCodeError as e: return str(e), 400 except db_models.ConsultantNotAdminError as e: return str(e), 401 except db_models.ProjectNotFound as e: return str(e), 404 except db_models.DeleteActiveProjectError as e: return str(e), 400 except Exception as e: return str(e), 400