Skip to content
Snippets Groups Projects

Resolve "Fix move slides on backend"

Merged Victor Löfgren requested to merge 161-fix-move-slides-on-backend into dev
3 files
+ 56
18
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -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)
Loading