From 407554dfea70c7805694e3449774642ff04df6dc Mon Sep 17 00:00:00 2001 From: Rick Date: Tue, 26 Feb 2019 21:14:42 +0100 Subject: [PATCH] Add hashing functions to quickly check if the objects have changed --- admidio.py | 17 ++++++++++++++++- event.py | 20 +++++++++++++++++++- group.py | 11 +++++++++++ member.py | 20 +++++++++++++++++--- 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/admidio.py b/admidio.py index 4e4458a..b1c5202 100644 --- a/admidio.py +++ b/admidio.py @@ -1,4 +1,5 @@ import MySQLdb +import hashlib from .member import Member as member from .group import Group as group @@ -9,7 +10,7 @@ from dateutil.relativedelta import relativedelta class Admidio: - """Creates the Admidio Class""" + """Admidio Class""" def __init__(self, mysql_host, mysql_user, mysql_pass, mysql_db, db_prefix): @@ -48,6 +49,20 @@ class Admidio: 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, diff --git a/event.py b/event.py index bc2e0fd..bade609 100644 --- a/event.py +++ b/event.py @@ -1,4 +1,5 @@ from .exceptions import MemberNotFoundException +import hashlib class Event(): @@ -45,7 +46,24 @@ class Event(): except MemberNotFoundException: print( - f"Member with id {row[0]} not found, group id: {self.id}") + "Member with id {row[0]} not found, group id:" + + f"{self.id}") + + def __eq__(self, other): + if isinstance(other, Event): + return self.hash() == other.hash() + + def hash(self): + return hashlib.md5((str(self.rol_id) + + self.start_time.strftime("%Y-%m-%d %H:%M:%S") + + self.end_time.strftime("%Y-%m-%d %H:%M:%S") + + str(self.id) + + (''.join(str(y) + for x, y in self.participants) or '') + + (''.join(str(y) for x, y in self.leaders) or '') + + self.name + (self.description or '') + + (self.location or '') + + str(self.cat_id)).encode('utf-8')).hexdigest() def getAllMembers(self): """Return leaders and members in group, combined""" diff --git a/group.py b/group.py index f9a9c95..3c121cc 100644 --- a/group.py +++ b/group.py @@ -1,4 +1,5 @@ from .exceptions import MemberNotFoundException +import hashlib class Group: @@ -25,6 +26,16 @@ class Group: print( f"Member with id {row[0]} not found, group id: {self.id}") + def __eq__(self, other): + if isinstance(other, Group): + return self.hash() == other.hash() + + def hash(self): + return hashlib.md5((str(self.id) + self.name + + (''.join(str(x) for x in self.members) or '') + + (''.join(str(x) for x in self.leaders) or '') + ).encode('utf-8')).hexdigest() + def getAllMembers(self): """Return leaders and members in group, combined""" return self.leaders.append(self.members) diff --git a/member.py b/member.py index 4fba2c6..9ec2059 100644 --- a/member.py +++ b/member.py @@ -1,4 +1,5 @@ import pprint +import hashlib class Member(): @@ -19,9 +20,22 @@ class Member(): # makes dict with {usf_name_intern:usd_value} self.userdata[userfields[row[0]]] = row[1] - def __hash__(self): - """Not sure if needed""" - return hash((self.user_id, self.username)) + def __eq__(self, other): + if isinstance(other, Member): + return self.hash() == other.hash() + + def hash(self): + if self.password: + return hashlib.md5((str(self.user_id) + + self.username + + self.password + + str(self.userdata) + ).encode('utf-8')).hexdigest() + else: + return hashlib.md5((str(self.user_id) + + self.username + + str(self.userdata) + ).encode('utf-8')).hexdigest() def __str__(self): return (f"""Userid: {self.user_id}, Username: {self.username}, """