Example #1
0
class Response(BaseModel):
    __tablename__ = "responses"

    id = db.Column(
        UUID(as_uuid=True),
        server_default=sqlalchemy.text("gen_random_uuid()"),
        primary_key=True,
    )

    challenge = db.relationship("Challenge", backref="responses")
    challenge_id = db.Column(UUID(as_uuid=True),
                             db.ForeignKey("challenges.id"),
                             primary_key=True)

    user = db.relationship("User", backref="responses")
    user_id = db.Column(UUID(as_uuid=True),
                        db.ForeignKey("users.id"),
                        primary_key=True)

    video = db.relationship("Video",
                            backref=backref("response", uselist=False))
    video_id = db.Column(UUID(as_uuid=True),
                         db.ForeignKey("videos.id"),
                         nullable=True)

    created_at = db.Column(db.DateTime(timezone=True),
                           server_default=func.now(),
                           nullable=False)
    updated_at = db.Column(
        db.DateTime(timezone=True),
        server_default=func.now(),
        onupdate=datetime.utcnow,
        nullable=False,
    )
Example #2
0
class Challenge(BaseModel):
    __tablename__ = "challenges"
    __table_args__ = (db.Index("challenges_by_user_id_listed", "user_id",
                               "listed"), )

    id = db.Column(
        UUID(as_uuid=True),
        server_default=sqlalchemy.text("gen_random_uuid()"),
        primary_key=True,
    )

    title = db.Column(db.Unicode(length=255), nullable=False)
    instructions = db.Column(db.UnicodeText, nullable=False)
    grading_notes = db.Column(db.UnicodeText, nullable=False)
    listed = db.Column(db.Boolean, default=False, nullable=False, index=True)

    user = db.relationship("User", backref="challenges")
    user_id = db.Column(UUID(as_uuid=True), db.ForeignKey("users.id"))

    video = db.relationship("Video",
                            backref=backref("challenges", uselist=False))
    video_id = db.Column(UUID(as_uuid=True),
                         db.ForeignKey("videos.id"),
                         nullable=True)

    deleted_at = db.Column(db.DateTime(timezone=True), nullable=True)
    created_at = db.Column(db.DateTime(timezone=True),
                           server_default=func.now(),
                           nullable=False)
    updated_at = db.Column(
        db.DateTime(timezone=True),
        server_default=func.now(),
        onupdate=datetime.utcnow,
        nullable=False,
    )
Example #3
0
class Image(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    path = db.Column(db.String)
    url = db.Column(db.String)
    ext = db.Column(db.String)
    report_id = db.Column(db.Integer,
                          db.ForeignKey('report.id'),
                          nullable=False)

    @classmethod
    def from_arr(cls, arr, report_id):
        arr = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR)

        image = cls(report_id=report_id)
        db.session.add(image)
        db.session.commit()

        ext = '.jpg'
        file_id = uuid.uuid4().int
        filename = str(file_id) + ext

        abs_fpath = os.path.join(app.config['MEDIA_FOLDER'], filename)
        cv2.imwrite(abs_fpath, arr)

        rel_path = os.path.join(os.path.basename(app.config['MEDIA_FOLDER']),
                                filename)
        url = os.path.join('image', str(image.id))

        image.path = rel_path
        image.url = url
        image.ext = ext
        db.session.commit()

        return image
Example #4
0
class MentorStat(db.Model):
    __tablename__ = 'mentorstats'

    id = db.Column(db.Integer, primary_key=True)
    id_mentor = db.Column(db.Integer,
                          db.ForeignKey('mentors.id'),
                          nullable=False)
    rating = db.Column(db.Numeric(10, 2, asdecimal=False),
                       nullable=False,
                       server_default='0.00')
    totalappointments = db.Column(db.Integer,
                                  nullable=False,
                                  server_default='0')
    cancelledappointments = db.Column(db.Integer,
                                      nullable=False,
                                      server_default='0')

    #   relationship with 'mentors' table, Mentor Model Class
    mentor = db.relationship('Mentor',
                             backref=backref('mentorstat',
                                             lazy='joined',
                                             uselist=False),
                             lazy=True)

    def __init__(self, id_mentor):
        self.id_mentor = id_mentor
Example #5
0
class WishModel(BaseModel, db.Model):
    """
    Wish Model
    """

    __tablename__ = 'wishes'
    __table_args__ = (db.UniqueConstraint('name', 'owner_id', 'is_active'), )

    name = db.Column(db.String(128), nullable=False)
    price = db.Column(db.Numeric, nullable=False)
    description = db.Column(db.String(256), nullable=True)

    owner_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)

    def __init__(self,
                 name: str,
                 price: float,
                 owner_id: int,
                 description: str = None):
        self.name = name
        self.price = abs(price)
        self.owner_id = owner_id
        self.description = description
        super(WishModel, self).__init__()

    def __str__(self):
        return '{} - {} - $ {}'.format(self.id, self.name, self.price)
Example #6
0
class Benchmark(db.Model):

    __tablename__ = 'benchmark'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), index=True, unique=True)
    workout_type_id = db.Column(db.Integer, db.ForeignKey('workout_types.id'))
    workout_type = relationship('WorkoutTypes')
    score_type_id = db.Column(db.Integer, db.ForeignKey('score_types.id'))
    score_type = relationship('ScoreTypes')
    movements = relationship('Movement', secondary=benchmark_association_table)

    def __init__(self, name, workout_type, score_type):
        self.name = name
        self.workout_type = workout_type
        self.workout_type_id = workout_type.id
        self.score_type = score_type
        self.score_type_id = score_type.id
Example #7
0
class Friendship(db.Model):
    __tablename__ = 'friendship'

    id = db.Column(db.Integer, primary_key=True)
    requester_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    target_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    status = db.Column(db.Enum(FriendshipStatus),
                       default=FriendshipStatus.requested)

    def serialize_short(self):
        return {
            'user':
            User.query.filter(
                or_(User.id == self.target_id,
                    User.id == self.requester_id)).first().serialize_short(),
            'status':
            self.status.name
        }
Example #8
0
class SetRecord(Auditable):

    __tablename__ = 'set_record'
    id = db.Column(db.Integer, primary_key=True)
    set_number = db.Column(db.Integer)
    score = db.Column(db.Integer)
    lift_record_id = db.Column(db.Integer, db.ForeignKey('lift_record.id'))

    def __init__(self, set_number, score):
        self.set_number = set_number
        self.score = score
Example #9
0
class Lift(db.Model):

    __tablename__ = 'lift'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), index=True, unique=True)
    workout_type_id = db.Column(db.Integer, db.ForeignKey('workout_types.id'))
    workout_type = relationship('WorkoutTypes')
    score_type_id = db.Column(db.Integer, db.ForeignKey('score_types.id'))
    score_type = relationship('ScoreTypes')
    movements = relationship('Movement', secondary=lift_association_table)
    lift_records = relationship('LiftRecord', back_populates='lift')
    
    def __init__(self, name, workout_type, score_type):
        self.name = name
        self.workout_type = workout_type
        self.workout_type_id = workout_type.id
        self.score_type = score_type
        self.score_type_id = score_type.id

    def get_pr(self):
        return max(lift_records, key=lambda x: x.get_highest())
Example #10
0
class LiftRecord(Auditable):

    __tablename__ = 'lift_record'
    id = db.Column(db.Integer, primary_key=True)
    lift_id = db.Column(db.Integer, db.ForeignKey('lift.id'))
    lift = relationship('Lift', back_populates='lift_records')
    number_of_sets = db.Column(db.Integer)
    reps_per_set = db.Column(db.Integer)
    date = db.Column(db.DateTime, default = datetime.datetime.utcnow)
    sets = relationship('SetRecord')

    def __init__(self, number_of_sets, reps_per_set):
        self.number_of_sets = number_of_sets
        self.reps_per_set = reps_per_set

    def get_highest(self):
        return max(sets, key=lambda x: x.score)
Example #11
0
class User(Auditable):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), unique=True)
    affiliate_id = db.Column(db.Integer, db.ForeignKey(Affiliate.id))
    affiliate = relationship('Affiliate')
    password_hash = db.Column(db.String(128))

    def __init__(self, username, email, password, affiliate):
        self.username = username
        self.email = email
        self.password_hash = password
        self.affiliate = affiliate
        self.affiliate_id = affiliate.id


    def __repr__(self):
        return '<username {}>'.format(self.username)
Example #12
0
class Event(db.Model):
    __tablename__ = 'events'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    description = db.Column(db.Text)

    creator_id = db.Column(db.ForeignKey('user.id'))
    interests = db.relationship('Interest', secondary=event_interests)

    def serialize_short(self):
        return {
            'id':
            self.id,
            'title':
            self.title,
            'description':
            self.description,
            'interests':
            [interest.serialize_short() for interest in self.interests]
        }
Example #13
0
class FinancialSummary(db.Model):
    """
    Financial Summary model
    """

    __tablename__ = 'financial_summaries'

    id = db.Column(db.Integer, primary_key=True)
    company_id = db.Column(db.Integer, db.ForeignKey('company_profiles.id'))
    capital_currency = db.Column(db.String(50))
    market_cap = db.Column(db.BigInteger)
    par_value = db.Column(db.BigInteger)
    equity = db.Column(db.BigInteger)
    listing_volume = db.Column(db.BigInteger)
    listed_date = db.Column(db.DateTime)
    initial_listed_price = db.Column(db.BigInteger)
    created_at = db.Column(db.DateTime(timezone=True),
                           server_default=func.now())
    company = db.relationship('CompanyProfile',
                              uselist=False,
                              backref='financial_summary')

    def __repr__(self):
        return 'company_id : {}'.format(self.company_id)
Example #14
0
class Mentor(db.Model):
    __tablename__ = 'mentors'

    id = db.Column(db.Integer, primary_key=True)
    id_project42 = db.Column(db.Integer,
                             db.ForeignKey('projects.id_project42'),
                             nullable=False)
    id_user42 = db.Column(db.Integer,
                          db.ForeignKey('users.id_user42'),
                          nullable=False)
    finalmark = db.Column(db.Integer, nullable=False, server_default='0')
    abletomentor = db.Column(db.Boolean,
                             nullable=False,
                             server_default=sa.sql.expression.false())
    last_appointment = db.Column(db.DateTime(timezone=True))
    active = db.Column(db.Boolean,
                       nullable=False,
                       server_default=sa.sql.expression.false())
    started_at = db.Column(db.DateTime(timezone=True),
                           nullable=False,
                           server_default=sa.func.now())

    #   relationship with 'Appointments' table, Appointment Model Class
    appointments = db.relationship('Appointment',
                                   backref=backref('mentor', lazy='joined'),
                                   lazy=True)

    def __init__(self, id_project42, id_user42, finalmark):
        self.id_project42 = id_project42
        self.id_user42 = id_user42
        self.finalmark = 0 if finalmark is None else finalmark

    @classmethod
    def queryAll(cls):
        query = cls.query.all()
        if not query:
            return None, "No mentors exist"
        return mentors_schema.dump(query).data, None

    @classmethod
    def queryById(cls, mentorId):
        query = cls.query.filter_by(id=mentorId).first()
        if not query:
            return None, "No mentor with id {} was found".format(mentorId)
        return mentor_schema.dump(query).data, None

    @classmethod
    def queryManyByProject(cls, id):
        query = cls.query.filter_by(id_project42=id).all()
        if not query:
            return None, "No mentors for project {}".format(id)
        return mentors_schema.dump(query).data, None

    @classmethod
    def queryManyByUser(cls, id):
        query = cls.query.filter_by(id_user42=id).all()
        if not query:
            return None, "No mentors for project {}".format(id)
        return mentors_schema.dump(query).data, None

    @classmethod
    def queryByFilter(cls, **kwargs):
        query = cls.query.filter_by(**kwargs).first()
        if not query:
            return None, "No mentor found"
        return mentor_schema.dump(query).data, None

    @classmethod
    def queryManyByFilter(cls, **kwargs):
        query = cls.query.filter_by(**kwargs).all()
        if not query:
            return None, "No mentors found"
        return mentors_schema.dump(query).data, None
Example #15
0
class User(BaseModel):
    __tablename__ = "users"

    id = db.Column(
        UUID(as_uuid=True),
        server_default=sqlalchemy.text("gen_random_uuid()"),
        primary_key=True,
    )
    full_name = db.Column(db.Unicode(255), nullable=False)
    email = db.Column(db.String(255), unique=True, nullable=False)
    _password = db.Column("password", db.String(255), nullable=False)

    role = db.Column(
        db.String(255),
        db.ForeignKey("roles.id", name="fk_user_role"),
        default="user",
        nullable=False,
    )

    created_at = db.Column(db.DateTime(timezone=True),
                           server_default=func.now(),
                           nullable=False)
    updated_at = db.Column(
        db.DateTime(timezone=True),
        server_default=func.now(),
        onupdate=datetime.utcnow,
        nullable=False,
    )

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

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

    def check_password(self, password):
        return bcrypt.check_password_hash(self.password, password)

    def create_access_token_with_claims(
            self, expires_minutes=settings["JWT_EXPIRATION_MINUTES"]):
        claims = {"role": self.role}
        return create_access_token(
            identity=self.id,
            user_claims=claims,
            expires_delta=timedelta(minutes=expires_minutes),
        )

    def create_refresh_token(
            self, expires_hours=settings["JWT_REFRESH_EXPIRATION_HOURS"]):
        return create_refresh_token(
            identity=self.id, expires_delta=timedelta(hours=expires_hours))

    @staticmethod
    def get_or_create_super_admin():
        user = User.where(email="*****@*****.**").one_or_none()
        if not user:
            user = User.create(
                full_name="Super Admin",
                email="*****@*****.**",
                password="******",
                role=Role.of("super_admin"),
            )

        return user

    def __repr__(self):
        return f"<User {self.email}>"
Example #16
0
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(5))
    label = db.Column(db.String(64), index=True, unique=True)
    standard = db.Column(db.String(64))
    load_measurement = db.Column(db.Enum(MeasurementEnum))

    def __init__(self, code, label, load=None):
        self.code = code
        self.label = label
        self.load_measurement = load

    def __repr__(self):
        return '<id {}>'.format(self.id)

lift_association_table = db.Table('lift_association', db.Model.metadata,
    db.Column('lift_id', db.Integer, db.ForeignKey('lift.id')),
    db.Column('movement_id', db.Integer, db.ForeignKey('movement.id'))
)

benchmark_association_table = db.Table('benchmark_association', db.Model.metadata,
    db.Column('benchmark_id', db.Integer, db.ForeignKey('benchmark.id')),
    db.Column('movement_id', db.Integer, db.ForeignKey('movement.id'))
)

custom_wod_association_table = db.Table('custom_workout_association', db.Model.metadata,
    db.Column('custom_workout_id', db.Integer, db.ForeignKey('custom_workout.id')),
    db.Column('movement_id', db.Integer, db.ForeignKey('movement.id'))
)

class Lift(db.Model):
Example #17
0
from api.app import db


class FriendshipStatus(Enum):
    requested = 'requested'
    accepted = 'accepted'
    accepted_second_level = 'accepted_second_level'
    second_level = 'second_level'


user_interests = db.Table(
    'users_interests',
    db.Column('user_id',
              db.Integer,
              db.ForeignKey('user.id'),
              primary_key=True),
    db.Column('interests_id',
              db.Integer,
              db.ForeignKey('interests.id'),
              primary_key=True))


class Friendship(db.Model):
    __tablename__ = 'friendship'

    id = db.Column(db.Integer, primary_key=True)
    requester_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    target_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    status = db.Column(db.Enum(FriendshipStatus),
                       default=FriendshipStatus.requested)
Example #18
0
class Appointment(db.Model):
	__tablename__ = 'appointments'

	id = db.Column(db.Integer, primary_key=True)
	id_mentor = db.Column(db.Integer, db.ForeignKey('mentors.id'), nullable=False) 
	id_user = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
	start_time = db.Column(db.DateTime)
	feedback = db.Column(db.Text)
	rating = db.Column(db.Numeric(10, 2, asdecimal=False), nullable=False, server_default='0.00')
	status = db.Column(db.Integer, nullable=False, server_default='2')

	def __init__(self, id_mentor, id_user, feedback=""):
		self.id_mentor = id_mentor
		self.id_user = id_user
		self.feedback = feedback

	#   Creates an appointment for given user and mentor
	#   Sets up an appointment 15 minutes from actual date
	@classmethod
	def createAppointment(cls, mentorId, userId):
		data = {"id_mentor": mentorId, "id_user": userId}
		newappointment, error = appointment_schema.load(data)
		if error:
			return None, error
		#creates an appointment 15 minutes ahead from creation
		newappointment.start_time = datetime.now() + timedelta(minutes=15)
		db.session.add(newappointment)
		db.session.commit()
		return appointment_schema.dump(newappointment).data, None

	@classmethod
	def queryCountProjectAppointmentsbyUser(cls, projectId, userId):
		from api.models import Mentor
		dateObject = datetime.now().date()
		today = datetime(dateObject.year, dateObject.month, dateObject.day)
		appointmentCount = cls.query.join(Mentor, cls.id_mentor == Mentor.id).filter(Mentor.id_project42 == projectId, cls.id_user == userId, cls.start_time > today).count()
		return appointmentCount

	 #   Query one appointment with the given 'id' parameter
	@classmethod
	def queryById(cls, appointmentId):
		query = cls.query.filter_by(id=appointmentId).first()
		if not query:
			return None, "No appointment with id {} was found".format(appointmentId)
		return appointment_schema.dump(query).data, None

	#   Query all appointments with the given parameters for a user (mentee) perspective
	@classmethod
	def queryManyAsUser(cls, userId):
		query = cls.query.filter(cls.id_user==userId).all()
		if not query:
			return None, "No appointments for user {}".format(userId)
		return appointments_schema.dump(query).data, None

	#   Query all appointments with the given parameters from a mentor perspective
	@classmethod
	def queryManyAsMentor(cls, userId):
		from api.models import Mentor
		query = cls.query.join(Mentor, cls.id_mentor == Mentor.id).filter(Mentor.id_user42 == userId).all()
		if not query:
			return None, "No appointments to mentor for user {}".format(userId)
		return appointments_schema.dump(query).data, None

	#   Query multiple *PENDING* appointments with the given parameters from a user perspective
	@classmethod
	def queryManyPendingAsUser(cls, userId):
		query = cls.query.filter(cls.id_user==userId, cls.status == 2).all()
		if not query:
			return None, "No pending appointments requested by user {}".format(userId)
		return appointments_schema.dump(query).data, None

	#   Query multiple *PENDING* appointments with the given parameters from a mentor perspective
	@classmethod
	def queryManyPendingAsMentor(cls, userId):
		from api.models import Mentor, User
		query = cls.query.join(Mentor).join(User, Mentor.id_user42==User.id_user42).filter(Mentor.id_user42 == userId, cls.status == 2).all()
		#query = cls.query.join(Mentor, cls.id_mentor == Mentor.id).filter(Mentor.id_user42 == userId, cls.status == 2).all()
		query = cls.query.join(Mentor)
		if not query:
			return None, "No pending appointments to mentor for user {}".format(userId)
		return appointments_schema.dump(query).data, None
Example #19
0
class DriverModel(db.Model):
    __tablename__ = 'drivers'

    id = db.Column(db.Integer, primary_key=True, index=True)
    first_name = db.Column(db.String(64))
    last_name = db.Column(db.String(64), unique=True, index=True)
    number = db.Column(db.Integer, unique=True)
    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
    team = db.relationship('TeamModel')
    country = db.Column(db.String(64))
    podium = db.Column(db.Integer, default=0)
    points = db.Column(db.Integer, default=0)
    championships = db.Column(db.Integer, default=0)
    birthday = db.Column(db.DateTime)

    def __init__(self, first_name, last_name, number, team_id, country,
                 podium=0,
                 points=0,
                 championships=0,
                 birthday=date(1990, 1, 1)):
        self.first_name = first_name
        self.last_name = last_name
        self.number = number
        self.team_id = team_id
        self.country = country
        self.podium = podium
        self.points = points
        self.championships = championships
        self.birthday = birthday

    def json(self):
        return {
            'id': self.id,
            'name': "{} {}".format(self.first_name, self.last_name),
            'number': self.number,
            'team_id': self.team_id,
            'country': self.country,
            'podiums': self.podium,
            'points': self.points,
            'championships': self.championships,
            'birthday': '{0.month}/{0.day}/{0.year}'.format(self.birthday),
        }

    @classmethod
    def find_by_id(cls, _id):
        return cls.query.filter_by(id=_id).first()

    @classmethod
    def find_by_number(cls, number):
        return cls.query.filter_by(number=number).first()

    @classmethod
    def find_all(cls):
        return cls.query.all()

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    @db_check_or_return_500
    def delete_from_db(self):
        db.session.delete(self)
        db.session.commit()
Example #20
0
class Report(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    reporter_id = db.Column(db.Integer)
    timestamp = db.Column(db.Integer)
    longitude = db.Column(db.Float)
    latitude = db.Column(db.Float)
    report_type = db.Column(db.String)
    description = db.Column(db.String)
    video_id = db.Column(db.Integer, db.ForeignKey('video.id'))
    video = db.relationship('Video', backref='report', uselist=False)
    images = db.relationship('Image', backref='report')
    analysis_complete = db.Column(db.Boolean, default=False)
    car_color = db.Column(db.String)
    probability = db.Column(db.Integer)
    profile_id = db.Column(db.Integer, db.ForeignKey('profile.id'))

    def __init__(self,
                 reporter_id,
                 report_type,
                 timestamp,
                 longitude,
                 latitude,
                 analysis_complete=False,
                 video_id=None):
        self.reporter_id = reporter_id
        self.report_type = report_type
        self.timestamp = timestamp
        self.longitude = longitude
        self.latitude = latitude
        self.analysis_complete = analysis_complete
        self.video_id = video_id

    @staticmethod
    def validate_json(data):
        missing = []
        if 'user_id' not in data:
            missing.append('user_id')
        if 'timestamp' not in data:
            missing.append('timestamp')
        if 'report_type' not in data:
            missing.append('report_type')
        if 'location' not in data:
            missing.append('location')
        if 'longitude' not in data.get('location'):
            missing.append('longitude')
        if 'latitude' not in data.get('location'):
            missing.append('latitude')

        if len(missing):
            return False, missing
        else:
            return True, None

    def to_dict(self):
        obj = {}

        obj['id'] = self.id
        obj['reporter_id'] = self.reporter_id
        obj['timestamp'] = self.timestamp
        obj['location'] = {'lat': self.longitude, 'lng': self.latitude}
        obj['video_url'] = self.video.url if self.video is not None else ''
        obj['image_urls'] = [image.url for image in self.images]
        obj['analysis_complete'] = self.analysis_complete
        obj['car_color'] = self.car_color if self.car_color is not None else ''
        obj['description'] = self.description if self.description is not None else ''
        obj['probability'] = self.probability

        return obj
Example #21
0
from api.app import db

event_interests = db.Table(
    'event_interests',
    db.Column('event_id',
              db.Integer,
              db.ForeignKey('events.id'),
              primary_key=True),
    db.Column('interests_id',
              db.Integer,
              db.ForeignKey('interests.id'),
              primary_key=True))


class Event(db.Model):
    __tablename__ = 'events'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    description = db.Column(db.Text)

    creator_id = db.Column(db.ForeignKey('user.id'))
    interests = db.relationship('Interest', secondary=event_interests)

    def serialize_short(self):
        return {
            'id':
            self.id,
            'title':
            self.title,
            'description':