""" This file contains functionality to copy and duplicate data to the database. """ from app.database.controller import add, get, search, utils from app.database.models import Question def _alternative(item_old, question_id): """Internal function. Makes a copy of the provided question alternative""" return add.question_alternative(item_old.text, item_old.value, question_id) def _question(item_question_old, slide_id): """ Internal function. Makes a copy of the provided question item to the specified slide. Does not copy team, question answers. """ item_question_new = add.db_add( Question( item_question_old.name, item_question_old.total_score, item_question_old.type_id, slide_id, ) ) for item_alternative in item_question_old.alternatives: _alternative(item_alternative, item_question_new.id) return item_question_new def _component(item_component, item_slide_new): """ Internal function. Makes a copy of the provided component item to the specified slide. """ add.component( item_component.type_id, item_slide_new, item_component.data, item_component.x, item_component.y, item_component.w, item_component.h, ) def slide(item_slide_old): """ Deep copies a slide to the same competition. Does not copy team, question answers. """ item_competition = get.competition(item_slide_old.competition_id) return slide_to_competition(item_slide_old, item_competition) def slide_to_competition(item_slide_old, item_competition): """ Deep copies a slide to the provided competition. Does not copy team, question answers. """ item_slide_new = add.slide(item_competition) # Copy all fields item_slide_new.title = item_slide_old.title item_slide_new.body = item_slide_old.body item_slide_new.timer = item_slide_old.timer item_slide_new.settings = item_slide_old.settings # TODO: Add background image for item_component in item_slide_old.components: _component(item_component, item_slide_new) for item_question in item_slide_old.questions: _question(item_question, item_slide_new.id) utils.commit_and_refresh(item_slide_new) return item_slide_new def competition(item_competition_old): """ Adds a deep-copy of the provided competition. Will not copy teams, question answers. """ 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( name, item_competition_old.year, item_competition_old.city_id, item_competition_old.font, ) # TODO: Add background image for item_slide in item_competition_old.slides: slide_to_competition(item_slide, item_competition_new) return item_competition_new