Skip to content
Snippets Groups Projects
add.py 4.03 KiB
Newer Older
  • Learn to ignore specific revisions
  • """
    This file contains functionality to add data to the database.
    """
    
    
    import app.core.http_codes as codes
    
    from app.database.controller import utils
    
    from app.database.models import (
        Blacklist,
        City,
    
        Competition,
    
        Component,
        ComponentType,
    
        Media,
    
        MediaType,
        Question,
    
        QuestionAlternative,
        QuestionAnswer,
    
        QuestionType,
        Role,
        Slide,
        Team,
        User,
    
        ViewType,
    
    )
    from flask_restx import abort
    
    def db_add(item):
    
        """
        Internal function. Adds item to the database
        and handles comitting and refreshing.
        """
    
    
        db.session.add(item)
        db.session.commit()
        db.session.refresh(item)
    
        if not item:
            abort(codes.BAD_REQUEST, f"Object could not be created")
    
        return item
    
    def blacklist(jti):
    
        """ Adds a blacklist to the database. """
    
    
        return db_add(Blacklist(jti))
    
    def mediaType(name):
    
        """ Adds a media type to the database. """
    
    
        return db_add(MediaType(name))
    
    def questionType(name):
    
        """ Adds a question type to the database. """
    
    
        return db_add(QuestionType(name))
    
    
    def componentType(name):
    
        """ Adds a component type to the database. """
    
    
        return db_add(ComponentType(name))
    
    
    def viewType(name):
    
        """ Adds a view type to the database. """
    
    
        return db_add(ViewType(name))
    
    
    def role(name):
    
        """ Adds a role to the database. """
    
    
        return db_add(Role(name))
    
    
    def city(name):
    
        """ Adds a city to the database. """
    
    
        return db_add(City(name))
    
    
    def component(type_id, item_slide, data, x=0, y=0, w=0, h=0):
    
        """
        Adds a component to the slide at the specified coordinates with the
        provided size and data .
        """
    
    
        return db_add(Component(item_slide.id, type_id, data, x, y, w, h))
    
    
    def image(filename, user_id):
    
        """
        Adds an image to the database and keeps track of who called the function.
        """
    
    
        return db_add(Media(filename, 1, user_id))
    
    def user(email, password, role_id, city_id, name=None):
    
        """ Adds a user to the database using the provided arguments. """
    
    
        return db_add(User(email, password, role_id, city_id, name))
    
    def question(name, total_score, type_id, item_slide):
    
        """
        Adds a question to the specified slide using the provided arguments.
        """
    
    
        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 question_answer(data, score, question_id, team_id):
        return db_add(QuestionAnswer(data, score, question_id, team_id))
    
    
    
    def code(pointer, view_type_id):
    
        """ Adds a code to the database using the provided arguments. """
    
    
        code_string = utils.generate_unique_code()
        return db_add(Code(code_string, pointer, view_type_id))
    
    
    
    def team(name, item_competition):
    
        """ Adds a team with the specified name to the provided competition. """
    
    
        item = db_add(Team(name, item_competition.id))
    
        # Add code for the team
        code(item.id, 1)
    
        return item
    
    def slide(item_competition):
    
        """ Adds a slide to the provided competition. """
    
    
        order = Slide.query.filter(Slide.competition_id == item_competition.id).count()  # first element has index 0
        return db_add(Slide(order, item_competition.id))
    
    def competition(name, year, city_id):
    
        """
        Adds a competition to the database using the
        provided arguments. Also adds slide and codes.
        """
    
        item_competition = _competition(name, year, city_id)
    
        # Add one slide for the competition
        slide(item_competition)
    
        # TODO: Add two teams
    
        return item_competition
    
    
    def _competition(name, year, city_id, font=None):
        """
        Internal function. Adds a competition to the database
        using the provided arguments. Also adds codes.
        """
    
        item_competition = db_add(Competition(name, year, city_id))
        if font:
            item_competition.font = font
    
    
        # Add code for Judge view
        code(item_competition.id, 2)
    
        # Add code for Audience view
        code(item_competition.id, 3)
    
        utils.refresh(item_competition)
        return item_competition