builder added, removed old files

This commit is contained in:
Hadrian Burkhardt
2023-11-30 02:32:40 +01:00
committed by f4lco
parent f714fc4c79
commit 58a53e608f
10 changed files with 447 additions and 306 deletions
+316
View File
@@ -0,0 +1,316 @@
from xml.dom import minidom
from datetime import date
class Builder:
def __init__(self):
self._doc = minidom.Document()
self._om = self._doc.createElement("openmensa")
self._om.setAttribute("version", "2.1")
self._om.setAttribute("xmlns", "http://openmensa.org/open-mensa-v2")
self._om.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
self._om.setAttribute(
"xsi:schemaLocation",
"http://openmensa.org/open-mensa-v2 http://openmensa.org/open-mensa-v2.xsd",
)
self._version = None
self._name = None
self._address = None
self._city = None
self._phone = None
self._email = None
self._location = None
self._availability = None
self._times = None
self._feed = None
self._day = None
self._days: dict[date, dict[str, list]] = {}
@property
def version(self):
return self._version
@version.setter
def version(self, value: str):
self._version = value
@version.deleter
def version(self):
del self._version
@property
def name(self):
return self._name
@name.setter
def name(self, value: str):
self._name = value
@name.deleter
def name(self):
del self._name
@property
def address(self):
return self._address
@address.setter
def address(self, value: tuple[str, str, str]):
street_nr, zip, city = value
self._address = f"{street_nr}, {zip} {city}"
@address.deleter
def address(self):
del self._address
@property
def city(self):
return self._city
@city.setter
def city(self, value: str):
self._city = value
@city.deleter
def city(self):
del self._city
@property
def phone(self):
return self._phone
@phone.setter
def phone(self, value: str):
self._phone = value
@phone.deleter
def phone(self):
del self._phone
@property
def email(self):
return self._email
@email.setter
def email(self, value: str):
self._email = value
@email.deleter
def email(self):
del self._email
@property
def location(self):
return (self._longitude, self._latitude)
@location.setter
def location(self, value: tuple[float, float]):
self._longitude = value[0]
self._latitude = value[1]
@location.deleter
def location(self):
del self._longitude
del self._latitude
@property
def availability(self):
return self._availability
@availability.setter
def availability(self, value: str):
if value == "pulbic" or value == "restricted":
self._availability = value
else:
raise ValueError("only 'public' or 'restricted are allowed.")
@availability.deleter
def availability(self):
del self._availability
@property
def times(self):
return self._times
@times.setter
def times(self, value: dict[str, str]):
def attach_weekday(tag: str, value: str):
if value == "":
return
d = self._doc.createElement(tag)
if value == "geschlossen":
d.setAttribute("closed", "true")
else:
d.setAttribute("open", value)
self._times.appendChild(d)
weekdays = (
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday",
)
self._times = self._doc.createElement("times")
self._times.setAttribute("type", "opening")
for weekday in weekdays:
v = value.get(weekday)
if v:
attach_weekday(weekday, v)
@times.deleter
def times(self):
del self._times
@property
def feed(self):
return self._feed
@feed.setter
def feed(self, value: dict):
name: str = value.get("name")
priority: int = value.get("priority")
url: str = value.get("url")
source: str = value.get("source")
hour: int = value.get("hour")
dayOfMonth: int | str = value.get("dayOfMonth") if value.get("dayOfMonth") else "*"
dayOfWeek: int | str = value.get("dayOfWeek") if value.get("dayOfWeek") else "*"
month: int | str = value.get("month") if value.get("month") else "*"
minute: int = value.get("minute") if value.get("minute") else 0
retry: str = value.get("retry")
self._feed = self._doc.createElement("feed")
self._feed.setAttribute("name", name)
self._feed.setAttribute("priority", str(priority))
schedule = self._doc.createElement("schedule")
self._feed.appendChild(schedule)
schedule.setAttribute("dayOfMonth", str(dayOfMonth))
schedule.setAttribute("dayOfWeek", str(dayOfWeek))
schedule.setAttribute("month", str(month))
schedule.setAttribute("hour", str(hour))
schedule.setAttribute("minute", str(minute))
if retry:
schedule.setAttribute("retry", retry)
el = self._doc.createElement("url")
self._feed.appendChild(el)
node = self._doc.createTextNode(url)
el.appendChild(node)
el = self._doc.createElement("source")
self._feed.appendChild(el)
node = self._doc.createTextNode(source)
el.appendChild(node)
@feed.deleter
def feed(self):
del self._feed
@property
def day(self):
return self._day
@day.setter
def day(self, value):
self._day = value
@day.deleter
def day(self):
del self._day
def add_meal(
self,
date: date,
category: str,
name: str,
prices: dict[str, float],
note: str = None,
):
meal = self._doc.createElement("meal")
node = self._doc.createElement("name")
meal.appendChild(node)
data = self._doc.createTextNode(name)
node.appendChild(data)
if note:
node = self._doc.createElement("note")
meal.appendChild(node)
data = self._doc.createTextNode(note)
node.appendChild(data)
if prices["student"]:
node = self._doc.createElement("price")
meal.appendChild(node)
node.setAttribute("role", "student")
data = self._doc.createTextNode(f'{prices["student"]:.2f}')
node.appendChild(data)
if prices["employee"]:
node = self._doc.createElement("price")
meal.appendChild(node)
node.setAttribute("role", "employee")
data = self._doc.createTextNode(f'{prices["employee"]:.2f}')
node.appendChild(data)
if prices["other"]:
node = self._doc.createElement("price")
meal.appendChild(node)
node.setAttribute("role", "other")
data = self._doc.createTextNode(f'{prices["other"]:.2f}')
node.appendChild(data)
category_dict = self._days.get(date, dict())
if not category_dict:
self._days[date] = category_dict
meal_list = category_dict.get(category, list())
if not meal_list:
category_dict[category] = meal_list
meal_list.append(meal)
def __append_node(self, tag: str, value: str):
elem = self._doc.createElement(tag)
self._canteen.appendChild(elem)
node = self._doc.createTextNode(value)
elem.appendChild(node)
def toXML(self):
self._doc.appendChild(self._om)
if self.version:
self.__append_node("version", self.version)
self._canteen = self._doc.createElement("canteen")
self._om.appendChild(self._canteen)
if self.name:
self.__append_node("name", self.name)
if self.address:
self.__append_node("address", self.address)
if self.city:
self.__append_node("city", self.city)
if self.phone:
self.__append_node("phone", self.phone)
if self.email:
self.__append_node("email", self.email)
if self._longitude and self._latitude:
location = self._doc.createElement("location")
self._canteen.appendChild(location)
location.setAttribute("latitude", str(self._latitude))
location.setAttribute("longitude", str(self._longitude))
if self.availability:
self.__append_node("availability", self.availability)
if self.times:
self._canteen.appendChild(self.times)
if self.feed:
self._canteen.appendChild(self.feed)
for date, category_dict in sorted(self._days.items()):
day = self._doc.createElement("day")
self._canteen.appendChild(day)
day.setAttribute("date", str(date))
for category_name, meals in sorted(category_dict.items()):
category = self._doc.createElement("category")
day.appendChild(category)
category.setAttribute("name", category_name)
for meal in meals:
category.appendChild(meal)
return self._doc.toprettyxml(encoding="UTF-8")