Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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
Beispiel #5
0
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'))
Beispiel #6
0
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)
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #9
0
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())
Beispiel #10
0
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
Beispiel #11
0
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)
Beispiel #12
0
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
Beispiel #13
0
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)
Beispiel #14
0
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