Exemple #1
0
class UserGroupStudentClass(db.Model):
    __tablename__ = 'user_group_has_class'

    id = db.Column(UuidField,
                   unique=True,
                   nullable=False,
                   default=uuid4,
                   primary_key=True)

    userGroup_id = db.Column(UuidField, db.ForeignKey('user_group.id'))
    studentClass_id = db.Column(UuidField, db.ForeignKey('student_class.id'))

    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)

    userGroup = relationship(UserGroup,
                             backref=backref("classes",
                                             cascade="all, delete-orphan"))
    studentClass = relationship(StudentClass,
                                backref=backref("groups",
                                                cascade="all, delete-orphan"))
class UserAddress(db.Model):
    __tablename__ = 'user_has_address'

    id = db.Column(UuidField,
                   unique=True,
                   nullable=False,
                   default=uuid4,
                   primary_key=True)

    user_id = db.Column(UuidField, db.ForeignKey('user.id'))
    address_id = db.Column(UuidField, db.ForeignKey('address.id'))

    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)

    user = relationship(User,
                        backref=backref("addresses",
                                        cascade="all, delete-orphan"))
    address = relationship(Address,
                           backref=backref("users",
                                           cascade="all, delete-orphan"))
class UserBranch(db.Model):
    __tablename__ = 'user_has_branch'

    id = db.Column(UuidField,
                   unique=True,
                   nullable=False,
                   default=uuid4,
                   primary_key=True)

    user_id = db.Column(UuidField, db.ForeignKey('user.id'))
    branch_id = db.Column(UuidField, db.ForeignKey('branch.id'))

    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)

    user = relationship(User,
                        backref=backref("branches",
                                        cascade="all, delete-orphan"))
    branch = relationship(Branch,
                          backref=backref("users",
                                          cascade="all, delete-orphan"))
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)
Exemple #5
0
class GroupUser(db.Model):
    __tablename__ = 'group_has_user'

    id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True)

    user_id = db.Column(UuidField, db.ForeignKey('user.id'))
    userGroup_id = db.Column(UuidField, db.ForeignKey('user_group.id'))

    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)

    user = relationship(User, backref=backref("group", cascade="all, delete-orphan"))
    group = relationship(UserGroup, backref=backref("user", cascade="all, delete-orphan"))
Exemple #6
0
class UserOrganisation(db.Model, Crud):
    __tablename__ = 'user_has_organisation'

    id = db.Column(UuidField,
                   unique=True,
                   nullable=False,
                   default=uuid4,
                   primary_key=True)

    user_id = db.Column(UuidField, db.ForeignKey('user.id'))
    organisation_id = db.Column(UuidField, db.ForeignKey('organisation.id'))

    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)

    user = relationship('User',
                        backref=backref("organisations",
                                        cascade="all, delete-orphan"))
    organisation = relationship('Organisation',
                                backref=backref("users",
                                                cascade="all, delete-orphan"))

    @classmethod
    def find(cls, user_id, organisation_id) -> 'UserOrganisation':
        return cls.query\
            .filter(UserOrganisation.user_id == user_id)\
            .filter(UserOrganisation.organisation_id == organisation_id)\
            .first()

    @classmethod
    def link_obj(cls, user_obj: 'User',
                 organisation_obj: 'Organisation') -> 'UserOrganisation':
        return cls.link(user_id=user_obj.id,
                        organisation_id=organisation_obj.id)

    @classmethod
    def link(cls, user_id: str, organisation_id: str) -> 'UserOrganisation':
        return cls(user_id=user_id, organisation_id=organisation_id)

    @classmethod
    def unlink(cls, user_id: str, organisation_id: str):
        obj = cls.find(user_id, organisation_id=organisation_id)
        if obj is None:
            return False
        return obj.delete()
Exemple #7
0
class Role(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)

    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 Authentication(db.Model, Crud):
    key = db.Column(UuidField,
                    unique=True,
                    nullable=False,
                    default=uuid4,
                    primary_key=True)
    expiration = db.Column(db.DateTime, unique=False, nullable=True)

    note = db.Column(db.Text, unique=False, nullable=True)
    note_blocked = db.Column(db.Text, unique=False, nullable=True)

    is_blocked = db.Column(db.Boolean,
                           default=False,
                           nullable=False,
                           unique=False)

    user_id = db.Column(UuidField, db.ForeignKey('user.id'), nullable=False)

    date_created = db.Column(db.DateTime,
                             nullable=False,
                             default=datetime.utcnow)

    def expires_in(self, delta: relativedelta):
        self.expiration = datetime.now() + delta

    def never_expire(self):
        self.expires_in(relativedelta(years=100))

    @classmethod
    def validate(cls, token: str) -> bool:
        return bool(cls.query.filter_by(key=token).count())
class BranchAddress(db.Model):
    __tablename__ = 'branch_has_address'

    id = db.Column(UuidField,
                   unique=True,
                   nullable=False,
                   default=uuid4,
                   primary_key=True)

    branch_id = db.Column(UuidField, db.ForeignKey('branch.id'))
    address_id = db.Column(UuidField, db.ForeignKey('address.id'))

    is_current_address = db.Column(db.Boolean,
                                   unique=False,
                                   nullable=False,
                                   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)

    branch = relationship(Branch,
                          backref=backref("addresses",
                                          cascade="all, delete-orphan"))
    address = relationship(Address,
                           backref=backref("branches",
                                           cascade="all, delete-orphan"))
Exemple #10
0
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
Exemple #11
0
class UserRelation(db.Model):
    __tablename__ = 'user_has_relation'

    id = db.Column(UuidField, unique=True, nullable=False, default=uuid4, primary_key=True)

    student_id = db.Column(UuidField, db.ForeignKey('user.id'))
    relation_id = db.Column(UuidField, db.ForeignKey('user.id'))
    relationType_id = db.Column(UuidField, db.ForeignKey('relation_type.id'))

    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)

    student = relationship(User, foreign_keys=[student_id], backref=backref("relation", cascade="all, delete-orphan"))
    relation = relationship(User, foreign_keys=[relation_id], backref=backref("student", cascade="all, delete-orphan"))
    relationType = relationship(RelationType)
Exemple #12
0
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 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)
Exemple #14
0
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)
Exemple #15
0
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 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)
Exemple #17
0
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()