Module edupage_api.lunches

Classes

class Lunches (edupage: EdupageModule)
Expand source code
class Lunches(Module):
    def parse_meal(self, meal_index: str, meal: dict, boarder_id: str, date: date) -> Optional[Meal]:
        if meal is None:
            return None
        
        if meal.get("isCooking") == False:
            return None

        ordered_meal = None
        meal_record = meal.get("evidencia")

        if meal_record is not None:
            ordered_meal = meal_record.get("stav")

            if ordered_meal == "V":
                ordered_meal = meal_record.get("obj")

        served_from_str = meal.get("vydaj_od")
        served_to_str = meal.get("vydaj_do")

        if served_from_str:
            served_from = datetime.strptime(served_from_str, "%H:%M")
        else:
            served_from = None

        if served_to_str:
            served_to = datetime.strptime(served_to_str, "%H:%M")
        else:
            served_to = None

        title = meal.get("nazov")

        amount_of_foods = meal.get("druhov_jedal")
        chooseable_menus = list(meal.get("choosableMenus").keys())

        can_be_changed_until = meal.get("zmen_do")

        menus = []

        for food in meal.get("rows"):
            if not food:
                continue

            name = food.get("nazov")
            allergens = food.get("alergenyStr")
            weight = food.get("hmotnostiStr")
            number = food.get("menusStr")
            rating = None

            if number is not None:
                number = number.replace(": ", "")
                rating = meal.get("hodnotenia")
                if rating is not None and rating:
                    rating = rating.get(number)

                    [quality, quantity] = rating

                    quality_average = quality.get("priemer")
                    quality_ratings = quality.get("pocet")

                    quantity_average = quantity.get("priemer")
                    quantity_ratings = quantity.get("pocet")

                    rating = Rating(
                        date.strftime("%Y-%m-%d"),
                        boarder_id,
                        quality_average,
                        quantity_average,
                        quality_ratings,
                        quantity_ratings,
                    )
                else:
                    rating = None
            menus.append(Menu(name, allergens, weight, number, rating))
        
        return Meal(
            served_from,
            served_to,
            amount_of_foods,
            chooseable_menus,
            can_be_changed_until,
            title,
            menus,
            date,
            ordered_meal,
            MealType(int(meal_index)),
            boarder_id,
            meal_index
        )

    @ModuleHelper.logged_in
    def get_meals(self, date: date) -> Optional[Meals]:
        date_strftime = date.strftime("%Y%m%d")
        request_url = f"https://{self.edupage.subdomain}.edupage.org/menu/?date={date_strftime}"
        response = self.edupage.session.get(request_url).content.decode()

        lunch_data = json.loads(
            response.split("edupageData: ")[1].split(",\r\n")[0]
        )
        lunches_data = lunch_data.get(self.edupage.subdomain)
        try:
            boarder_id = (
                lunches_data.get("novyListok").get("addInfo").get("stravnikid")
            )
        except AttributeError as e:
            raise InvalidMealsData(f"Missing boarder id: {e}")

        meals = lunches_data.get("novyListok").get(date.strftime("%Y-%m-%d"))
        if meals is None:
            return None
        
        snack = self.parse_meal("1", meals.get("1"), boarder_id, date)
        lunch = self.parse_meal("2", meals.get("2"), boarder_id, date)
        afternoon_snack = self.parse_meal("3", meals.get("3"), boarder_id, date)
        
        return Meals(snack, lunch, afternoon_snack)

Ancestors

Methods

def get_meals(self, date: datetime.date) ‑> Meals | None
Expand source code
@ModuleHelper.logged_in
def get_meals(self, date: date) -> Optional[Meals]:
    date_strftime = date.strftime("%Y%m%d")
    request_url = f"https://{self.edupage.subdomain}.edupage.org/menu/?date={date_strftime}"
    response = self.edupage.session.get(request_url).content.decode()

    lunch_data = json.loads(
        response.split("edupageData: ")[1].split(",\r\n")[0]
    )
    lunches_data = lunch_data.get(self.edupage.subdomain)
    try:
        boarder_id = (
            lunches_data.get("novyListok").get("addInfo").get("stravnikid")
        )
    except AttributeError as e:
        raise InvalidMealsData(f"Missing boarder id: {e}")

    meals = lunches_data.get("novyListok").get(date.strftime("%Y-%m-%d"))
    if meals is None:
        return None
    
    snack = self.parse_meal("1", meals.get("1"), boarder_id, date)
    lunch = self.parse_meal("2", meals.get("2"), boarder_id, date)
    afternoon_snack = self.parse_meal("3", meals.get("3"), boarder_id, date)
    
    return Meals(snack, lunch, afternoon_snack)
def parse_meal(self, meal_index: str, meal: dict, boarder_id: str, date: datetime.date) ‑> Meal | None
Expand source code
def parse_meal(self, meal_index: str, meal: dict, boarder_id: str, date: date) -> Optional[Meal]:
    if meal is None:
        return None
    
    if meal.get("isCooking") == False:
        return None

    ordered_meal = None
    meal_record = meal.get("evidencia")

    if meal_record is not None:
        ordered_meal = meal_record.get("stav")

        if ordered_meal == "V":
            ordered_meal = meal_record.get("obj")

    served_from_str = meal.get("vydaj_od")
    served_to_str = meal.get("vydaj_do")

    if served_from_str:
        served_from = datetime.strptime(served_from_str, "%H:%M")
    else:
        served_from = None

    if served_to_str:
        served_to = datetime.strptime(served_to_str, "%H:%M")
    else:
        served_to = None

    title = meal.get("nazov")

    amount_of_foods = meal.get("druhov_jedal")
    chooseable_menus = list(meal.get("choosableMenus").keys())

    can_be_changed_until = meal.get("zmen_do")

    menus = []

    for food in meal.get("rows"):
        if not food:
            continue

        name = food.get("nazov")
        allergens = food.get("alergenyStr")
        weight = food.get("hmotnostiStr")
        number = food.get("menusStr")
        rating = None

        if number is not None:
            number = number.replace(": ", "")
            rating = meal.get("hodnotenia")
            if rating is not None and rating:
                rating = rating.get(number)

                [quality, quantity] = rating

                quality_average = quality.get("priemer")
                quality_ratings = quality.get("pocet")

                quantity_average = quantity.get("priemer")
                quantity_ratings = quantity.get("pocet")

                rating = Rating(
                    date.strftime("%Y-%m-%d"),
                    boarder_id,
                    quality_average,
                    quantity_average,
                    quality_ratings,
                    quantity_ratings,
                )
            else:
                rating = None
        menus.append(Menu(name, allergens, weight, number, rating))
    
    return Meal(
        served_from,
        served_to,
        amount_of_foods,
        chooseable_menus,
        can_be_changed_until,
        title,
        menus,
        date,
        ordered_meal,
        MealType(int(meal_index)),
        boarder_id,
        meal_index
    )
class Meal (served_from: datetime.datetime | None,
served_to: datetime.datetime | None,
amount_of_foods: int,
chooseable_menus: list[str],
can_be_changed_until: datetime.datetime,
title: str,
menus: List[Menu],
date: datetime.datetime,
ordered_meal: str | None,
meal_type: MealType,
_Meal__boarder_id: str,
_Meal__meal_index: str)
Expand source code
@dataclass
class Meal:
    served_from: Optional[datetime]
    served_to: Optional[datetime]
    amount_of_foods: int
    chooseable_menus: list[str]
    can_be_changed_until: datetime
    title: str
    menus: List[Menu]
    date: datetime
    ordered_meal: Optional[str]
    meal_type: MealType
    __boarder_id: str
    __meal_index: str

    def __iter__(self):
        return iter(self.menus)

    def __make_choice(self, edupage: EdupageModule, choice_str: str):
        request_url = f"https://{edupage.subdomain}.edupage.org/menu/"

        boarder_menu = {
            "stravnikid": self.__boarder_id,
            "mysqlDate": self.date.strftime("%Y-%m-%d"),
            "jids": {self.__meal_index: choice_str},
            "view": "pc_listok",
            "pravo": "Student",
        }

        data = {
            "akcia": "ulozJedlaStravnika",
            "jedlaStravnika": json.dumps(boarder_menu),
        }

        response = edupage.session.post(
            request_url, data=data
        ).content.decode()

        if json.loads(response).get("error") != "":
            raise FailedToChangeMealError()

    def choose(self, edupage: EdupageModule, number: int):
        letters = "ABCDEFGH"
        letter = letters[number - 1]

        self.__make_choice(edupage, letter)
        self.ordered_meal = letter

    def sign_off(self, edupage: EdupageModule):
        self.__make_choice(edupage, "AX")
        self.ordered_meal = None

Meal(served_from: Optional[datetime.datetime], served_to: Optional[datetime.datetime], amount_of_foods: int, chooseable_menus: list[str], can_be_changed_until: datetime.datetime, title: str, menus: List[edupage_api.lunches.Menu], date: datetime.datetime, ordered_meal: Optional[str], meal_type: edupage_api.lunches.MealType, _Meal__boarder_id: str, _Meal__meal_index: str)

Class variables

var amount_of_foods : int
var can_be_changed_until : datetime.datetime
var chooseable_menus : list[str]
var date : datetime.datetime
var meal_typeMealType
var menus : List[Menu]
var ordered_meal : str | None
var served_from : datetime.datetime | None
var served_to : datetime.datetime | None
var title : str

Methods

def choose(self,
edupage: EdupageModule,
number: int)
Expand source code
def choose(self, edupage: EdupageModule, number: int):
    letters = "ABCDEFGH"
    letter = letters[number - 1]

    self.__make_choice(edupage, letter)
    self.ordered_meal = letter
def sign_off(self,
edupage: EdupageModule)
Expand source code
def sign_off(self, edupage: EdupageModule):
    self.__make_choice(edupage, "AX")
    self.ordered_meal = None
class MealType (value, names=None, *, module=None, qualname=None, type=None, start=1)
Expand source code
class MealType(Enum):
    SNACK = 1
    LUNCH = 2
    AFTERNOON_SNACK = 3

An enumeration.

Ancestors

  • enum.Enum

Class variables

var AFTERNOON_SNACK
var LUNCH
var SNACK
class Meals (snack: Meal | None,
lunch: Meal | None,
afternoon_snack: Meal | None)
Expand source code
@dataclass
class Meals:
    snack: Optional[Meal]
    lunch: Optional[Meal]
    afternoon_snack: Optional[Meal]

Meals(snack: Optional[edupage_api.lunches.Meal], lunch: Optional[edupage_api.lunches.Meal], afternoon_snack: Optional[edupage_api.lunches.Meal])

Class variables

var afternoon_snackMeal | None
var lunchMeal | None
var snackMeal | None
class Menu (name: str,
allergens: str,
weight: str,
number: str,
rating: Rating | None)
Expand source code
@dataclass
class Menu:
    name: str
    allergens: str
    weight: str
    number: str
    rating: Optional[Rating]

Menu(name: str, allergens: str, weight: str, number: str, rating: Optional[edupage_api.lunches.Rating])

Class variables

var allergens : str
var name : str
var number : str
var ratingRating | None
var weight : str
class Rating (_Rating__date: str,
_Rating__boarder_id: str,
quality_average: float,
quality_ratings: float,
quantity_average: float,
quantity_ratings: float)
Expand source code
@dataclass
class Rating:
    __date: str
    __boarder_id: str

    quality_average: float
    quality_ratings: float

    quantity_average: float
    quantity_ratings: float

    def rate(self, edupage: EdupageModule, quantity: int, quality: int):
        if not edupage.is_logged_in:
            raise NotLoggedInException()

        request_url = f"https://{edupage.subdomain}.edupage.org/menu/"

        data = {
            "akcia": "ulozHodnotenia",
            "stravnikid": self.__boarder_id,
            "mysqlDate": self.__date,
            "jedlo_dna": "2",
            "kvalita": str(quality),
            "mnozstvo": str(quantity),
        }

        response = edupage.session.post(request_url, data=data)
        parsed_response = json.loads(response.content.decode())

        error = parsed_response.get("error")
        if error is None or error != "":
            raise FailedToRateException()

Rating(_Rating__date: str, _Rating__boarder_id: str, quality_average: float, quality_ratings: float, quantity_average: float, quantity_ratings: float)

Class variables

var quality_average : float
var quality_ratings : float
var quantity_average : float
var quantity_ratings : float

Methods

def rate(self,
edupage: EdupageModule,
quantity: int,
quality: int)
Expand source code
def rate(self, edupage: EdupageModule, quantity: int, quality: int):
    if not edupage.is_logged_in:
        raise NotLoggedInException()

    request_url = f"https://{edupage.subdomain}.edupage.org/menu/"

    data = {
        "akcia": "ulozHodnotenia",
        "stravnikid": self.__boarder_id,
        "mysqlDate": self.__date,
        "jedlo_dna": "2",
        "kvalita": str(quality),
        "mnozstvo": str(quantity),
    }

    response = edupage.session.post(request_url, data=data)
    parsed_response = json.loads(response.content.decode())

    error = parsed_response.get("error")
    if error is None or error != "":
        raise FailedToRateException()