flaschengeist/geruecht/controller/userController.py

468 lines
20 KiB
Python
Raw Normal View History

from . import Singleton, mailConfig
import geruecht.controller.databaseController as dc
import geruecht.controller.ldapController as lc
import geruecht.controller.emailController as ec
import calendar
from geruecht.model.user import User
from geruecht.exceptions import PermissionDenied
2020-01-18 22:31:49 +00:00
from datetime import datetime, timedelta
from geruecht.exceptions import UsernameExistLDAP, LDAPExcetpion, DayLocked, TansactJobIsAnswerdException
from geruecht.logger import getDebugLogger
db = dc.DatabaseController()
ldap = lc.LDAPController()
2020-02-26 21:13:44 +00:00
emailController = ec.EmailController(mailConfig['URL'], mailConfig['user'], mailConfig['passwd'], mailConfig['crypt'], mailConfig['port'], mailConfig['email'])
debug = getDebugLogger()
class UserController(metaclass=Singleton):
def __init__(self):
debug.debug("init UserController")
pass
2020-03-03 21:33:47 +00:00
def getAllStatus(self):
debug.info("get all status for user")
retVal = db.getAllStatus()
debug.debug("status are {{}}".format(retVal))
return retVal
2020-03-03 21:33:47 +00:00
def getStatus(self, name):
debug.info("get status of user {{}}".format(name))
retVal = db.getStatus(name)
debug.debug("status of user {{}} is {{}}".format(name, retVal))
return retVal
2020-03-03 21:33:47 +00:00
def setStatus(self, name):
debug.info("set status of user {{}}".format(name))
retVal = db.setStatus(name)
debug.debug("settet status of user {{}} is {{}}".format(name, retVal))
return retVal
2020-03-03 21:33:47 +00:00
def deleteStatus(self, status):
debug.info("delete status {{}}".format(status))
2020-03-03 21:33:47 +00:00
db.deleteStatus(status)
def updateStatus(self, status):
debug.info("update status {{}}".format(status))
retVal = db.updateStatus(status)
debug.debug("updated status is {{}}".format(retVal))
return retVal
2020-03-03 21:33:47 +00:00
def updateStatusOfUser(self, username, status):
debug.info("update status {{}} of user {{}}".format(status, username))
retVal = db.updateStatusOfUser(username, status)
debug.debug("updatet status of user {{}} is {{}}".format(username, retVal))
return retVal
2020-03-03 21:33:47 +00:00
def updateVotingOfUser(self, username, voting):
debug.info("update voting {{}} of user {{}}".format(voting, username))
retVal = db.updateVotingOfUser(username, voting)
debug.debug("updatet voting of user {{}} is {{}}".format(username, retVal))
return retVal
2020-03-03 21:33:47 +00:00
def deleteDrinkType(self, type):
debug.info("delete drink type {{}}".format(type))
db.deleteDrinkType(type)
def updateDrinkType(self, type):
debug.info("update drink type {{}}".format(type))
retVal = db.updateDrinkType(type)
debug.debug("updated drink type is {{}}".format(retVal))
return retVal
def setDrinkType(self, type):
debug.info("set drink type {{}}".format(type))
retVal = db.setDrinkType(type)
debug.debug("seted drink type is {{}}".format(retVal))
return retVal
def deletDrinkPrice(self, drink):
debug.info("delete drink {{}}".format(drink))
db.deleteDrink(drink)
def setDrinkPrice(self, drink):
debug.info("set drink {{}}".format(drink))
retVal = db.setDrinkPrice(drink)
debug.debug("seted drink is {{}}".format(retVal))
return retVal
def updateDrinkPrice(self, drink):
debug.info("update drink {{}}".format(drink))
retVal = db.updateDrinkPrice(drink)
debug.debug("updated drink is {{}}".format(retVal))
return retVal
def getAllDrinkTypes(self):
debug.info("get all drink types")
retVal = db.getAllDrinkTypes()
debug.debug("all drink types are {{}}".format(retVal))
return retVal
2020-02-27 20:55:00 +00:00
def getPricelist(self):
debug.info("get all drinks")
2020-02-27 20:55:00 +00:00
list = db.getPriceList()
debug.debug("all drinks are {{}}".format(list))
2020-02-27 20:55:00 +00:00
return list
def setTransactJob(self, from_user, to_user, date):
debug.info("set transact job from {{}} to {{}} on {{}}".format(from_user, to_user, date))
2020-02-27 14:01:41 +00:00
jobtransact = db.setTransactJob(from_user, to_user, date.date())
debug.debug("transact job is {{}}".format(jobtransact))
debug.info("send mail with transact job to user")
2020-02-27 14:01:41 +00:00
emailController.sendMail(jobtransact['to_user'], 'jobtransact', jobtransact)
return jobtransact
def getTransactJobFromUser(self, user, date):
debug.info("get transact job from user {{}} on {{}}".format(user, date))
retVal = db.getTransactJobFromUser(user, date.date())
debug.debug("transact job from user {{}} is {{}}".format(user, retVal))
return retVal
def getAllTransactJobFromUser(self, user, date):
debug.info("get all transact job from user {{}} start on {{}}".format(user, date))
retVal = db.getAllTransactJobFromUser(user, date,date())
debug.debug("all transact job are {{}}".format(retVal))
return retVal
def getAllTransactJobToUser(self, user, date):
debug.info("get all transact job from to_user {{}} start on {{}}".format(user, date))
retVal = db.getAllTransactJobToUser(user, date.date())
debug.debug("all transact job are {{}}".format(retVal))
return retVal
def getTransactJob(self, from_user, to_user, date):
debug.info("get transact job from user {{}} to user {{}} on {{}}".format(from_user, to_user, date))
retVal = db.getTransactJob(from_user, to_user, date.date())
debug.debug("transact job is {{}}".format(retVal))
return retVal
def deleteTransactJob(self, from_user, to_user, date):
debug.info("delete transact job from user {{}} to user {{}} on {{}}".format(from_user, to_user, date))
transactJob = self.getTransactJob(from_user, to_user, date)
debug.debug("transact job is {{}}".format(transactJob))
if transactJob['answerd']:
debug.warning("transactjob {{}} can not delete because is answerd")
raise TansactJobIsAnswerdException("TransactJob is already answerd")
db.deleteTransactJob(from_user, to_user, date.date())
def answerdTransactJob(self, from_user, to_user, date, answer):
debug.info("answer transact job from user {{}} to user {{}} on {{}} with answer {{}}".format(from_user, to_user, date, answer))
transactJob = db.updateTransactJob(from_user, to_user, date.date(), answer)
debug.debug("transactjob is {{}}".format(transactJob))
if answer:
debug.info("add worker on date {{}}".format(date))
self.addWorker(to_user.uid, date)
return transactJob
def setLockedDay(self, date, locked, hard=False):
debug.info("set day locked on {{}} with state {{}}".format(date, locked))
retVal = db.setLockedDay(date.date(), locked, hard)
debug.debug("seted day locked is {{}}".format(retVal))
return retVal
2020-02-24 11:19:52 +00:00
def getLockedDay(self, date):
debug.info("get locked day on {{}}".format(date))
now = datetime.now()
debug.debug("now is {{}}".format(now))
2020-03-01 20:44:38 +00:00
oldMonth = False
debug.debug("check if date old month or current month")
for i in range(1, 8):
2020-03-01 20:44:38 +00:00
if datetime(now.year, now.month, i).weekday() == 2:
if now.day < i:
oldMonth = True
break
debug.debug("oldMonth is {{}}".format(oldMonth))
2020-03-01 20:44:38 +00:00
lockedYear = date.year
lockedMonth = date.month if date.month < now.month else now.month - 1 if oldMonth else now.month
daysInMonth = calendar.monthrange(lockedYear, lockedMonth)[1]
startDay = 1
debug.debug("calculate start day of month")
2020-03-01 20:44:38 +00:00
for i in range(1, 8):
if datetime(lockedYear, lockedMonth, i).weekday() == 2:
startDay = i
break
debug.debug("start day of month is {{}}".format(startDay))
debug.debug("check if date should be locked")
2020-03-01 20:44:38 +00:00
if lockedYear <= now.year and lockedMonth <= now.month:
for i in range(startDay, daysInMonth + 1):
debug.debug("lock day {{}}".format(datetime(lockedYear, lockedMonth, i)))
2020-03-01 20:44:38 +00:00
self.setLockedDay(datetime(lockedYear, lockedMonth, i), True)
2020-02-24 11:19:52 +00:00
for i in range(1, 8):
2020-03-01 20:44:38 +00:00
nextMonth = datetime(lockedYear, lockedMonth + 1, i)
2020-02-24 11:19:52 +00:00
if nextMonth.weekday() == 2:
break
debug.debug("lock day {{}}".format(datetime(lockedYear, lockedMonth, i)))
2020-02-24 11:19:52 +00:00
self.setLockedDay(nextMonth, True)
retVal = db.getLockedDay(date.date())
debug.debug("locked day is {{}}".format(retVal))
return
2020-01-18 22:31:49 +00:00
def getWorker(self, date, username=None):
debug.info("get worker on {{}}".format(username, date))
2020-01-18 22:31:49 +00:00
if (username):
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
retVal = [db.getWorker(user, date)]
debug.debug("worker is {{}}".format(retVal))
return retVal
retVal = db.getWorkers(date)
debug.debug("workers are {{}}".format(retVal))
return retVal
2020-01-18 22:31:49 +00:00
2020-02-23 21:31:22 +00:00
def addWorker(self, username, date, userExc=False):
debug.info("add job user {{}} on {{}}".format(username, date))
2020-02-23 21:31:22 +00:00
if (userExc):
debug.debug("this is a user execution, check if day is locked")
2020-02-23 21:31:22 +00:00
lockedDay = self.getLockedDay(date)
if lockedDay:
if lockedDay['locked']:
debug.debug("day is lockey. user cant get job")
2020-02-23 21:31:22 +00:00
raise DayLocked("Day is locked. You can't get the Job")
2020-01-18 22:31:49 +00:00
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
debug.debug("check if user has job on date")
2020-01-18 22:31:49 +00:00
if (not db.getWorker(user, date)):
debug.debug("set job to user")
2020-01-18 22:31:49 +00:00
db.setWorker(user, date)
retVal = self.getWorker(date, username=username)
debug.debug("worker on date is {{}}".format(retVal))
return retVal
2020-01-18 22:31:49 +00:00
def deleteWorker(self, username, date, userExc=False):
debug.info("delete worker {{}} on date {{}}".format(username, date))
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
if userExc:
debug.debug("is user execution, check if day locked")
lockedDay = self.getLockedDay(date)
if lockedDay:
if lockedDay['locked']:
debug.debug("day is locked, check if accepted transact job exists")
transactJobs = self.getTransactJobFromUser(user, date)
debug.debug("transact job is {{}}".format(transactJobs))
found = False
for job in transactJobs:
if job['accepted'] and job['answerd']:
debug.debug("accepted transact job exists")
found = True
break
if not found:
debug.debug("no accepted transact job found")
raise DayLocked("Day is locked. You can't delete the Job")
db.deleteWorker(user, date)
2020-01-18 22:31:49 +00:00
def lockUser(self, username, locked):
debug.info("lock user {{}} for credit with status {{}}".format(username, locked))
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
user.updateData({'locked': locked})
db.updateUser(user)
retVal = self.getUser(username)
debug.debug("locked user is {{}}".format(retVal))
return retVal
def updateConfig(self, username, data):
debug.info("update config of user {{}} with config {{}}".format(username, data))
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
user.updateData(data)
db.updateUser(user)
retVal = self.getUser(username)
debug.debug("updated config of user is {{}}".format(retVal))
return retVal
def __updateDataFromLDAP(self, user):
debug.info("update data from ldap for user {{}}".format(user))
groups = ldap.getGroup(user.uid)
debug.debug("ldap gorups are {{}}".format(groups))
user_data = ldap.getUserData(user.uid)
debug.debug("ldap data is {{}}".format(user_data))
user_data['gruppe'] = groups
user_data['group'] = groups
user.updateData(user_data)
db.updateUser(user)
def autoLock(self, user):
debug.info("start autolock of user {{}}".format(user))
if user.autoLock:
debug.debug("autolock is active")
credit = user.getGeruecht(year=datetime.now().year).getSchulden()
limit = -1*user.limit
if credit <= limit:
debug.debug("credit {{}} is more than user limit {{}}".format(credit, limit))
debug.debug("lock user")
user.updateData({'locked': True})
debug.debug("send mail to user")
emailController.sendMail(user)
else:
debug.debug("cretid {{}} is less than user limit {{}}".format(credit, limit))
debug.debug("unlock user")
user.updateData({'locked': False})
db.updateUser(user)
def addAmount(self, username, amount, year, month, finanzer=False):
debug.info("add amount {{}} to user {{}} no month {{}}, year {{}}".format(amount, username, month, year))
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
2020-03-04 20:11:41 +00:00
if user.uid == 'extern':
debug.debug("user is extern user, so exit add amount")
2020-03-04 20:11:41 +00:00
return
if not user.locked or finanzer:
debug.debug("user is not locked {{}} or is finanzer execution {{}}".format(user.locked, finanzer))
user.addAmount(amount, year=year, month=month)
creditLists = user.updateGeruecht()
debug.debug("creditList is {{}}".format(creditLists))
for creditList in creditLists:
debug.debug("update creditlist {{}}".format(creditList))
db.updateCreditList(creditList)
debug.debug("do autolock")
self.autoLock(user)
retVal = user.getGeruecht(year)
debug.debug("updated creditlists is {{}}".format(retVal))
return retVal
def addCredit(self, username, credit, year, month):
debug.info("add credit {{}} to user {{}} on month {{}}, year {{}}".format(credit, username, month, year))
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
2020-03-04 20:11:41 +00:00
if user.uid == 'extern':
debug.debug("user is extern user, so exit add credit")
2020-03-04 20:11:41 +00:00
return
user.addCredit(credit, year=year, month=month)
creditLists = user.updateGeruecht()
debug.debug("creditlists are {{}}".format(creditLists))
for creditList in creditLists:
debug.debug("update creditlist {{}}".format(creditList))
db.updateCreditList(creditList)
debug.debug("do autolock")
self.autoLock(user)
retVal = user.getGeruecht(year)
debug.debug("updated creditlists are {{}}".format(retVal))
return retVal
def getAllUsersfromDB(self):
debug.info("get all users from database")
users = db.getAllUser()
debug.debug("users are {{}}".format(users))
for user in users:
try:
debug.debug("update data from ldap")
self.__updateDataFromLDAP(user)
except:
pass
debug.debug("update creditlists")
self.__updateGeruechte(user)
retVal = db.getAllUser(extern=True)
debug.debug("all users are {{}}".format(retVal))
return retVal
2020-01-18 22:31:49 +00:00
def checkBarUser(self, user):
debug.info("check if user {{}} is baruser")
2020-01-18 22:31:49 +00:00
date = datetime.now()
zero = date.replace(hour=0, minute=0, second=0, microsecond=0)
2020-02-23 10:46:38 +00:00
end = zero + timedelta(hours=12)
startdatetime = date.replace(hour=12, minute=0, second=0, microsecond=0)
if date > zero and end > date:
startdatetime = startdatetime - timedelta(days=1)
2020-01-18 22:31:49 +00:00
enddatetime = startdatetime + timedelta(days=1)
debug.debug("startdatetime is {{}} and enddatetime is {{}}".format(startdatetime, end))
2020-01-18 22:31:49 +00:00
result = False
if date >= startdatetime and date < enddatetime:
result = db.getWorker(user, startdatetime)
debug.debug("worker is {{}}".format(result))
2020-01-18 22:31:49 +00:00
return True if result else False
def getUser(self, username):
debug.info("get user {{}}".format(username))
user = db.getUser(username)
debug.debug("user is {{}}".format(user))
groups = ldap.getGroup(username)
debug.debug("groups are {{}}".format(groups))
user_data = ldap.getUserData(username)
debug.debug("user data from ldap is {{}}".format(user_data))
user_data['gruppe'] = groups
user_data['group'] = groups
if user is None:
debug.debug("user not exists in database -> insert into database")
user = User(user_data)
db.insertUser(user)
else:
debug.debug("update database with user")
user.updateData(user_data)
db.updateUser(user)
user = db.getUser(username)
self.__updateGeruechte(user)
debug.debug("user is {{}}".format(user))
return user
def __updateGeruechte(self, user):
debug.debug("update creditlists")
user.getGeruecht(datetime.now().year)
creditLists = user.updateGeruecht()
debug.debug("creditlists are {{}}".format(creditLists))
if user.getGeruecht(datetime.now().year).getSchulden() != 0:
for creditList in creditLists:
debug.debug("update creditlist {{}}".format(creditList))
db.updateCreditList(creditList)
def sendMail(self, username):
debug.info("send mail to user {{}}".format(username))
if type(username) == User:
user = username
if type(username) == str:
user = db.getUser(username)
retVal = emailController.sendMail(user)
debug.debug("send mail is {{}}".format(retVal))
return retVal
def sendAllMail(self):
debug.info("send mail to all user")
retVal = []
users = db.getAllUser()
debug.debug("users are {{}}".format(users))
for user in users:
retVal.append(self.sendMail(user))
debug.debug("send mails are {{}}".format(retVal))
return retVal
2020-01-26 22:31:22 +00:00
def modifyUser(self, user, ldap_conn, attributes):
debug.info("modify user {{}} with attributes {{}} with ldap_conn {{}}".format(user, attributes, ldap_conn))
2020-01-26 22:31:22 +00:00
try:
if 'username' in attributes:
debug.debug("change username, so change first in database")
2020-01-26 22:31:22 +00:00
db.changeUsername(user, attributes['username'])
ldap.modifyUser(user, ldap_conn, attributes)
if 'username' in attributes:
retVal = self.getUser(attributes['username'])
debug.debug("user is {{}}".format(retVal))
return retVal
2020-01-26 22:31:22 +00:00
else:
retVal = self.getUser(user.uid)
debug.debug("user is {{}}".format(retVal))
return retVal
2020-01-26 22:31:22 +00:00
except UsernameExistLDAP as err:
debug.debug("username exists on ldap, rechange username on database", exc_info=True)
2020-01-26 22:31:22 +00:00
db.changeUsername(user, user.uid)
raise Exception(err)
except LDAPExcetpion as err:
if 'username' in attributes:
db.changeUsername(user, user.uid)
raise Exception(err)
except Exception as err:
raise Exception(err)
def loginUser(self, username, password):
debug.info("login user {{}}".format(username))
try:
user = self.getUser(username)
debug.debug("user is {{}}".format(user))
2020-01-26 22:31:22 +00:00
user.password = password
ldap.login(username, password)
2020-01-26 22:31:22 +00:00
ldap_conn = ldap.bind(user, password)
return user, ldap_conn
except PermissionDenied as err:
debug.debug("permission is denied", exc_info=True)
raise err