Skip to content

Commit

Permalink
Merge branch 'release/v17.11.22.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
ivan-c committed Dec 13, 2017
2 parents eaa9194 + 1717876 commit 3282c01
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 10 deletions.
44 changes: 44 additions & 0 deletions portal/migrations/versions/ffc71c89282f_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from alembic import op
import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker

from portal.models.questionnaire_bank import QuestionnaireBank


"""empty message
Revision ID: ffc71c89282f
Revises: 9e5c1c6c4d64
Create Date: 2017-12-07 14:54:47.576283
"""

# revision identifiers, used by Alembic.
revision = 'ffc71c89282f'
down_revision = '9e5c1c6c4d64'

Session = sessionmaker()


def upgrade():
bind = op.get_bind()
session = Session(bind=bind)

qb = session.query(QuestionnaireBank).filter_by(
name='IRONMAN_indefinite').first()

if qb:
session.execute("UPDATE questionnaire_responses "
"SET questionnaire_bank_id = {}"
"WHERE document->'questionnaire'->>'reference' "
"LIKE '%{}'".format(qb.id, '/irondemog'))


def downgrade():
bind = op.get_bind()
session = Session(bind=bind)

session.execute("UPDATE questionnaire_responses "
"SET questionnaire_bank_id = NULL "
"WHERE document->'questionnaire'->>'reference' "
"LIKE '%{}'".format('/irondemog'))
5 changes: 2 additions & 3 deletions portal/models/assessment_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ def recent_qnr_status(user, questionnaire_name, qb):
QuestionnaireResponse keyed by status found
"""
query = QuestionnaireResponse.query.distinct(
QuestionnaireResponse.status).filter(
query = QuestionnaireResponse.query.filter(
QuestionnaireResponse.subject_id == user.id
).filter(
QuestionnaireResponse.document[
Expand All @@ -31,7 +30,7 @@ def recent_qnr_status(user, questionnaire_name, qb):
QuestionnaireResponse.questionnaire_bank_id == qb.id
).order_by(
QuestionnaireResponse.status,
QuestionnaireResponse.authored).limit(9).with_entities(
QuestionnaireResponse.authored.desc()).with_entities(
QuestionnaireResponse.status, QuestionnaireResponse.authored)

results = {}
Expand Down
2 changes: 1 addition & 1 deletion portal/models/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ class Token(db.Model):
db.String(40), db.ForeignKey('clients.client_id', ondelete='CASCADE'),
nullable=False,
)
client = db.relationship('Client')
client = db.relationship('Client', backref='tokens')

user_id = db.Column(
db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'),
Expand Down
26 changes: 25 additions & 1 deletion portal/models/questionnaire_bank.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ def most_current_qb(user, as_of_date):
expired.
NB the `indefinite` classification is outside the scope of this method,
and should be treated independently
and should be treated independently - see `indefinite_qb`
"""
as_of_date = as_of_date or datetime.utcnow()
Expand Down Expand Up @@ -322,6 +322,30 @@ def most_current_qb(user, as_of_date):
return last_found
return last_found

@staticmethod
def indefinite_qb(user, as_of_date):
"""Return namedtuple (QBD) for user representing their indefinite QB
The `indefinite` case is special. Static method for this special case
as `most_current_qb()` handles all others. Same return type, a QBD
named tuple.
:returns QBD: with values only if the user has an indefinite qb
"""
indefinite_qb = QuestionnaireBank.qbs_for_user(user, 'indefinite')
if not indefinite_qb:
return QBD(None, None, None, None)

if len(indefinite_qb) > 1:
raise ValueError("only supporting single indefinite QB")

as_of_date = as_of_date or datetime.utcnow()
trigger_date = indefinite_qb[0].trigger_date(user)
return indefinite_qb[0].calculated_start(
trigger_date=trigger_date, as_of_date=as_of_date)


def calculated_start(self, trigger_date, as_of_date):
"""Return namedtuple (QBD) for QB
Expand Down
2 changes: 1 addition & 1 deletion portal/static/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ var ConsentUIHelper = function(consentItems, userId) {
"status": i18next.t("Status"),
"agreement": i18next.t("Agreement"),
"consentDate": i18next.t("Date"),
"registrationDate": i18next.t("Regiatration Date"),
"registrationDate": i18next.t("Registration Date"),
"historyConsentDate": i18next.t("Consent Date"),
"locale": i18next.t("GMT"),
"lastUpdated": i18next.t("Last Updated") + "<br/><span class='smaller-text'>" + i18next.t("( GMT, Y-M-D )") + "</span>",
Expand Down
55 changes: 51 additions & 4 deletions portal/views/assessment_engine.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
"""Assessment Engine API view functions"""
from datetime import datetime
from flask import abort, Blueprint, current_app, jsonify, request, redirect, Response
from flask import session, url_for
from flask import (
Blueprint,
Response,
abort,
current_app,
flash,
jsonify,
redirect,
request,
session,
url_for,
)
from flask_babel import gettext as _
from flask_swagger import swagger
from flask_user import roles_required
import jsonschema
Expand Down Expand Up @@ -1312,6 +1323,14 @@ def assessment_add(patient_id):
if (qb and qn and (qn.id in [qbq.questionnaire.id
for qbq in qb.questionnaires])):
qnr_qb = qb
# if a valid qb wasn't found, try the indefinite option
if not qnr_qb:
qbd = QuestionnaireBank.indefinite_qb(
patient, as_of_date=authored)
qb = qbd.questionnaire_bank
if (qb and qn and (qn.id in [qbq.questionnaire.id
for qbq in qb.questionnaires])):
qnr_qb = qb

questionnaire_response = QuestionnaireResponse(
subject_id=patient_id,
Expand Down Expand Up @@ -1375,18 +1394,31 @@ def present_needed():
resume_ids = []
for questionnaire_name in assessment_status.instruments_in_progress(
classification='all'):
questionnaire_bank = assessment_status.qb_data.qb
if questionnaire_name not in (
q.name for q in
assessment_status.qb_data.qb.questionnaires):
# This should only happen in the indefinite case
questionnaire_bank = QuestionnaireBank.query.filter(
QuestionnaireBank.classification == 'indefinite').one()

resume_ids.append(
qnr_document_id(
subject_id=subject_id,
questionnaire_bank_id=assessment_status.qb_data.qb.id,
questionnaire_bank_id=questionnaire_bank.id,
questionnaire_name=questionnaire_name,
status='in-progress'))

if resume_ids:
args['resume_identifier'] = resume_ids

if not args.get('instrument_id') and not args.get('resume_identifier'):
flash(_('All available questionnaires have been completed'))
current_app.logger.debug('no assessments needed, redirecting to /')
return redirect('/')

url = url_for('.present_assessment', **args)
return redirect(url, code=303)
return redirect(url, code=302)


@assessment_engine_api.route('/present-assessment')
Expand Down Expand Up @@ -1569,6 +1601,21 @@ def complete_assessment():
if entry_method:
current_app.logger.debug("assessment complete via %s", entry_method)

# Logout Assessment Engine after survey completion
for token in INTERVENTION.ASSESSMENT_ENGINE.client.tokens:
if token.user != current_user():
continue

current_app.logger.debug("assessment complete, logging out user: %s", token.user.id)
INTERVENTION.ASSESSMENT_ENGINE.client.notify({
'event': 'logout',
'user_id': token.user.id,
'refresh_token': token.refresh_token,
'info': 'complete-assessment',
})
db.session.delete(token)
db.session.commit()

current_app.logger.debug("assessment complete, redirect to: %s", next_url)
return redirect(next_url, code=303)

Expand Down

0 comments on commit 3282c01

Please sign in to comment.