53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
|
|
from sqlalchemy.orm import Session
|
|
from database.models import OfficeSpot
|
|
from utils.helpers import generate_uuid
|
|
|
|
def sync_office_spots(office_id: str, quota: int, prefix: str, db: Session):
|
|
"""
|
|
Synchronize OfficeSpot records with the office quota.
|
|
- If active spots < quota: Create new spots
|
|
- If active spots > quota: Remove highest numbered spots (Cascade handles assignments)
|
|
- If prefix changes: Rename all spots
|
|
"""
|
|
# Get all current spots sorted by number
|
|
current_spots = db.query(OfficeSpot).filter(
|
|
OfficeSpot.office_id == office_id
|
|
).order_by(OfficeSpot.spot_number).all()
|
|
|
|
# 1. Handle Prefix Change
|
|
# If prefix changed, we need to update names of ALL existing spots
|
|
# We do this first to ensure names are correct even if we don't add/remove
|
|
if current_spots:
|
|
first_spot = current_spots[0]
|
|
# Check simple heuristic: does name start with prefix?
|
|
# Better: we can't easily know old prefix from here without querying Office,
|
|
# but we can just re-generate names for all valid spots.
|
|
for spot in current_spots:
|
|
expected_name = f"{prefix}{spot.spot_number}"
|
|
if spot.name != expected_name:
|
|
spot.name = expected_name
|
|
|
|
current_count = len(current_spots)
|
|
|
|
# 2. Add Spots
|
|
if current_count < quota:
|
|
for i in range(current_count + 1, quota + 1):
|
|
new_spot = OfficeSpot(
|
|
id=generate_uuid(),
|
|
office_id=office_id,
|
|
spot_number=i,
|
|
name=f"{prefix}{i}",
|
|
is_unavailable=False
|
|
)
|
|
db.add(new_spot)
|
|
|
|
# 3. Remove Spots
|
|
elif current_count > quota:
|
|
# Identify spots to remove (highest numbers)
|
|
spots_to_remove = current_spots[quota:]
|
|
for spot in spots_to_remove:
|
|
db.delete(spot)
|
|
|
|
db.commit()
|