Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1from sqlalchemy import CheckConstraint 

2import uuid 

3 

4from src import db, bcrypt 

5from src.utils import GUID 

6 

7 

8class MetaProfileContentModel(db.Model): 

9 """ 

10 MetaProfileContent Model for storing metadata between profile and content 

11 """ 

12 __tablename__ = "meta_profile_content" 

13 

14 profile_id = db.Column(db.Integer, db.ForeignKey( 

15 "profile.profile_id", ondelete="CASCADE"), primary_key=True) 

16 content_id = db.Column(db.Integer, db.ForeignKey( 

17 "content.content_id", ondelete="CASCADE"), primary_key=True) 

18 rating = db.Column(db.Integer, CheckConstraint( 

19 "rating <= 5 and rating >= 0"), default=None) 

20 last_rating_date = db.Column(db.DateTime, default=None) 

21 review_see_count = db.Column(db.Integer, default=0) 

22 last_review_see_date = db.Column(db.DateTime, default=None) 

23 # can be play_count, watch_count, num_watched_episodes 

24 count = db.Column(db.Integer, default=0) 

25 last_count_increment = db.Column(db.DateTime, default=None) 

26 

27 

28LikedGenreProfileModel = db.Table("liked_genres_profile", 

29 db.Column("profile_id", db.Integer, db.ForeignKey( 

30 "profile.profile_id", ondelete="CASCADE"), primary_key=True), 

31 db.Column("genre_id", db.Integer, db.ForeignKey( 

32 "genre.genre_id", ondelete="CASCADE"), primary_key=True) 

33 ) 

34 

35 

36class ProfileModel(db.Model): 

37 """ 

38 Profile Model for storing profile related details 

39 """ 

40 __tablename__ = "profile" 

41 

42 profile_id = db.Column(db.Integer, primary_key=True, 

43 autoincrement=True, index=True) 

44 uuid = db.Column(GUID(), default=uuid.uuid4, unique=True) 

45 profilename = db.Column(db.String(45), nullable=False) 

46 user_id = db.Column(db.Integer, db.ForeignKey( 

47 "user.user_id", ondelete="CASCADE"), nullable=False) 

48 

49 # Loaded immediately after loading Profile, but when querying multiple profiles, you will not get additional queries. 

50 meta_profile_contents = db.relationship( 

51 "MetaProfileContentModel", lazy="subquery") 

52 

53 liked_genres = db.relationship( 

54 "GenreModel", secondary=LikedGenreProfileModel, lazy="dynamic") 

55 

56 def __repr__(self): 

57 return f"<Profile {self.profilename}>"