import MySQLdb
|
|
import hashlib
|
|
|
|
from .member import Member as member
|
|
from .group import Group as group
|
|
from .event import Event as event
|
|
from .exceptions import MemberNotFoundException
|
|
from datetime import datetime
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
|
|
class Admidio:
|
|
"""Admidio Class"""
|
|
|
|
def __init__(self, mysql_host, mysql_user, mysql_pass, mysql_db,
|
|
db_prefix):
|
|
self.mysql_host = mysql_host
|
|
self.mysql_user = mysql_user
|
|
self.mysql_pass = mysql_pass
|
|
self.mysql_db = mysql_db
|
|
|
|
self.prefix = db_prefix
|
|
|
|
self.members = dict()
|
|
self.groups = dict()
|
|
self.events = dict()
|
|
|
|
self.event_confirmation_id = None
|
|
|
|
self.connect_db()
|
|
|
|
sql = f"SELECT usf_id,usf_name_intern FROM {self.prefix}_user_fields"
|
|
self.cursor.execute(sql)
|
|
self.userfields = dict(self.cursor.fetchall())
|
|
|
|
# Get the id for event confirmation role.
|
|
# So it can exclude them from Groups
|
|
|
|
sql = f"""SELECT cat_id
|
|
FROM {self.prefix}_categories
|
|
WHERE cat_name_intern = 'EVENTS'"""
|
|
self.cursor.execute(sql)
|
|
self.event_confirmation_id = self.cursor.fetchone()[0]
|
|
|
|
self.db.close()
|
|
|
|
self.refresh()
|
|
|
|
def __del__(self):
|
|
pass
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, Admidio):
|
|
return self.hash() == other.hash()
|
|
|
|
def hash(self):
|
|
s = ''
|
|
for _, x in self.members.items():
|
|
s += x.hash()
|
|
for _, x in self.groups.items():
|
|
s += x.hash()
|
|
for _, x in self.events.items():
|
|
s += x.hash()
|
|
return hashlib.md5(s.encode('utf-8')).hexdigest()
|
|
|
|
def connect_db(self):
|
|
self.db = MySQLdb.connect(
|
|
host=self.mysql_host,
|
|
user=self.mysql_user,
|
|
passwd=self.mysql_pass,
|
|
db=self.mysql_db)
|
|
|
|
self.cursor = self.db.cursor()
|
|
|
|
def refresh(self):
|
|
"""Refresh all users, groups and events that are stored"""
|
|
self.connect_db()
|
|
|
|
self.ready = False
|
|
self.members.clear()
|
|
self.groups.clear()
|
|
self.events.clear()
|
|
self.initMembers()
|
|
self.initGroups()
|
|
self.initEvents()
|
|
self.ready = True
|
|
|
|
self.db.close()
|
|
|
|
def initMembers(self):
|
|
"""Initialises all members in the Admidio installation"""
|
|
|
|
sql = f"""SELECT usr_id, usr_login_name, usr_password
|
|
FROM {self.prefix}_users WHERE usr_valid = 1"""
|
|
self.cursor.execute(sql)
|
|
|
|
for row in self.cursor.fetchall():
|
|
self.members[row[0]] = member(
|
|
self.db, row[0], row[1],
|
|
row[2], self.userfields, self)
|
|
|
|
def initGroups(self):
|
|
"""Initialises all groups in the Admidio installation"""
|
|
|
|
sql = f"""SELECT rol_id, rol_name, rol_description
|
|
FROM {self.prefix}_roles
|
|
WHERE rol_valid = 1
|
|
AND rol_cat_id != {self.event_confirmation_id}"""
|
|
self.cursor.execute(sql)
|
|
|
|
for row in self.cursor.fetchall():
|
|
self.groups[row[0]] = group(row[0], row[1], self)
|
|
|
|
def initEvents(self):
|
|
"""Initialises all comming events and passed events <3 months"""
|
|
|
|
datestring = datetime.now() + relativedelta(months=-6)
|
|
datestring = datestring.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
sql = f"""SELECT dat_id, dat_cat_id, dat_begin, dat_end,
|
|
dat_headline, dat_description,
|
|
dat_location, dat_country, dat_rol_id
|
|
FROM {self.prefix}_dates
|
|
WHERE dat_begin >'{datestring}'
|
|
ORDER BY dat_begin"""
|
|
self.cursor.execute(sql)
|
|
|
|
for row in self.cursor.fetchall():
|
|
self.events[row[0]] = event(
|
|
row[0], row[8], row[4], row[2], row[3], row[5],
|
|
row[6], row[7], row[1], self)
|
|
|
|
def getMemberFromID(self, user_id):
|
|
"""
|
|
Returns Member object if user_id exists
|
|
otherwise throws MemberNotFoundException
|
|
"""
|
|
if user_id in self.members:
|
|
return self.members[user_id]
|
|
else:
|
|
raise MemberNotFoundException(
|
|
f"Member with id {user_id} not found")
|