Skip to content
Snippets Groups Projects
Commit 02268529 authored by Remco Tukker's avatar Remco Tukker
Browse files

review comments

parent 2c5d6487
Branches
Tags
1 merge request!43Feature/comp 205 create survey datamodel
......@@ -17,7 +17,7 @@ logger = logging.getLogger(__name__)
int_pk = Annotated[int, mapped_column(primary_key=True)]
int_pk_fkNREN = Annotated[int, mapped_column(ForeignKey("nren.id"), primary_key=True)]
int_pk_fkQuestions = Annotated[int, mapped_column(ForeignKey("questions.year"), primary_key=True)]
int_pk_fkSurvey = Annotated[int, mapped_column(ForeignKey("survey.year"), primary_key=True)]
json = Annotated[Dict[str, Any], mapped_column(JSON)]
......@@ -25,18 +25,18 @@ json = Annotated[Dict[str, Any], mapped_column(JSON)]
# See https://github.com/pallets-eco/flask-sqlalchemy/issues/1140
# mypy: disable-error-code="name-defined"
class Questions(db.Model):
__tablename__ = 'questions'
class Survey(db.Model):
__tablename__ = 'survey'
year: Mapped[int_pk]
survey: Mapped[json]
# status column?
class Answers(db.Model):
__tablename__ = 'answers'
class SurveyResponse(db.Model):
__tablename__ = 'survey_response'
nren_id: Mapped[int_pk_fkNREN]
nren: Mapped[NREN] = relationship(lazy='joined')
question_year: Mapped[int_pk_fkQuestions]
question: Mapped[Questions] = relationship(lazy='joined')
survey_year: Mapped[int_pk_fkSurvey]
survey: Mapped[Survey] = relationship(lazy='joined')
answers: Mapped[json]
# completed column?? I think we need that..
"""add tables for questions and answers
"""Add survey and response tables
Revision ID: 66a385dbb1fc
Revision ID: 366171c7ba9e
Revises: 42a826af0431
Create Date: 2023-06-13 14:59:59.339036
Create Date: 2023-06-15 11:33:28.549679
"""
from alembic import op
......@@ -10,7 +10,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '66a385dbb1fc'
revision = '366171c7ba9e'
down_revision = '42a826af0431'
branch_labels = None
depends_on = None
......@@ -19,25 +19,25 @@ depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
'questions',
'survey',
sa.Column('year', sa.Integer(), nullable=False),
sa.Column('survey', sa.JSON(), nullable=False),
sa.PrimaryKeyConstraint('year', name=op.f('pk_questions'))
sa.PrimaryKeyConstraint('year', name=op.f('pk_survey'))
)
op.create_table(
'answers',
'survey_response',
sa.Column('nren_id', sa.Integer(), nullable=False),
sa.Column('question_year', sa.Integer(), nullable=False),
sa.Column('survey_year', sa.Integer(), nullable=False),
sa.Column('answers', sa.JSON(), nullable=False),
sa.ForeignKeyConstraint(['nren_id'], ['nren.id'], name=op.f('fk_answers_nren_id_nren')),
sa.ForeignKeyConstraint(['question_year'], ['questions.year'], name=op.f('fk_answers_question_year_questions')),
sa.PrimaryKeyConstraint('nren_id', 'question_year', name=op.f('pk_answers'))
sa.ForeignKeyConstraint(['nren_id'], ['nren.id'], name=op.f('fk_survey_response_nren_id_nren')),
sa.ForeignKeyConstraint(['survey_year'], ['survey.year'], name=op.f('fk_survey_response_survey_year_survey')),
sa.PrimaryKeyConstraint('nren_id', 'survey_year', name=op.f('pk_survey_response'))
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('answers')
op.drop_table('questions')
op.drop_table('survey_response')
op.drop_table('survey')
# ### end Alembic commands ###
......@@ -8,7 +8,7 @@ from sqlalchemy import select
from compendium_v2.db import db
from compendium_v2.db.model import NREN
from compendium_v2.db.survey_model import Questions, Answers
from compendium_v2.db.survey_model import Survey, SurveyResponse
from compendium_v2.routes import common
......@@ -27,12 +27,12 @@ def open_survey() -> Any:
nren = db.session.execute(select(NREN).order_by(NREN.id).limit(1)).scalar_one()
year = 1988
questions = db.session.scalar(select(Questions).where(Questions.year == year))
if questions is None or questions.survey == {}:
survey = db.session.scalar(select(Survey).where(Survey.year == year))
if survey is None or survey.survey == {}:
# TODO remove this at some point, its just convenient for now while we are changing the survey model a lot
p = Path(__file__).with_name('survey_model.json')
with p.open('r') as f:
questions = json.load(f)
survey = json.load(f)
# TODO add some magic strings in the json (like the year) and interpolate them here
......@@ -40,23 +40,23 @@ def open_survey() -> Any:
page = 0
unvalidated: List[str] = [] # or should we keep track of what _was_ validated?
answers = db.session.scalar(
select(Answers).where(Answers.question_year == year).where(Answers.nren_id == nren.id)
response = db.session.scalar(
select(SurveyResponse).where(SurveyResponse.survey_year == year).where(SurveyResponse.nren_id == nren.id)
)
previous_answers = db.session.scalar(
select(Answers).where(Answers.question_year == year - 1).where(Answers.nren_id == nren.id)
previous_response = db.session.scalar(
select(SurveyResponse).where(SurveyResponse.survey_year == year - 1).where(SurveyResponse.nren_id == nren.id)
)
if answers:
data = answers.answers["data"]
page = answers.answers["page"]
unvalidated = answers.answers["unvalidated"]
elif previous_answers:
data = previous_answers.answers["data"]
if response:
data = response.answers["data"]
page = response.answers["page"]
unvalidated = response.answers["unvalidated"]
elif previous_response:
data = previous_response.answers["data"]
unvalidated = ["TODO everything?"]
open_survey: dict = {
"model": questions,
"model": survey,
"data": data,
"page": page,
"unvalidated": unvalidated
......@@ -72,23 +72,23 @@ def save_survey() -> Any:
# just a hardcoded year and nren for development for now
nren = db.session.execute(select(NREN).order_by(NREN.id).limit(1)).scalar_one()
year = 1988
questions = db.session.scalar(select(Questions).where(Questions.year == year))
if questions is None:
questions = Questions(year=year, survey={})
db.session.add(questions)
survey = db.session.scalar(select(Survey).where(Survey.year == year))
if survey is None:
survey = Survey(year=year, survey={})
db.session.add(survey)
answers = db.session.scalar(
select(Answers).where(Answers.question_year == year).where(Answers.nren_id == nren.id)
response = db.session.scalar(
select(SurveyResponse).where(SurveyResponse.survey_year == year).where(SurveyResponse.nren_id == nren.id)
)
if answers is None:
answers = Answers(question_year=year, nren_id=nren.id)
db.session.add(answers)
if response is None:
response = SurveyResponse(survey_year=year, nren_id=nren.id)
db.session.add(response)
save_survey = request.json
if not save_survey:
raise Exception("Invalid format")
answers.answers = {
response.answers = {
"data": save_survey["data"],
"page": save_survey["page"],
"unvalidated": save_survey["unvalidated"]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment