520 lines
22 KiB
Python
520 lines
22 KiB
Python
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
|
|
from datetime import datetime, timedelta
|
|
from geruecht.exceptions import UsernameExistLDAP, LDAPExcetpion, DayLocked, TansactJobIsAnswerdException
|
|
from geruecht.logger import getDebugLogger
|
|
|
|
db = dc.DatabaseController()
|
|
ldap = lc.LDAPController()
|
|
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
|
|
|
|
def getAllStatus(self):
|
|
debug.info("get all status for user")
|
|
retVal = db.getAllStatus()
|
|
debug.debug("status are {{ {} }}".format(retVal))
|
|
return retVal
|
|
|
|
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
|
|
|
|
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
|
|
|
|
def deleteStatus(self, status):
|
|
debug.info("delete status {{ {} }}".format(status))
|
|
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
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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
|
|
|
|
def getPricelist(self):
|
|
debug.info("get all drinks")
|
|
list = db.getPriceList()
|
|
debug.debug("all drinks are {{ {} }}".format(list))
|
|
return list
|
|
|
|
def setTransactJob(self, from_user, to_user, date):
|
|
debug.info("set transact job from {{ {} }} to {{ {} }} on {{ {} }}".format(
|
|
from_user, to_user, date))
|
|
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")
|
|
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
|
|
|
|
def getLockedDays(self, from_date, to_date):
|
|
debug.info("get locked days from {{ {} }} to {{ {} }}".format(
|
|
from_date.date(), to_date.date()))
|
|
oneDay = timedelta(1)
|
|
delta = to_date.date() - from_date.date()
|
|
retVal = []
|
|
startdate = from_date - oneDay
|
|
for _ in range(delta.days + 1):
|
|
startdate += oneDay
|
|
lockday = self.getLockedDay(startdate)
|
|
retVal.append(lockday)
|
|
debug.debug("lock days are {{ {} }}".format(retVal))
|
|
return retVal
|
|
|
|
def getLockedDay(self, date):
|
|
debug.info("get locked day on {{ {} }}".format(date))
|
|
now = datetime.now()
|
|
debug.debug("now is {{ {} }}".format(now))
|
|
oldMonth = False
|
|
debug.debug("check if date old month or current month")
|
|
for i in range(1, 8):
|
|
if datetime(now.year, now.month, i).weekday() == 2:
|
|
if now.day < i:
|
|
oldMonth = True
|
|
break
|
|
debug.debug("oldMonth is {{ {} }}".format(oldMonth))
|
|
lockedYear = now.year
|
|
lockedMonth = now.month if now.month < now.month else now.month - \
|
|
1 if oldMonth else now.month
|
|
endDay = 1
|
|
debug.debug("calculate end day of month")
|
|
lockedYear = lockedYear if lockedMonth != 12 else (lockedYear + 1)
|
|
lockedMonth = (lockedMonth + 1) if lockedMonth != 12 else 1
|
|
for i in range(1, 8):
|
|
nextMonth = datetime(lockedYear, lockedMonth, i)
|
|
if nextMonth.weekday() == 2:
|
|
endDay = i
|
|
break
|
|
|
|
monthLockedEndDate = datetime(
|
|
lockedYear, lockedMonth, endDay) - timedelta(1)
|
|
debug.debug("get lock day from database")
|
|
retVal = db.getLockedDay(date.date())
|
|
if not retVal:
|
|
debug.debug(
|
|
"lock day not exists, retVal is {{ {} }}".format(retVal))
|
|
if date.date() <= monthLockedEndDate.date():
|
|
debug.debug("lock day {{ {} }}".format(date.date()))
|
|
self.setLockedDay(date, True)
|
|
retVal = db.getLockedDay(date.date())
|
|
else:
|
|
retVal = {"daydate": date.date(), "locked": False}
|
|
debug.debug("locked day is {{ {} }}".format(retVal))
|
|
return retVal
|
|
|
|
def getWorker(self, date, username=None):
|
|
debug.info("get worker {{ {} }} on {{ {} }}".format(username, date))
|
|
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
|
|
|
|
def addWorker(self, username, date, userExc=False):
|
|
debug.info("add job user {{ {} }} on {{ {} }}".format(username, date))
|
|
if (userExc):
|
|
debug.debug("this is a user execution, check if day is locked")
|
|
lockedDay = self.getLockedDay(date)
|
|
if lockedDay:
|
|
if lockedDay['locked']:
|
|
debug.debug("day is lockey. user cant get job")
|
|
raise DayLocked("Day is locked. You can't get the Job")
|
|
user = self.getUser(username)
|
|
debug.debug("user is {{ {} }}".format(user))
|
|
debug.debug("check if user has job on date")
|
|
if (not db.getWorker(user, date)):
|
|
debug.debug("set job to user")
|
|
db.setWorker(user, date)
|
|
retVal = self.getWorker(date, username=username)
|
|
debug.debug("worker on date is {{ {} }}".format(retVal))
|
|
return retVal
|
|
|
|
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)
|
|
|
|
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))
|
|
if user.uid == 'extern':
|
|
debug.debug("user is extern user, so exit add amount")
|
|
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))
|
|
if user.uid == 'extern':
|
|
debug.debug("user is extern user, so exit add credit")
|
|
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
|
|
|
|
def checkBarUser(self, user):
|
|
debug.info("check if user {{ {} }} is baruser")
|
|
date = datetime.now()
|
|
zero = date.replace(hour=0, minute=0, second=0, microsecond=0)
|
|
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)
|
|
enddatetime = startdatetime + timedelta(days=1)
|
|
debug.debug("startdatetime is {{ {} }} and enddatetime is {{ {} }}".format(
|
|
startdatetime, end))
|
|
result = False
|
|
if date >= startdatetime and date < enddatetime:
|
|
result = db.getWorker(user, startdatetime)
|
|
debug.debug("worker is {{ {} }}".format(result))
|
|
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
|
|
|
|
def modifyUser(self, user, ldap_conn, attributes):
|
|
debug.info("modify user {{ {} }} with attributes {{ {} }} with ldap_conn {{ {} }}".format(
|
|
user, attributes, ldap_conn))
|
|
try:
|
|
if 'username' in attributes:
|
|
debug.debug("change username, so change first in database")
|
|
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
|
|
else:
|
|
retVal = self.getUser(user.uid)
|
|
debug.debug("user is {{ {} }}".format(retVal))
|
|
return retVal
|
|
except UsernameExistLDAP as err:
|
|
debug.debug(
|
|
"username exists on ldap, rechange username on database", exc_info=True)
|
|
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))
|
|
user.password = password
|
|
ldap.login(username, password)
|
|
ldap_conn = ldap.bind(user, password)
|
|
return user, ldap_conn
|
|
except PermissionDenied as err:
|
|
debug.debug("permission is denied", exc_info=True)
|
|
raise err
|