from geruecht import db from geruecht import bcrypt from geruecht.model.creditList import CreditList from datetime import datetime class User(db.Model): """ Database Object for User Table for all safed User Attributes: id: Id in Database as Primary Key. userID: ID for the User maybe to Link? username: Username of the User to Login firstname: Firstname of the User Lastname: Lastname of the User group: Which group is the User? moneymaster, gastro, user or bar? password: salted hashed password for the User. """ id = db.Column(db.Integer, primary_key=True) userID = db.Column(db.String, nullable=False, unique=True) username = db.Column(db.String, nullable=False, unique=True) firstname = db.Column(db.String, nullable=False) lastname = db.Column(db.String, nullable=False) group = db.Column(db.String, nullable=False) password = db.Column(db.String, nullable=False) geruechte = db.relationship('CreditList', backref='user', lazy=True) def createGeruecht(self, amount=0, year=datetime.now().year): """ Create Geruecht This function create a geruecht for the user for an year. By default is amount zero and year the actual year. Args: amount: is the last_schulden of the geruecht year: is the year of the geruecht Returns: the created geruecht """ print('create geruecht for user {} in year {}'.format(self.userID, year)) credit = CreditList(user_id=self.id, last_schulden=amount, year=year) db.session.add(credit) db.session.commit() credit = CreditList.query.filter_by(year=year, user_id=self.id).first() print('reated geruecht {}'.format(credit)) return credit def getGeruecht(self, year=datetime.now().year): """ Get Geruecht This function returns the geruecht of an year. By default is the year the actual year. Args: year: the year of the geruecht Returns: the geruecht of the year """ for geruecht in self.geruechte: if geruecht.year == year: print("find geruecht {} for user {}".format(geruecht, self.id)) return geruecht print("no geruecht found for user {}. Will create one".format(self.id)) geruecht = self.createGeruecht(year=year) self.updateGeruecht() return geruecht def addAmount(self, amount, year=datetime.now().year, month=datetime.now().month): """ Add Amount This function add an amount to a geruecht with an spezified year and month to the user. By default the year is the actual year. By default the month is the actual month. Args: year: year of the geruecht month: month for the amount Returns: double (credit, amount) """ geruecht = self.getGeruecht(year=year) retVal = geruecht.addAmount(amount, month=month) db.session.add(geruecht) db.session.commit() self.updateGeruecht() return retVal def addCredit(self, credit, year=datetime.now().year, month=datetime.now().month): """ Add Credit This function add an credit to a geruecht with an spezified year and month to the user. By default the year is the actual year. By default the month is the actual month. Args: year: year of the geruecht month: month for the amount Returns: double (credit, amount) """ geruecht = self.getGeruecht(year=year) retVal = geruecht.addCredit(credit, month=month) db.session.add(geruecht) db.session.commit() self.updateGeruecht() return retVal def updateGeruecht(self): """ Update list of geruechte This function iterate through the geruechte, which sorted by year and update the last_schulden of the geruecht. """ self.geruechte.sort(key=self.sortYear) for index, geruecht in enumerate(self.geruechte): if index == 0 or index == len(self.geruechte) - 1: geruecht.last_schulden = 0 if index != 0: geruecht.last_schulden = (self.geruechte[index - 1].getSchulden() * -1) db.session.commit() def sortYear(self, geruecht): """ Sort Year This function is only an helperfunction to sort the list of geruechte by years. It only returns the year of the geruecht. Args: geruecht: geruecht which year you want Returns: int year of the geruecht """ return geruecht.year def toJSON(self): """ Create Dic to dump in JSON Returns: A Dic with static Attributes. """ dic = { "userId": self.userID, "username": self.username, "firstname": self.firstname, "lastname": self.lastname, "group": self.group, } return dic def login(self, password): """ Login for the User Only check the given Password: Returns: A Bool. True if the password is correct and False if it isn't. """ return True if bcrypt.check_password_hash(self.password, password) else False