diff --git a/client/src/interfaces/ApiModels.ts b/client/src/interfaces/ApiModels.ts index a6fa68a0e9b58dcc63ad67d29884bbf3e781a64a..2734884b7783b662113dc00f61d112f8a58f5dd6 100644 --- a/client/src/interfaces/ApiModels.ts +++ b/client/src/interfaces/ApiModels.ts @@ -56,6 +56,7 @@ export interface Question extends NameID { slide_id: number total_score: number type_id: number + correcting_instructions: string } export interface QuestionAlternative { diff --git a/client/src/interfaces/ApiRichModels.ts b/client/src/interfaces/ApiRichModels.ts index b9ca9f333640071518a9f216e08a77af670eb153..253565a40e4ca4c8d0b1cc3597a58d5eb91cf2ec 100644 --- a/client/src/interfaces/ApiRichModels.ts +++ b/client/src/interfaces/ApiRichModels.ts @@ -36,5 +36,6 @@ export interface RichQuestion { total_score: number question_type: QuestionType type_id: number + correcting_instructions: string alternatives: QuestionAlternative[] } diff --git a/client/src/pages/presentationEditor/components/slideSettingsComponents/Instructions.tsx b/client/src/pages/presentationEditor/components/slideSettingsComponents/Instructions.tsx index 7d609300966a6f6e5141685f1fbaed7e0298d7ba..48917fcc01967b72e121b506fc6e4e05ac883c40 100644 --- a/client/src/pages/presentationEditor/components/slideSettingsComponents/Instructions.tsx +++ b/client/src/pages/presentationEditor/components/slideSettingsComponents/Instructions.tsx @@ -29,7 +29,7 @@ const Instructions = ({ activeSlide, competitionId }: InstructionsProps) => { .put( `/api/competitions/${competitionId}/slides/${activeSlide.id}/questions/${activeSlide.questions[0].id}`, { - instructions: event.target.value, + correcting_instructions: event.target.value, } ) .then(() => { @@ -55,7 +55,7 @@ const Instructions = ({ activeSlide, competitionId }: InstructionsProps) => { <Center> <TextField id="outlined-basic" - defaultValue={''} + defaultValue={activeSlide.questions[0].correcting_instructions} onChange={updateInstructionsText} variant="outlined" fullWidth={true} diff --git a/client/src/pages/views/components/JudgeScoringInstructions.tsx b/client/src/pages/views/components/JudgeScoringInstructions.tsx index 3cc803194a9754bea8a9b23b3f2b073d6547c05c..97062246b33a5105efd34fbfb2ac3a66296ee93b 100644 --- a/client/src/pages/views/components/JudgeScoringInstructions.tsx +++ b/client/src/pages/views/components/JudgeScoringInstructions.tsx @@ -20,7 +20,7 @@ const JudgeScoringInstructions = ({ question }: JudgeScoringInstructionsProps) = return ( <JudgeScoringInstructionsContainer elevation={3}> <Typography variant="h4">Rättningsinstruktioner</Typography> - <Typography variant="body1">Såhär rättar du denhär frågan</Typography> + <Typography variant="body1">{question?.correcting_instructions}</Typography> </JudgeScoringInstructionsContainer> ) } diff --git a/server/app/apis/questions.py b/server/app/apis/questions.py index b14849d224501e48f9cce8a108bfd24f29657e99..94df2a36456baf6e8a492250944dc4156b5aa21f 100644 --- a/server/app/apis/questions.py +++ b/server/app/apis/questions.py @@ -14,11 +14,13 @@ question_parser_add = reqparse.RequestParser() question_parser_add.add_argument("name", type=str, default=None, location="json") question_parser_add.add_argument("total_score", type=int, default=None, location="json") question_parser_add.add_argument("type_id", type=int, required=True, location="json") +question_parser_add.add_argument("correcting_instructions", type=str, default=None, location="json") question_parser_edit = reqparse.RequestParser() question_parser_edit.add_argument("name", type=str, default=sentinel, location="json") question_parser_edit.add_argument("total_score", type=int, default=sentinel, location="json") question_parser_edit.add_argument("type_id", type=int, default=sentinel, location="json") +question_parser_edit.add_argument("correcting_instructions", type=str, default=sentinel, location="json") @api.route("/questions") diff --git a/server/app/core/rich_schemas.py b/server/app/core/rich_schemas.py index 7d883584776677ee1be21975ed5ae413dc2019fa..60f7ac309d37b3be15c0378a94a71dc10cdf7cc8 100644 --- a/server/app/core/rich_schemas.py +++ b/server/app/core/rich_schemas.py @@ -25,6 +25,7 @@ class QuestionSchemaRich(RichSchema): total_score = ma.auto_field() slide_id = ma.auto_field() type_id = ma.auto_field() + correcting_instructions = ma.auto_field() alternatives = fields.Nested(schemas.QuestionAlternativeSchema, many=True) diff --git a/server/app/core/schemas.py b/server/app/core/schemas.py index 73ac21cbd396d1ee175e6151003d05f1a10dc82b..a2e81c2568f6e1c100fbc5c302a200644e11433d 100644 --- a/server/app/core/schemas.py +++ b/server/app/core/schemas.py @@ -63,6 +63,7 @@ class QuestionSchema(BaseSchema): total_score = ma.auto_field() type_id = ma.auto_field() slide_id = ma.auto_field() + correcting_instructions = ma.auto_field() class QuestionAnswerSchema(BaseSchema): diff --git a/server/app/database/controller/add.py b/server/app/database/controller/add.py index 6c5ea14bcd143a4bac5d0f214fc3d14f8f73bfe0..18bcd4b130a1f6aebd49df520c83e741a819d8cc 100644 --- a/server/app/database/controller/add.py +++ b/server/app/database/controller/add.py @@ -179,10 +179,13 @@ def _competition_no_slides(name, year, city_id, font=None): item_competition.font = font # Add code for Judge view - code(item_competition.id, 2) + code(2, item_competition.id) # Add code for Audience view - code(item_competition.id, 3) + code(3, item_competition.id) + + # Add code for Operator view + code(4, item_competition.id) item_competition = utils.refresh(item_competition) return item_competition @@ -244,12 +247,12 @@ def user(email, password, role_id, city_id, name=None): return db_add(User(email, password, role_id, city_id, name)) -def question(name, total_score, type_id, slide_id): +def question(name, total_score, type_id, slide_id, correcting_instructions=None): """ Adds a question to the specified slide using the provided arguments. """ - return db_add(Question(name, total_score, type_id, slide_id)) + return db_add(Question(name, total_score, type_id, slide_id, correcting_instructions)) def question_alternative(text, value, question_id): diff --git a/server/app/database/controller/copy.py b/server/app/database/controller/copy.py index a32ba1deda39c231bfa7ea2b26f91337e0ee2bec..08d743472035034b3b45eda3bdc6553f26377f60 100644 --- a/server/app/database/controller/copy.py +++ b/server/app/database/controller/copy.py @@ -24,6 +24,7 @@ def _question(item_question_old, slide_id): item_question_old.total_score, item_question_old.type_id, slide_id, + item_question_old.correcting_instructions, ) ) @@ -102,7 +103,6 @@ def competition(item_competition_old): name = "Kopia av " + item_competition_old.name item_competition, total = search.competition(name=name) if item_competition: - print(f"{item_competition[total-1].name}, {total=}") name = "Kopia av " + item_competition[total - 1].name item_competition_new = add._competition_no_slides( diff --git a/server/app/database/controller/delete.py b/server/app/database/controller/delete.py index f3dc2dd51b680bc8834d9cf734001ac7291883d8..93a4c3393bf57fed22f2d672338f6cc592ecc543 100644 --- a/server/app/database/controller/delete.py +++ b/server/app/database/controller/delete.py @@ -56,10 +56,13 @@ def slide(item_slide): def team(item_team): - """ Deletes team and its question answers. """ + """ Deletes team, its question answers and the code. """ for item_question_answer in item_team.question_answers: question_answers(item_question_answer) + for item_code in item_team.code: + code(item_code) + default(item_team) @@ -86,12 +89,19 @@ def question_answers(item_question_answers): def competition(item_competition): - """ Deletes competition and its slides and teams. """ + """ Deletes competition, its slides, teams and codes. """ for item_slide in item_competition.slides: _slide(item_slide) for item_team in item_competition.teams: team(item_team) + for item_code in item_competition.codes: + code(item_code) - # TODO codes default(item_competition) + + +def code(item_code): + """ Deletes competition code. """ + + default(item_code) diff --git a/server/app/database/models.py b/server/app/database/models.py index d4e177b070755d75cada2988e43468f28794146b..0f909aee7f7ebf33efba3b5145601c9a6f9bced5 100644 --- a/server/app/database/models.py +++ b/server/app/database/models.py @@ -104,6 +104,7 @@ class Competition(db.Model): slides = db.relationship("Slide", backref="competition") teams = db.relationship("Team", backref="competition") + codes = db.relationship("Code", backref="competition") background_image = db.relationship("Media", uselist=False) @@ -121,6 +122,7 @@ class Team(db.Model): competition_id = db.Column(db.Integer, db.ForeignKey("competition.id"), nullable=False) question_answers = db.relationship("QuestionAnswer", backref="team") + code = db.relationship("Code", backref="team") def __init__(self, name, competition_id): self.name = name @@ -154,15 +156,17 @@ class Question(db.Model): total_score = db.Column(db.Integer, nullable=False, default=1) type_id = db.Column(db.Integer, db.ForeignKey("question_type.id"), nullable=False) slide_id = db.Column(db.Integer, db.ForeignKey("slide.id"), nullable=False) + correcting_instructions = db.Column(db.Text, nullable=True, default=None) question_answers = db.relationship("QuestionAnswer", backref="question") alternatives = db.relationship("QuestionAlternative", backref="question") - def __init__(self, name, total_score, type_id, slide_id): + def __init__(self, name, total_score, type_id, slide_id, correcting_instructions): self.name = name self.total_score = total_score self.type_id = type_id self.slide_id = slide_id + self.correcting_instructions = correcting_instructions class QuestionAlternative(db.Model): diff --git a/server/tests/test_db.py b/server/tests/test_db.py index dd13427c1c62689a88edefc96a6c16b8aa9db682..c504ed14ff39224f9bb76fe8fd32ca99e12dd725 100644 --- a/server/tests/test_db.py +++ b/server/tests/test_db.py @@ -3,10 +3,10 @@ This file tests the database controller functions. """ import app.database.controller as dbc -from app.database.models import City, Media, MediaType, Role, User +from app.database.models import City, Competition, Media, MediaType, Role, User, Code from tests import app, client, db -from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail +from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail, delete def test_user(client): @@ -58,7 +58,7 @@ def test_copy(client): item_slide_original = item_slides[0] # Inserts several copies of the same slide - num_copies = 10 + num_copies = 3 for _ in range(num_copies): item_slide_copy = dbc.copy.slide(item_slide_original) num_slides += 1 @@ -73,6 +73,23 @@ def test_copy(client): item_slide_original = item_competition_original.slides[order] check_slides_copy(item_slide_original, item_slide, num_slides, order) assert item_slide.competition_id != item_slide_original.competition_id + # TODO: Check that all codes are corectly created + + # Deleting competition deletes all corresponding codes + item_competitions = dbc.get.all(Competition) + for item_competition in item_competitions: + dbc.delete.competition(item_competition) + assert len(dbc.get.all(Code)) == 0 + + # Deleting team deletes the right code + item_competition = dbc.add.competition("tom", 1971, 1) + item_team_1 = dbc.add.team("Lag 1", item_competition.id) + item_team_2 = dbc.add.team("Lag 2", item_competition.id) + assert len(dbc.get.all(Code)) == 5 + dbc.delete.team(item_team_1) + assert len(dbc.get.all(Code)) == 4 + dbc.delete.team(item_team_2) + assert len(dbc.get.all(Code)) == 3 def check_slides_copy(item_slide_original, item_slide_copy, num_slides, order):