Beispiel #1
0
class Report(db.Model):
    """[Report]
    Parameters
    ----------
    date: [datetime]
        Date of report.
    data: [JSON]
        Actual report data.
    model: [Model]
        Classifier for which the report is generated.

    Relationships
    -------------
    model: [Model]
        Many to one.
        The model for which the report was generated.
    """
    __tablename__ = "report"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    date = db.Column(db.DateTime, default=datetime.datetime.now)

    model_id = db.Column(db.Integer, db.ForeignKey("classifier.id"))
    model = db.relationship("Classifier", back_populates="reports")

    data = db.Column(db.JSON)

    def __init__(self, date, model):
        self.date = date
        self.model = model

    def __repr__(self):
        return (f"Report for {self.model}, " f"generated on {self.date}.")
Beispiel #2
0
class Classifier(db.Model):
    """[Classifier]
    Parameters
    ----------
    name: [string]
        User-chosen name that will show in a model-selector later on.
        **Note**: Use werkzeug.utils.secure_filename
        https://werkzeug.palletsprojects.com/en/1.0.x/utils/#werkzeug.utils.secure_filename
    upload_date: [datetime]
        Upload date.
    file_path: [string]
        Set by the server. File path for the model on the file system.

    Relationships
    -------------
    user: [User]
        Many to one.
        User that uploaded the model.
        **Note**: Shouldn't be nullable.
    reports: [Report]
        One to many.
        All reports generated for the model.
    """
    __tablename__ = "classifier"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    name = db.Column(db.String(50), unique=False, nullable=True)
    upload_date = db.Column(db.DateTime, default=datetime.datetime.now)

    file_path = db.Column(db.String(50), unique=True, nullable=False)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship("User", back_populates="models")

    reports = db.relationship("Report", back_populates="model")

    def __init__(self, name, file_path, user):
        self.name = name
        self.file_path = file_path

        self.user = user

    def __repr__(self):
        return (f"Classifier('{self.name}') for {self.user},"
                f" uploaded on {self.upload_date}.")
Beispiel #3
0
class Report(db.Model):
    """[Report]
    Parameters
    ----------
    date: [datetime]
        Date of report.
    data: [JSON]
        Actual report data.
    model: [Model]
        Classifier for which the report is generated.
    user: [User]
        User for whom the report is generated.
        This is needed in case a pre-trained classifier
        is selected (otherwise, we can get the user from
        the model).

    Relationships
    -------------
    model: [Model]
        Many to one.
        The model for which the report was generated.
    """
    __tablename__ = "report"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    date = db.Column(db.DateTime, default=datetime.datetime.now)

    model_id = db.Column(db.Integer, db.ForeignKey("classifier.id"))
    model = db.relationship("Classifier", back_populates="reports")

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship("User", back_populates="reports")

    pretrained_classifier = db.Column(db.Integer, nullable=True)

    data = db.Column(db.JSON)

    def __init__(self,
                 date=datetime.datetime.now,
                 model=None,
                 pretrained_classifier=None):
        self.date = date
        self.model = model
        self.pretrained_classifier = pretrained_classifier

    def __repr__(self):
        if self.model:
            return (f"Report for {self.model}, " f"generated on {self.date}.")
        elif self.pretrained_classifier:
            return (f"Report for {self.pretrained_classifier.name}, "
                    f"generated on {self.date}.")
Beispiel #4
0
class User(db.Model, UserMixin):
    """[User]
    Parameters
    ----------
    username: [string]
        Unique username.
    email: [email]
        Unique email.
    image_file: [string]
        File path for the chosen profile picture.
        Default image is default.jpg.
    _password: [string]
        Hashed password.
        Extra functions are there to hash the password then store it.

    Relationships
    -------------
    models: [Model]
        One to many.
        Models uploaded by the user.
    reports: [Report]
        One to many.
        Reports generated by the user on pre-trained classifiers.
    """
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    username = db.Column(db.String(50), unique=True, nullable=False)
    email = db.Column(db.String(50), unique=True, nullable=False)

    image_file = db.Column(db.String(30),
                           nullable=False,
                           default='default.jpg')

    _password = db.Column(db.String(128), nullable=False)

    models = db.relationship("Classifier", back_populates="user")
    reports = db.relationship("Report", back_populates="user")

    def __repr__(self):
        return (f"User('{self.username}': '{self.email}')")

    @hybrid_property
    def password(self):
        return self._password

    @password.setter
    def password(self, password):
        self._password = bcrypt.generate_password_hash(password)

    def verify_password(self, password):
        return bcrypt.check_password_hash(self._password, password)

    @classmethod
    def __declare_last__(cls):
        # check_deliverability can be set to True
        # after the developer updated the release on PyPI.
        # https://github.com/xeBuz/Flask-Validator/issues/79
        ValidateEmail(User.email,
                      allow_smtputf8=True,
                      check_deliverability=True,
                      throw_exception=True,
                      message="The e-mail is invalid.")