class Branch(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) is_main = db.Column(db.Boolean, unique=False, default=False) website = db.Column(db.String(255), unique=False, nullable=True) phone = db.Column(db.String(255), unique=False, nullable=True) email = db.Column(db.String(255), unique=False, nullable=True) organisation_id = db.Column(UuidField, db.ForeignKey('organisation.id'), nullable=False) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) rooms = relationship('Room', backref="Branch", lazy=True)
class StudentClass(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) tax = db.Column(db.String(255), unique=False, nullable=True) coc = db.Column(db.String(255), unique=False, nullable=True) default_time = db.Column(db.DateTime) current_time = db.Column(db.DateTime) is_cancelt = db.Column(db.Boolean, default=False) is_attendance_required = db.Column(db.Boolean, default=True) defaultRoom_id = db.Column(UuidField, db.ForeignKey('room.id'), nullable=False) currentRoom_id = db.Column(UuidField, db.ForeignKey('room.id'), nullable=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class Organisation(db.Model, Crud): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) tax = db.Column(db.String(255), unique=False, nullable=True) coc = db.Column(db.String(255), unique=False, nullable=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) def add_user(self, user: '******') -> UserOrganisation: link_obj = UserOrganisation.link_obj(user_obj=user, organisation_obj=self) link_obj.save() return link_obj
class UserGroup(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) number = db.Column(db.String(255), unique=False, nullable=True) coc = db.Column(db.String(255), unique=False, nullable=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class Assignment(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) tax = db.Column(db.String(255), unique=False, nullable=True) coc = db.Column(db.String(255), unique=False, nullable=True) turned_in = db.Column(db.Boolean, default=False, nullable=False) is_group_assignment = db.Column(db.Boolean, default=False, nullable=False) is_graded = db.Column(db.Boolean, default=True, nullable=False) note = db.Column(db.Text, nullable=True) assignmentGroup_id = db.Column(UuidField, db.ForeignKey('assignment_group.id'), nullable=False) classStart_id = db.Column(UuidField, db.ForeignKey('student_class.id'), nullable=False) classDue_id = db.Column(UuidField, db.ForeignKey('student_class.id'), nullable=False) date_started = db.Column(db.DateTime, nullable=True, default=datetime.utcnow) date_due = db.Column(db.DateTime, nullable=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class Room(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) branch_id = db.Column(UuidField, db.ForeignKey('branch.id'), nullable=False) floor = db.Column(db.String(255), unique=False, nullable=True) number = db.Column(db.String(255), unique=False, nullable=True) note = db.Column(db.Text, unique=False, nullable=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class AttendanceReason(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) allowed = db.Column(db.Boolean, unique=False, default=True, nullable=False) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class AssignmentGroup(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) note = db.Column(db.Text, nullable=True, unique=False) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class RelationType(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) name = db.Column(db.String(255), unique=False, nullable=False) is_caregiver = db.Column(db.Boolean, unique=False, nullable=True) is_deleted = db.Column(db.Boolean, unique=False, nullable=True, default=False) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class Address(db.Model): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) line1 = db.Column(db.String(255), unique=False, nullable=True) line2 = db.Column(db.String(255), unique=False, nullable=True) line3 = db.Column(db.String(255), unique=False, nullable=True) city = db.Column(db.String(255), unique=False, nullable=True) postcode = db.Column(db.String(255), unique=False, nullable=True) province = db.Column(db.String(255), unique=False, nullable=True) phone = db.Column(db.String(255), unique=False, nullable=True) fax = db.Column(db.String(255), unique=False, nullable=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
class User(db.Model, Crud): id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True) username = db.Column(db.String(255), unique=True, nullable=False) email = db.Column(db.String(255), unique=True, nullable=True) # This is allowed for key based authentication aswell. When in bot mode its node allowed # When not in bot mode this is also allowed as user secret. password = db.Column(db.String(255), unique=False, nullable=True) secret = db.Column(UuidField, unique=True, nullable=False, default=uuid4) first_name = db.Column(db.String(255), unique=False, nullable=True) last_name = db.Column(db.String(255), unique=False, nullable=True) gender = db.Column(db.Enum(Gender), unique=False, default=Gender.unknown) is_bot = db.Column(db.Boolean(), default=False) is_blocked = db.Column(db.Boolean(), default=False) is_visible = db.Column(db.Boolean(), default=True) date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_updated = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) self.id = uuid4().hex self.secret = uuid4().hex def link_organisation(self, organisation: Organisation): link = UserOrganisation.link_obj(user_obj=self, organisation_obj=organisation) link.save() def check_secret(self, secret): # We check here as it can also be a str as the password is also a valid secret. if isinstance(secret, UUID): secret = str(secret.hex) if self.is_bot: return secret == str(self.secret.hex) else: return secret in [str(self.secret.hex), self.password] def api_keys(self, also_blocked=False): results = Authentication.query.filter( Authentication.user_id == self.id) if not also_blocked: results = results.filter(Authentication.is_blocked == False) return results.all() def generate_access_key(self, expires: relativedelta = None, note: str = None, save: bool = False) -> Authentication: auth_key = Authentication(note=note) if expires is None: auth_key.never_expire() else: auth_key.expires_in(expires) self.attach_access_key(self, auth_key) if save: auth_key.save() return auth_key def enable_bot(self): self.is_bot = True self.gender = Gender.unknown @classmethod def attach_access_key(cls, user: '******', key: Authentication, auto_save: bool = True): key.user_id = user.id if auto_save: key.save() @classmethod def search_user_secure(cls, id, secret) -> 'User': result = User.query\ .filter(User.id == id)\ .filter(or_(User.password == secret, User.secret == secret))\ .first() return result @classmethod def from_token(cls, token: str): return cls.query.join(Authentication).filter( Authentication.key == token).first() @classmethod def from_password(cls, password: str): return cls.query.filter(User.password == password).first()