Skip to content
Snippets Groups Projects
Commit 1ff39bad authored by Victor Löfgren's avatar Victor Löfgren
Browse files

Add question alternative api

parent d3425300
No related branches found
No related tags found
1 merge request!77Resolve "Add api for alternatives and answers"
This commit is part of merge request !77. Comments created here will be created in the context of that merge request.
......@@ -55,6 +55,9 @@ def item_response(item, code=http_codes.OK):
from flask_restx import Api
from .alternatives import api as alternative_ns
# from .answers import api as answer_ns
from .auth import api as auth_ns
from .codes import api as code_ns
from .competitions import api as comp_ns
......@@ -73,6 +76,8 @@ flask_api.add_namespace(user_ns, path="/api/users")
flask_api.add_namespace(auth_ns, path="/api/auth")
flask_api.add_namespace(comp_ns, path="/api/competitions")
flask_api.add_namespace(slide_ns, path="/api/competitions/<CID>/slides")
flask_api.add_namespace(alternative_ns, path="/api/competitions/<CID>/slides/<SOrder>/questions/<QID>/alternatives")
# flask_api.add_namespace(answer_ns, path="/api/competitions/<CID>/slides/<SOrder/questions/<QID>/answers")
flask_api.add_namespace(team_ns, path="/api/competitions/<CID>/teams")
flask_api.add_namespace(code_ns, path="/api/competitions/<CID>/codes")
flask_api.add_namespace(question_ns, path="/api/competitions/<CID>")
......
import app.core.http_codes as codes
import app.database.controller as dbc
from app.apis import check_jwt, item_response, list_response
from app.core.dto import QuestionAlternativeDTO, QuestionDTO
from app.core.parsers import question_alternative_parser
from app.core.schemas import QuestionAlternativeSchema
from app.database.controller.add import question_alternative
from app.database.controller.get import question_alternatives
from app.database.models import Question, QuestionAlternative
from flask_jwt_extended import jwt_required
from flask_restx import Resource
api = QuestionAlternativeDTO.api
schema = QuestionAlternativeDTO.schema
list_schema = QuestionAlternativeDTO.list_schema
@api.route("/")
@api.param("CID, SOrder, QID")
class QuestionAlternativeList(Resource):
@check_jwt(editor=True)
def get(self, CID, SOrder, QID):
items = dbc.get.question_alternatives(QID)
return list_response(list_schema.dump(items))
@check_jwt(editor=True)
def post(self, CID, SOrder, QID):
args = question_alternative_parser.parse_args(strict=True)
item = dbc.add.question_alternative(**args, question_id=QID)
return item_response(schema.dump(item))
@api.route("/<AID>")
@api.param("CID, SOrder, QID, AID")
class QuestionAlternativeList(Resource):
@check_jwt(editor=True)
def put(self, CID, SOrder, QID, AID):
args = question_alternative_parser.parse_args(strict=True)
item = dbc.get.one(QuestionAlternative, AID)
item = dbc.edit.question_alternative(item, **args)
return item_response(schema.dump(item))
@check_jwt(editor=True)
def delete(self, CID, SOrder, QID, AID):
item = dbc.get.one(QuestionAlternative, AID)
dbc.delete.default(item)
return {}, codes.NO_CONTENT
......@@ -14,7 +14,7 @@ list_schema = QuestionDTO.list_schema
@api.route("/questions")
@api.param("CID")
class QuestionsList(Resource):
class QuestionList(Resource):
@check_jwt(editor=True)
def get(self, CID):
items = dbc.get.question_list(CID)
......@@ -23,7 +23,7 @@ class QuestionsList(Resource):
@api.route("/slides/<SID>/questions")
@api.param("CID, SID")
class QuestionsList(Resource):
class QuestionListForSlide(Resource):
@check_jwt(editor=True)
def post(self, SID, CID):
args = question_parser.parse_args(strict=True)
......@@ -37,7 +37,7 @@ class QuestionsList(Resource):
@api.route("/slides/<SID>/questions/<QID>")
@api.param("CID, SID, QID")
class Questions(Resource):
class QuestionById(Resource):
@check_jwt(editor=True)
def get(self, CID, SID, QID):
item_question = dbc.get.question(CID, SID, QID)
......
......@@ -68,3 +68,15 @@ class QuestionDTO:
api = Namespace("questions")
schema = schemas.QuestionSchema(many=False)
list_schema = schemas.QuestionSchema(many=True)
class QuestionAlternativeDTO:
api = Namespace("alternatives")
schema = schemas.QuestionAlternativeSchema(many=False)
list_schema = schemas.QuestionAlternativeSchema(many=True)
# class QuestionAnswerDTO:
# api = Namespace("answers")
# schema = schemas.QuestionAnswerSchema(many=False)
# list_schema = schemas.QuestionAnswerSchema(many=True)
......@@ -60,7 +60,14 @@ question_parser.add_argument("total_score", type=int, default=None, location="js
question_parser.add_argument("type_id", type=int, default=None, location="json")
question_parser.add_argument("slide_id", type=int, location="json")
###QUESTION####
###QUESTION ALTERNATIVES####
question_alternative_parser = reqparse.RequestParser()
question_alternative_parser.add_argument("text", type=str, default=None, location="json")
question_alternative_parser.add_argument("value", type=int, default=None, location="json")
###CODE####
code_parser = reqparse.RequestParser()
code_parser.add_argument("pointer", type=str, default=None, location="json")
code_parser.add_argument("view_type_id", type=int, default=None, location="json")
......
......@@ -20,7 +20,7 @@ class QuestionSchemaRich(RichSchema):
total_score = ma.auto_field()
slide_id = ma.auto_field()
type_id = ma.auto_field()
alternatives = fields.Nested(schemas.QuestionAlternative, many=True)
alternatives = fields.Nested(schemas.QuestionAlternativeSchema, many=True)
class TeamSchemaRich(RichSchema):
......
......@@ -68,7 +68,7 @@ class QuestionAnswerSchema(BaseSchema):
team_id = ma.auto_field()
class QuestionAlternative(BaseSchema):
class QuestionAlternativeSchema(BaseSchema):
class Meta(BaseSchema.Meta):
model = models.QuestionAlternative
......
......@@ -15,6 +15,7 @@ from app.database.models import (
Media,
MediaType,
Question,
QuestionAlternative,
QuestionType,
Role,
Slide,
......@@ -114,6 +115,10 @@ def question(name, total_score, type_id, item_slide):
return db_add(Question(name, total_score, type_id, item_slide.id))
def question_alternative(text, value, question_id):
return db_add(QuestionAlternative(text, value, question_id))
def code(pointer, view_type_id):
""" Adds a code to the database using the provided arguments. """
......
......@@ -125,3 +125,17 @@ def question(item_question, name=None, total_score=None, type_id=None, slide_id=
db.session.refresh(item_question)
return item_question
def question_alternative(item, text=None, value=None):
if text:
item.text = text
if value:
item.value = value
db.session.commit()
db.session.refresh(item)
return item
......@@ -12,6 +12,7 @@ from app.database.models import (
ComponentType,
MediaType,
Question,
QuestionAlternative,
QuestionType,
Role,
Slide,
......@@ -78,6 +79,11 @@ def question(CID, SOrder, QID, required=True, error_msg=None):
return Question.query.join(Slide, join_filters).filter(Question.id == QID).first_extended(required, error_msg)
def question_alternatives(QID):
# join_filters = (Slide.competition_id == CID) & (Slide.order == SOrder)
return QuestionAlternative.query.filter(QuestionAlternative.question_id == QID).all()
def competition(CID):
""" Get Competition and all it's sub-entities """
""" HOT PATH """
......
......@@ -160,7 +160,7 @@ class Question(db.Model):
class QuestionAlternative(db.Model):
id = db.Column(db.Integer, primary_key=True)
text = db.Column(db.String(STRING_SIZE), nullable=False)
value = db.Column(db.Boolean, nullable=False)
value = db.Column(db.Integer, nullable=False)
question_id = db.Column(db.Integer, db.ForeignKey("question.id"), nullable=False)
def __init__(self, text, value, question_id):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment