Ejemplo n.º 1
0
    def list_added_ingredients(self, username, expire=False):
        """List user's ingredients found in the database.
        Iterate through and add all the ingredients or
        the ones that are close to expiring.

        Args:
            username:
                The user's username.
            expire:
                Optional;
                List ingredients close to expiring (True) or
                all the ingredients (False).
                All ingredients returned if argument not given.

        Returns:
            A list of the ingredients according to given conditions."""
        data = self.database.get_all_ingredients_by_a_user(username)

        ingredients = []
        for row in data:
            ingr_id, date_added, ingr, date_expires, used = row[0], row[
                1], row[2], row[3], row[4]
            ingredient = Ingredient(ingr_id, ingr, date_added, date_expires,
                                    used)
            if expire:
                if ingredient.is_close_to_perishing(
                ) and not ingredient.is_used():
                    ingredients.append(ingredient)
            else:
                ingredients.append(ingredient)

        return ingredients
Ejemplo n.º 2
0
    def find_all_ingredients(self, user):
        """Etsii kaikki käyttäjän raaka-aineet tietokannasta.

        Pyytää I/O:ta lukemaan tietokannasta kaikki käyttäjään liitetyt raaka-aineet, jotka
        palautetaan listallisena raaka-aineen ilmentymiä. Jos hakutuloksia ei löydy, välitetään
        vain I/O:lta saatu tyhjä lista suoraan eteenpäin. Muutoin luodaan hakutuloksista ensin
        asianmukaiset ilmentymät ja laitetaan ne listana eteenpäin.

        Args:
            user: käyttäjä, johon raaka-aineet on liitetty.

        Returns:
            Palauttaa joko tyhjän listan, tai listallisen raaka-aineiden ilmentymiä.
        """

        ingredients = self.i_o.read(
            """SELECT DISTINCT I.name, I.id FROM meal_relations R LEFT JOIN
            ingredients I ON R.ingredientID = I.id WHERE R.userID = ?""",
            [user.id])

        if len(ingredients) == 0:
            return ingredients

        ingredients = [
            Ingredient(
                ingredient['name'],
                ingredient['id'],
            ) for ingredient in ingredients
        ]

        return ingredients
Ejemplo n.º 3
0
    def find_single_ingredient(self, criterion, user):
        """Etsii yksittäisen raaka-aineen tietokannasta.

        Saadessaan str-muotoisen hakuparametrin, pyytää I/O-luokkaa lukemaan tietokannasta
        parametrina annettuun käyttäjään liitetyn yksittäisen raaka-aineen. Mikäli hakuparametri
        on jokin muu ilmentymä, palautetaan None. Mikäli hakutulos löytyy, palautetaan niistä
        ensimmäinen raaka-aineen ilmentymänä tai jos tuloksia ei löydy, palautetaan pelkkä I/O:lta
        saatu tyhjä lista.

        Args:
            criterion: str-muotoinen hakuparametri. Merkkijonolla etsitään raaka-ainetta
            tietokannasta sen nimen perusteella.

            user: käyttäjän ilmentymä, johon raaka-aineet on liitetty.

        Returns:
            Palauttaa vääräntyyppisen hakuparametrin tapauksessa suoraan Nonen, tai tuloksia
            löytyessä ruokalajin ilmentymän. Jos hakutuloksia ei löydy, välitetään vain I/O:lta
            saatu tyhjä lista eteenpäin.
        """

        if isinstance(criterion, str):
            query = """SELECT * FROM ingredients I LEFT JOIN meal_relations R ON
                I.id = R.ingredientID WHERE I.name = ? AND R.userID = ?"""
        else:
            return None

        result = self.i_o.read(query, [criterion, user.id])

        if len(result) > 0:
            ingredient = result[0]

            return Ingredient(ingredient['name'], ingredient['id'])

        return result
Ejemplo n.º 4
0
    def _find_meal_ingredients(self, meal_id, user):
        query = """SELECT I.id, I.name FROM ingredients I
            LEFT JOIN meal_relations R ON I.id = R.ingredientID
            LEFT JOIN meals M ON R.mealID = M.id
            WHERE M.id = ? AND R.userID = ?"""

        results = self.i_o.read(query, [meal_id, user.id])
        items = [Ingredient(item['name'], item['id']) for item in results]

        return items
Ejemplo n.º 5
0
    def create_ingredients(self):
        """Luo attribuutin listasta listallisen raaka-aineiden ilmentymiä.

        Returns:
            Palauttaa listallisen Ingredient-objekteja.
        """

        ingredients = []

        for ingredient in self.ingredients:
            ingredients.append(Ingredient(ingredient))

        return ingredients
Ejemplo n.º 6
0
    def create_meals(self, user):
        """Luo attribuutin ruokalajilistasta listallisen ruokalajien ilmentymiä.

        Ruokalajit lisätään samalla myös tietokantaan ja liitetään parametrina
        annettuun käyttäjään.

        Args:
            user: käyttäjä, johon ruokalajit liitetään.

        Returns:
            Palauttaa listan ruokalajien ilmentymiä, eli Meal-objekteja.
        """

        meals = []

        for i in range(len(self.meals)):
            ingredients = []

            for relation in self.relations:
                (meal_id, ingredient_id) = relation

                if meal_id == i:
                    check = self.repository.fetch_item_id(self.ingredients[ingredient_id], False)

                    if check:
                        db_ingredient = Ingredient(self.ingredients[ingredient_id], check)
                    else:
                        db_ingredient = self.repository.insert_ingredient(
                            Ingredient(self.ingredients[ingredient_id]))

                    ingredients.append(db_ingredient)

            meal = Meal(self.meals[i], ingredients)
            meal.db_id = self.repository.insert_meal(meal, user)

            meals.append(meal)

        return meals
Ejemplo n.º 7
0
    def add_ingredients(self, ingredients):
        """Lisää tietokantaan yhden ruokalajin raaka-aineet.

        Saa argumenttina listallisen raaka-aineita str-muodossa, jotka iteroidaan läpi ja lisätään
        yksitellen tietokantaan. Jokaisen kohdalla tarkistetaan, onko merkkijono tyhjä sekä
        löytyykö ingredients-taulusta jo samanniminen raaka-aine ja matchin sattuessa luodaan
        Ingredient-objekti, jolle annetaan saatu tietokannan id. Muutoin tallennetaan uusi
        raaka-aine tietokantaan, jonka jälkeen luodaan Ingredient-objekti, jolle annetaan saatu
        tietokanta-id mukaan. Lopuksi tallennetaan kummassa tahansa tapauksessa luotu
        objekti palautettavaan listaan.

        Args:
            ingredients: lista yhden ruokalajin raaka-aineita str-muodossa.

        Returns:
            Palauttaa listan, joka sisältää ruokalajin raaka-aineiden ilmentymiä. Tai Nonen,
            mikäli lista on tyhjä.
        """

        inserted_ingredients = []

        for ingredient in ingredients:
            if len(ingredient.strip()) == 0:
                continue

            ingredient = ingredient.capitalize()
            check = self.meal_repository.fetch_item_id(ingredient, False)

            if check:
                db_ingredient = Ingredient(ingredient, check)
            else:
                db_ingredient = self.meal_repository.insert_ingredient(
                    Ingredient(ingredient))

            inserted_ingredients.append(db_ingredient)

        return None if len(inserted_ingredients) == 0 else inserted_ingredients
Ejemplo n.º 8
0
    def test_string(self):
        ingredient = Ingredient(1, 'omena', 1618207606, 1618207606)
        self.assertEqual(
            ingredient.__str__(),
            'omena: added 2021-04-12, expires 2021-04-12, not eaten yet')

        ingredient = Ingredient(1, 'omena', 1618207606, 1618207606, 1)
        self.assertEqual(
            ingredient.__str__(),
            'omena: added 2021-04-12, expires 2021-04-12, already eaten')
Ejemplo n.º 9
0
    def test_g_insert_meal(self):
        self.repository.empty_tables()

        meal = self.meals[0]
        ingredients = [
            self.repository.insert_ingredient(Ingredient(ingredient.name))
            for ingredient in meal.ingredients
        ]

        db_id = self.repository.insert_meal(Meal(meal.name, ingredients),
                                            self.test_user)

        meals = self.repository.find_all_meals(self.test_user)

        self.assertEqual(len(meals), 1)
        self.assertEqual(meals[0].db_id, db_id)
        self.assertIsInstance(meals[0], Meal)
        self.assertEqual(meals[0].name, meal.name)
        self.assertIsInstance(meals[0].ingredients[0], Ingredient)
Ejemplo n.º 10
0
    def insert_ingredient(self, ingredient):
        """Lisää raaka-aineen tietokantaan.

        Tällä metodilla lisätään parametrina annettu raaka-aine tietokantaan. Metodi ei tarkista
        duplikaatteja, vaan tarkistus on tehtävä ennen metodin kutsumista. Taulussa on käytössä
        UNIQUE-constraint. Parametrina annetaan raaka-aineen ilmentymä, josta puretaan nimi
        mukaan parametriksi tietokantakomennolle. Metodi ei tarvitse tietoa käyttäjästä,
        sillä raaka-aineet liitetään käyttäjään ainoastaan niiden id-numeron perusteella.

        Args:
            ingredient: kantaan lisättävän raaka-aineen ilmentymä.

        Returns:
            Palauttaa raaka-aineen ilmentymän, jolla on mukanaan myös tietokannan id-numero.
        """

        query = "INSERT INTO ingredients (name) VALUES (?)"

        db_id = self.i_o.write(query, [ingredient.name])

        return Ingredient(ingredient.name, db_id)
Ejemplo n.º 11
0
 def test_convert_date(self):
     ingredient = Ingredient(1, 'omena', 1618207606, 1619097453)
     self.assertEqual(ingredient.convert_date(1618207606),
                      date(2021, 4, 12))
Ejemplo n.º 12
0
 def test_get_id(self):
     ingredient = Ingredient(1, 'omena', 1618207606, 1619097453)
     self.assertEqual(ingredient.get_id(), 1)
Ejemplo n.º 13
0
 def test_is_close_to_perishing_true(self):
     ingredient = Ingredient(1, 'omena', 1618207606, int(time.time()))
     self.assertTrue(ingredient.is_close_to_perishing())
Ejemplo n.º 14
0
 def test_is_close_to_perishing_not_true(self):
     days_10_from_today = int(time.time()) + 60 * 60 * 24 * 10
     ingredient = Ingredient(1, 'omena', 1618207606, days_10_from_today)
     self.assertFalse(ingredient.is_close_to_perishing())