Beispiel #1
0
class Recipe():
    '''
    Luokka reseptejä varten. Tämä luokka pitää sisällään kaikki reseptille ominaiset attribuutit sekä tarvittavat metodit niiden arvojen muuttamiseksi.
    
    Attributes:
        :self.date: Luontipäivä
        :self.name: Reseptin nimi
        :self.time: Reseptin tekemiseen menevä aika minuuttina (int)
        :self.instructions: Ohjeet (str[])
        :self.outcomeSize: Reseptin lopputuloksen koko, esim. 4 (kg)
        :self.outcomeUnit: Reseptin lopputuloksen yksikkö, esim (4) kg
        :self.ingredients: Raaka-aineet (object[])
        
    Returns:
        Attribuuttien muuttamiseen käytettävät metodit (set* & add* & delete/remove*) palauttavat True, jos muutos onnistuu
    
    Raises:
        Kaikki attribuuttien asettamiseen käytettävät metodit (set* & add*) heittävät SetAttributeErrorin, jos attribuutin arvon asetus epäonnistuu.
    '''
    
    def __init__(self):
        self.date = None
        self.name = None
        self.instructions = []
        self.time = None
        self.outcomeSize = None
        self.outcomeUnit = None
        self.ingredients = []
        
        self.conversion = Conversion()
                
    def setName(self,name):
        ''' Validoi, että nimi on yli 2 merkkiä pitkä ja asettaa sen: self.name'''
        if len(name) > 2:
            self.name = name
            return True
        else:
            raise SetAttributeError("Nimen tulee olla yli 2 merkkiä pitkä")
        
    def setOutcomeSize(self, outcomeSize):
        ''' Muuttaa desimaalipilkun pisteeksi ja settaa määrän floattina: self.outcomeSize'''
        try:
            self.outcomeSize = float(str(outcomeSize).replace(",", "."))
            return True
        except ValueError:
            raise SetAttributeError("Lopputuloksen tulee olla desimaaliluku")
        
    def setOutcomeUnit(self, outcomeUnit):
        ''' Validoi, että yksikkö on ohjelman tuntema ja asettaa sen: self.outcomeUnit'''
        outcomeUnit = outcomeUnit.lower()
        if self.conversion.isValidUnit(outcomeUnit):
            self.outcomeUnit = outcomeUnit
            return True
        else:
            raise SetAttributeError("Yksikkö ei ole ohjelman tuntema")
    
    def setDate(self,date):
        ''' Validoi päivämäärän ja asettaa sen stringinä: self.date'''
        try:
            datetime.datetime.strptime(date,'%d.%m.%Y')
            self.date = date
            return True
        except ValueError:
            raise SetAttributeError("Päivämäärää ei voitu tallentaa")
        
    def setTime(self,time):
        ''' Asettaa reseptin tekemiseen menevän ajan (min) inttinä: self.time'''
        try:
            self.time = int(time)
            return True
        except ValueError:
            raise SetAttributeError("Ajan täytyy olla kokonaisluku (min)")
        
    def addInstruction(self,instruction):
        ''' Validoi, että ohje on yli 2 merkkiä pitkä ja lisää sen self.instruction[] listaan'''
        if len(instruction) > 2:
            self.instructions.append(instruction) 
            return True
        else:
            raise SetAttributeError("Ohjeen tulisi olla yli 2 merkkiä pitkä")
        
    def deleteInstruction(self,index):
        ''' Poistaa reseptiltä ohjeen. Argumenttina annetaan ohjeen sijainti listassa (index)'''
        try:
            del self.instructions[index]
            return True
        except LookupError as e:
            raise SetAttributeError("Ohjetta ei voitu poistaa")
        
    def addIngredientContainer(self, ingredientContainer):
        ''' Validoi, että lisättävä raaka-aine on IngredientContainer-olio sekä lisää raaka-aineen(Container) self.ingredients[] listaan'''
        if isinstance(ingredientContainer,IngredientContainer):
            self.ingredients.append(ingredientContainer)
            return True
        else:
            raise SetAttributeError("Raaka-aine ei ollut IngredientContainer-olio")
    def deleteIngredient(self, index):
        ''' Poistaa reseptiltä raaka-aineen. Argumenttina annetaan ohjeen sijainti listassa (index)'''
        try:
            del self.ingredients[index]
            return True
        except LookupError as e:
            raise SetAttributeError("Raaka-ainetta ei voitu poistaa")
    
    def getName(self):
        ''' Palauttaa reseptin nimen'''
        return self.name
    
    def getDate(self):
        ''' Palauttaa reseptin luontipäivän'''
        return self.date
    
    def getTime(self):
        ''' Palauttaa reseptin tekemiseen menevän ajan inttinä'''
        return self.time
    
    def getTimeGUI(self):
        ''' Palauttaa reseptin tekemiseen menevän ajan stringinä'''
        return str(self.time)
    
    def getTimeStr(self):
        ''' Palauttaa reseptin tekemiseen menevän ajan stringinä, jonka lopussa on " Min"'''
        return '' + str(self.time) + " Min"
    
    def getInstructions(self):
        ''' Palauttaa ohjeet listana'''
        return self.instructions
    
    def getInstructionsStr(self):
        ''' Palauttaa ohjeet stringinä, jokainen ohje omalla rivillä ja edessä ohjeen järjestysnumero eli järjestys listassa'''
        instructions = ''
        a = 1
        for i in self.instructions:
            instructions += str(a) +". " + i + "\n"
            a += 1
        return instructions
    

    def getIngredients(self):
        ''' Palauttaa reseptin raaka-aine oliot listana'''
        return self.ingredients
    
    def getIngredientsStr(self):
        ''' Palauttaa reseptin raaka-aineet stringinä, hyödyntää raaka-aine luokan __str__() metodia'''
        ingredients = ''
        for i in self.ingredients:
            ingredients += i.__str__() + "\n"
        return ingredients
    
    def getIngredientsGUI(self):
        ''' Palauttaa raaka-aineiden nimet listana'''
        ingredients = []
        for i in self.ingredients:
            ingredients.append(i.getName())
        return ingredients
    
    def getOutcomeStr(self):
        ''' Palauttaa reseptin lopputuloksen desimaalipilkulla muodossa "<määrä> <yksikkö>"'''
        return '' + str(self.outcomeSize).replace(".", ",") + ' ' + self.outcomeUnit
    
    def getOutcomeSize(self):
        ''' Palauttaa lopputuloksen floattina'''
        return self.outcomeSize
    
    def getOutcomeSizeGUI(self):
        ''' Palauttaa lopputuloksen stringinä desimaalipilkulla'''
        return str(self.outcomeSize).replace(".", ",")
        
    def getOutcomeUnit(self):
        ''' Palauttaa lopputuloksen yksikön'''
        return self.outcomeUnit
    
    def getAllergensDistinctGUI(self):
        ''' Palauttaa reseptien raaka-aineiden stringinä pilkulla erotettuna. Allergeeni esiintyy listassa vain kerran, vaikka se olisi monessa raaka-aineessa.'''
        allergens = []
        for ingredient in self.ingredients:
            for allergen in ingredient.getAllergens():
                allergens.append(allergen)
        allergenSet = set(allergens)
        string='  '
        for i in allergenSet:
            string += i+ ", "
        #Lopussa ei tarvitse olla ", ", joten poistetaan ne.
        string = string[:-2]
        return string
    
    def __str__(self):
        return '' + self.getName()+", " + self.getTimeStr() + ", " + self.getOutcomeStr() + ". \nIngredients: \n" + \
            self.getIngredientsStr() + "Instructions: \n" + self.getInstructionsStr() 
class IngredientContainer:
    '''
    Tämä luokka sisältää viittauksen raaka-aine olioon ja tämän lisäksi omat attribuutit määrästä sekä yksiköstä.
    Tätä luokkaa hyödynnetään varastolistauksen sekä reseptien raaka-aineiden tallentamisessa. Samaa raaka-ainetta
    käytetään hyvin todennäköisesti useassa eri reseptissä, jos Ingredient luokassa olisi määrä, niin silloin
    tietoa joutuisi kopioimaan sekä säilyttämään moneen kertaan. Tämän luokan avulla esim. Jauhelihan tiedot ovat vain
    kertaalleen Ingredient oliossa ja resepteissä olevat IngredientContainer oliot sisältävät viittauksen tähän.
    
    
    Attributes:
        :self.ingredient: Raaka-aine olio
        :self.quantity: Raaka-aineen määrä
        :self.unit: Määrän yksikkö
        
     Returns:
        :Attribuuttien muuttamiseen käytettävät metodit (set* & add* & delete/remove*) palauttavat True, jos muutos onnistuu
       
    Raises:
        :Attribuuttien asettamiseen käytettävät metodit (set* & add*) heittävät SetAttributeErrori:n, jos validointi epäonnistuu
    '''
    def __init__(self):
        
        self.ingredient = None
        self.quantity = None
        self.unit = None
        
        self.conversion = Conversion()

        
        
    def setIngredient(self,ingredient,ingredientsList):
        '''
        Etsii halutun raaka-aineen annetusta raaka-ainelistasta nimen perusteella sekä asettaa sen: self.ingredient
        
        Attributes:
            :ingredient: Etsittävä raaka-aine (string)
            :ingredientsList: Lista kaikista raaka-aineista
        
        Returns:
            :Onnistuessa: True
        
        Raises:
            :SetAttributeError epäonnistuessa
        '''
        for i in ingredientsList:
                if i.getName().strip().lower() == ingredient.lower():
                    self.ingredient = i
                    return True
                else:
                    # Raaka-ainetta kyseisellä nimellä ei löytynyt.
                    pass
        raise SetAttributeError("Raaka-ainetta ei löytynyt")
    
    def setQuantity(self,quantity):
        ''' Muuttaa desimaalipilkun pisteeksti ja asettaa määrän floattina: self.quantity'''
        try:
            self.quantity = float(str(quantity).replace(",","."))
            return True
        except ValueError:
            raise SetAttributeError("Määrän tulee olla desimaaliluku")
        
    def setUnit(self, unit):
        ''' Validoi, että yksikkö on ohjelman tuntema sekä asettaa sen: self.unit'''
        unit = unit.lower()
        if self.conversion.isValidUnit(unit):
            self.unit = unit
            return True
        else:
            raise SetAttributeError("Tuntematon yksikkö")
    
    def getQuantity(self):
        ''' Palauttaa määrän floattina'''
        return self.quantity
    
    def getQuantityStr(self):
        ''' Palauttaa määrän stringinä, desimaalipilkulla'''
        return str(self.quantity).replace(".", ",")
    
    def getUnit(self):
        ''' Palauttaa määrän yksikön'''
        return self.unit
    
    def getIngredient(self):
        ''' Palauttaa raaka-aine olion'''
        return self.ingredient
    
    def getName(self):
        ''' Palauttaa raaka-aineen nimen'''
        return self.ingredient.getName()
    
    def getAllergensStr(self):
        ''' Palauttaa allergeenit stringinä pilkulla erotettuna sekä alkussa teksti "Allergeenit: "'''
        return self.ingredient.getAllergensStr()
    
    def getRecipe(self):
        ''' Palauttaa reseptiolion, jos raaka-aineella on'''
        return self.ingredient.getRecipe()
    
    def getRecipeStr(self):
        ''' Palauttaa reseptin nimen stringinä, jos raaka-aineella on'''
        return self.ingredient.getRecipeStr()
    
    def getDensity(self):
        ''' Palauttaa raaka-aineen tiheyden floattina'''
        return self.ingredient.getDensity()
    
    def hasRecipe(self):
        ''' Palauttaa True, jos raaka-aineella on tallennettu resepti, muuten false'''
        if self.ingredient.getRecipeLoaded():
            return True
        else:
            return False
        
    def getAllergens(self):
        ''' Palauttaa allergeenit listana'''
        return self.ingredient.getAllergens()
    
    def __str__(self):
        return '' + self.getName() +", " + str(self.getQuantity()) + " " + self.getUnit()  + self.getAllergensStr() + self.getRecipeStr()