remove xml/svg based seating
This commit is contained in:
@@ -71,13 +71,8 @@ class ConfigurationService:
|
||||
|
||||
def get_seating_configuration(self) -> SeatingConfiguration:
|
||||
try:
|
||||
seating_config = self._config["seating"]
|
||||
base_svg_file_path = from_root(seating_config["base_svg_path"])
|
||||
if not base_svg_file_path.exists():
|
||||
logger.fatal(f"Specified seating plan SVG file was not found at {base_svg_file_path}! Exiting...")
|
||||
sys.exit(1)
|
||||
return SeatingConfiguration(
|
||||
base_svg_path=base_svg_file_path
|
||||
seats=self._config["seating"]
|
||||
)
|
||||
except KeyError:
|
||||
logger.fatal("Error loading seating configuration, exiting...")
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
import logging
|
||||
import re
|
||||
from io import StringIO
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
from xml.etree import ElementTree
|
||||
|
||||
from from_root import from_root
|
||||
|
||||
from src.ez_lan_manager.services.DatabaseService import DatabaseService
|
||||
from src.ez_lan_manager.services.TicketingService import TicketingService
|
||||
@@ -32,9 +27,6 @@ class SeatingService:
|
||||
self._lan_info = lan_info
|
||||
self._db_service = db_service
|
||||
self._ticketing_service = ticketing_service
|
||||
self._seating_plan = StringIO()
|
||||
ElementTree.parse(self._seating_configuration.base_svg_path).write(self._seating_plan, encoding="unicode")
|
||||
|
||||
|
||||
async def get_seating(self) -> list[Seat]:
|
||||
return await self._db_service.get_seating_info()
|
||||
@@ -67,92 +59,5 @@ class SeatingService:
|
||||
raise SeatAlreadyTakenError
|
||||
|
||||
await self._db_service.seat_user(seat_id, user_id)
|
||||
await self.update_svg_with_seating_status()
|
||||
|
||||
async def generate_new_seating_table(self, seating_plan_fp: Path, no_confirm: bool = False) -> None:
|
||||
if not no_confirm:
|
||||
confirm = input("WARNING: THIS ACTION WILL DELETE ALL SEATING DATA! TYPE 'AGREE' TO CONTINUE: ")
|
||||
if confirm != "AGREE":
|
||||
logging.info("Seating table generation aborted...")
|
||||
return
|
||||
|
||||
et = ElementTree.parse(seating_plan_fp)
|
||||
seat_ids = []
|
||||
for child in et.getroot().findall(".//mxCell"):
|
||||
possible_seat_identifier = child.get("value")
|
||||
try:
|
||||
if re.match(r"^\w\d{1,3}$", possible_seat_identifier):
|
||||
seat_ids.append((possible_seat_identifier, self._lan_info.ticket_info.default_category))
|
||||
except TypeError:
|
||||
continue
|
||||
|
||||
for child in et.getroot().findall(".//object"):
|
||||
possible_seat_identifier = child.get("label")
|
||||
try:
|
||||
if re.match(r"^\w\d{1,3}$", possible_seat_identifier):
|
||||
category = child.get("category")
|
||||
seat_ids.append((possible_seat_identifier, category))
|
||||
except TypeError:
|
||||
continue
|
||||
|
||||
await self._db_service.generate_fresh_seats_table(sorted(seat_ids, key=lambda sd: sd[0]))
|
||||
await self.update_svg_with_seating_status()
|
||||
|
||||
async def update_svg_with_seating_status(self) -> None:
|
||||
et = ElementTree.parse(self._seating_configuration.base_svg_path)
|
||||
root = et.getroot()
|
||||
namespace = {'svg': root.tag.split('}')[0].strip('{')} if '}' in root.tag else {}
|
||||
rect_g_pairs = []
|
||||
last_rect = None
|
||||
|
||||
for elem in root.iter():
|
||||
if elem.tag == f"{{{namespace.get('svg')}}}rect":
|
||||
last_rect = elem
|
||||
elif elem.tag == f"{{{namespace.get('svg')}}}g":
|
||||
if last_rect is not None:
|
||||
rect_g_pairs.append((last_rect, elem))
|
||||
last_rect = None
|
||||
|
||||
all_seats = await self.get_seating()
|
||||
|
||||
for rect, g in rect_g_pairs:
|
||||
seat_id = self.get_seat_id_from_element(g, namespace)
|
||||
if not seat_id:
|
||||
continue
|
||||
seat = await self.get_seat(seat_id, cached_data=all_seats)
|
||||
if not seat.is_blocked and seat.user is None:
|
||||
rect.set("fill", "rgb(102, 255, 51)")
|
||||
elif not seat.is_blocked and seat.user is not None:
|
||||
rect.set("fill", "rgb(204, 0, 0)")
|
||||
else:
|
||||
rect.set("fill", "rgb(190,190,190)")
|
||||
# @ToDo: Set URL's properly
|
||||
rect.set('onclick', f"window.open('https://httpbin.org/get?seat_id={seat_id}', '_blank')")
|
||||
g.set('onclick', f"window.open('https://httpbin.org/get?seat_id={seat_id}', '_blank')")
|
||||
|
||||
# Debug output
|
||||
et.write(from_root("debug_seating_plan.svg"))
|
||||
|
||||
self._seating_plan = StringIO()
|
||||
et.write(self._seating_plan, encoding='unicode')
|
||||
|
||||
|
||||
@staticmethod
|
||||
def get_seat_id_from_element(element: ElementTree.Element, namespace: dict) -> Optional[str]:
|
||||
seat_id = None
|
||||
for child in element.iter():
|
||||
if child.tag == f"{{{namespace.get('svg')}}}text":
|
||||
# Extract identifier from <text> element
|
||||
seat_id = child.text.strip() if child.text else None
|
||||
elif child.tag.endswith('div') and child.text:
|
||||
# Extract identifier from <foreignObject>/<div>
|
||||
seat_id = child.text.strip()
|
||||
|
||||
if seat_id: # Break if we've already found the identifier
|
||||
break
|
||||
try:
|
||||
if re.match(r"^\w\d{1,3}$", seat_id):
|
||||
return seat_id
|
||||
except TypeError:
|
||||
pass
|
||||
return
|
||||
# ToDo: Make function that creates database table `seats` from config
|
||||
|
||||
@@ -41,4 +41,4 @@ class LanInfo:
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SeatingConfiguration:
|
||||
base_svg_path: Path
|
||||
seats: dict[str, str]
|
||||
|
||||
Reference in New Issue
Block a user