@@ -20,6 +20,16 @@ def _get_connection(self):
2020 conn .execute ("PRAGMA foreign_keys = ON" )
2121 conn .execute ("PRAGMA busy_timeout = 5000;" )
2222 return conn
23+
24+ def get_rotation_item_byid (self , item_id ):
25+ conn = self ._get_connection ()
26+ cursor = conn .cursor ()
27+
28+ query = "select * from rotation_queue where item_id = ?;"
29+ cursor .execute (query , (item_id ,))
30+ result = cursor .fetchone ()
31+ cursor .close ()
32+ return result
2333
2434 def get_active_image (self ) -> Optional [Dict ]:
2535 """
@@ -420,90 +430,31 @@ def _get_image_info_by_id(self, item_id: int) -> Optional[Dict]:
420430 if 'conn' in locals () and conn :
421431 conn .close ()
422432
423- def reorder_images (self , ordered_design_ids : List [int ]) -> bool :
424- """
425- Set a custom display order for images in the rotation.
426-
427- Args:
428- ordered_design_ids: List of design IDs in the desired order
429-
430- Returns:
431- Success status
432- """
433- if not ordered_design_ids :
434- print ("Cannot reorder: empty list provided" )
435- return False
436-
437- # Ensure no duplicate IDs in the input list
438- if len (ordered_design_ids ) != len (set (ordered_design_ids )):
439- print ("Cannot reorder: duplicate design IDs in the list" )
440- return False
441-
442- conn = None
443- cur = None
444-
433+ def reorder_images (self , item_id : int , new_order : int ):
434+
435+ status = 1
436+ query = None
437+ conn = self ._get_connection ()
438+ cursor = conn .cursor ()
439+ old_order = self .get_rotation_item_byid (item_id )[3 ]
440+ now = datetime .now ()
441+ if new_order < old_order :
442+ query = "UPDATE rotation_queue SET display_order = display_order + 1, updated_at = ? WHERE display_order >= ? AND display_order < ?"
443+ elif new_order > old_order :
444+ query = "UPDATE rotation_queue SET display_order = display_order - 1, updated_at = ? WHERE display_order <= ? AND display_order > ?"
445445 try :
446- conn = self ._get_connection ()
447- cur = conn .cursor ()
448-
449- # Start a transaction
450- cur .execute ("BEGIN TRANSACTION" )
451-
452- # First, get all items
453- cur .execute ("SELECT item_id, design_id FROM rotation_queue" )
454- all_items = cur .fetchall ()
455-
456- if not all_items :
457- print ("No items found in rotation queue" )
458- return False
459-
460- items = {row ['design_id' ]: row ['item_id' ] for row in all_items }
461-
462- # Validate that all design IDs in the ordered list exist in the database
463- missing_designs = [design_id for design_id in ordered_design_ids if design_id not in items ]
464- if missing_designs :
465- print (f"Some design IDs not found in database: { missing_designs } " )
466- return False
467-
468- # Create a timestamp once for all updates
469- now = datetime .now ()
470-
471- # Now update display_order for each item in the ordered list
472- for i , design_id in enumerate (ordered_design_ids ):
473- cur .execute ("""
474- UPDATE rotation_queue
475- SET display_order = ?, updated_at = ?
476- WHERE item_id = ?
477- """ , (i + 1 , now , items [design_id ]))
478-
479- # Update any remaining items with higher order values
480- remaining_designs = set (items .keys ()) - set (ordered_design_ids )
481- next_order = len (ordered_design_ids ) + 1
482-
483- for design_id in remaining_designs :
484- cur .execute ("""
485- UPDATE rotation_queue
486- SET display_order = ?, updated_at = ?
487- WHERE item_id = ?
488- """ , (next_order , now , items [design_id ]))
489- next_order += 1
490-
446+ if query :
447+ cursor .execute (query , (now , new_order , old_order ))
448+ shift = "UPDATE rotation_queue SET display_order = ?, updated_at = ? WHERE item_id = ?"
449+ cursor .execute (shift ,(new_order , now , item_id ))
491450 conn .commit ()
492- print (f"Successfully reordered { len (ordered_design_ids )} images" )
493- return True
494-
495- except Exception as e :
496- if conn :
497- conn .rollback ()
498- print (f"Error reordering images: { e } " )
499- return False
500-
451+ status = 0
452+ except sqlite3 .Error :
453+ status = 1
501454 finally :
502- if cur :
503- cur .close ()
504- if conn :
505- conn .close ()
506-
455+ cursor .close ()
456+ return status
457+
507458 def get_time_left_for_current (self ) -> Optional [float ]:
508459 """
509460 Get the number of seconds left for the current active image.
@@ -633,8 +584,15 @@ def remove_item_from_rotation(self, item_id: int) -> bool:
633584 # If we deleted the active item, select a new one
634585 if success and item_id == active_item_id :
635586 self ._select_new_active_item (conn )
636-
637- # TODO: update order numbering
587+
588+
589+ cur .execute ("SELECT item_id FROM rotation_queue ORDER BY display_order ASC" )
590+ items = cur .fetchall ()
591+ for index , item in enumerate (items ):
592+ cur .execute (
593+ "UPDATE rotation_queue SET display_order = ? WHERE item_id = ?" ,
594+ (index + 1 , item [0 ])
595+ )
638596
639597 conn .commit ()
640598 return success
0 commit comments