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

Fixed another bug with moving slides

parent dfe27307
No related branches found
No related tags found
1 merge request!132Resolve "Fix move slides on backend"
This commit is part of merge request !132. Comments created here will be created in the context of that merge request.
......@@ -14,8 +14,17 @@ def move_slides(item_competition, from_order, to_order):
Move slide from from_order to to_order in item_competition.
"""
# TODO: Please refactor this terrible piece of code
# This function is
num_slides = len(item_competition.slides)
assert 0 <= from_order < num_slides, "Invalid order to move from"
assert 0 <= to_order < num_slides, "Invalid order to move to"
# TODO: Please improve this terrible piece of code
# This function is sooo terrible, someone please tell me how to update
# multiple values in the database at the same time with unique constraints.
# If you update all the values at the same time none of them will collide
# but that database doesn't know that so you have to update them to some
# other value before and then change every value back to the correct one,
# so 2 commits.
slides = item_competition.slides
......@@ -23,35 +32,29 @@ def move_slides(item_competition, from_order, to_order):
start_order = min(from_order, to_order)
end_order = max(from_order, to_order)
for item_slide in slides:
item_slide.order += 100
# Move slides between from and to order either up or down, but minus in front
for item_slide in slides:
if start_order <= item_slide.order <= end_order:
if start_order <= item_slide.order - 100 <= end_order:
item_slide.order = -(item_slide.order + change)
# Find the slide that was to be moved and change it to correct order with minus in front
for item_slide in slides:
if -item_slide.order - change == from_order:
item_slide.order = -to_order
break
# -0 = 0 so have to do a special case for it
for item_slide in slides:
if item_slide.order == 0:
item_slide.order = -999
if item_slide.order == -(from_order + change + 100):
item_slide.order = -(to_order + 100)
break
db.session.commit()
# Negate all order so that they become correct and positive
for item_slide in slides:
if start_order <= -item_slide.order <= end_order:
if start_order <= -(item_slide.order + 100) <= end_order:
item_slide.order = -(item_slide.order)
# Change order back
for item_slide in slides:
if item_slide.order == -999:
item_slide.order = 0
break
item_slide.order -= 100
return commit_and_refresh(item_competition)
......
......@@ -3,10 +3,10 @@ This file tests the database controller functions.
"""
import app.database.controller as dbc
from app.database.models import City, Competition, Media, MediaType, Role, User, Code
from app.database.models import City, Code, Competition, Media, MediaType, Role, User
from tests import app, client, db
from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail, delete
from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail, assert_slide_order, delete
def test_user(client):
......@@ -151,6 +151,33 @@ def check_slides_copy(item_slide_original, item_slide_copy, num_slides, order):
assert item_slide_copy == item_slides[order]
def test_move_slides(client):
add_default_values()
item_comp = dbc.get.one(Competition, 1)
for _ in range(9):
dbc.add.slide(item_comp.id)
# Move from beginning to end
item_comp = dbc.utils.move_slides(item_comp, 0, 9)
assert_slide_order(item_comp, [9, 0, 1, 2, 3, 4, 5, 6, 7, 8])
# Move from end to beginning
item_comp = dbc.utils.move_slides(item_comp, 9, 0)
assert_slide_order(item_comp, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# Move some things in the middle
item_comp = dbc.utils.move_slides(item_comp, 3, 7)
assert_slide_order(item_comp, [0, 1, 2, 7, 3, 4, 5, 6, 8, 9])
item_comp = dbc.utils.move_slides(item_comp, 1, 5)
assert_slide_order(item_comp, [0, 5, 1, 7, 2, 3, 4, 6, 8, 9])
item_comp = dbc.utils.move_slides(item_comp, 8, 2)
assert_slide_order(item_comp, [0, 6, 1, 8, 3, 4, 5, 7, 2, 9])
"""
def test_question(client):
add_default_values()
......
......@@ -153,3 +153,11 @@ def change_order_test(client, cid, slide_id, new_slide_id, h):
# Changes order
response, _ = put(client, f"/api/competitions/{cid}/slides/{slide_id}/order", {"order": new_order}, headers=h)
assert response.status_code == codes.OK
def assert_slide_order(item_comp, correct_order):
"""
Assert that the slides in the given competition are in the correct order
"""
for slide, order in zip(item_comp.slides, correct_order):
assert slide.order == order
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment