-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
130 lines (101 loc) · 5.87 KB
/
models.py
File metadata and controls
130 lines (101 loc) · 5.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from datetime import datetime
db = SQLAlchemy()
class User(UserMixin, db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), unique=True, nullable=False)
display_name = db.Column(db.String(150), nullable=True)
email = db.Column(db.String(150), unique=True, nullable=False)
password = db.Column(db.String(200), nullable=False)
date_joined = db.Column(db.DateTime, default=datetime.utcnow)
location = db.Column(db.String(200), nullable=True) # Region
date_of_birth = db.Column(db.Date, nullable=True)
gender = db.Column(db.String(50), nullable=True)
profile_pic = db.Column(db.String(300), nullable=True) # Path to profile picture
bio = db.Column(db.Text, nullable=True) # Optional bio/description
notifications_enabled = db.Column(db.Boolean, default=True)
favorite_color = db.Column(db.String(7), default='#a8c7fa') # Material 3 seed color
videos = db.relationship('Video', backref='uploader', lazy=True)
@property
def age(self):
if not self.date_of_birth:
return None
today = datetime.utcnow().date()
return today.year - self.date_of_birth.year - ((today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day))
class Video(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
description = db.Column(db.Text, nullable=True)
filename = db.Column(db.String(300), nullable=False)
is_public = db.Column(db.Boolean, default=True)
thumbnail = db.Column(db.String(300), nullable=True)
category = db.Column(db.String(100), nullable=True)
tags = db.Column(db.String(500), nullable=True)
views = db.Column(db.Integer, default=0)
upload_date = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
resolutions = db.Column(db.String(200), nullable=True)
height = db.Column(db.Integer, nullable=True)
status = db.Column(db.String(20), default='ready') # processing, ready, failed
heatmap = db.Column(db.Text, default='[]') # JSON list of 100 ints
preview_images = db.Column(db.Text, nullable=True) # JSON list of filenames
captions = db.Column(db.String(300), nullable=True) # Path to .vtt file
auto_captions = db.Column(db.String(300), nullable=True) # Path to auto-generated .vtt file
is_short = db.Column(db.Boolean, default=False)
class Playlist(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
is_public = db.Column(db.Boolean, default=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user = db.relationship('User', backref='playlists', lazy=True)
videos = db.relationship('PlaylistVideo', backref='playlist', lazy=True, cascade="all, delete-orphan")
class PlaylistVideo(db.Model):
id = db.Column(db.Integer, primary_key=True)
playlist_id = db.Column(db.Integer, db.ForeignKey('playlist.id'), nullable=False)
video_id = db.Column(db.Integer, db.ForeignKey('video.id'), nullable=False)
added_at = db.Column(db.DateTime, default=datetime.utcnow)
video = db.relationship('Video', lazy=True)
class WatchLater(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
video_id = db.Column(db.Integer, db.ForeignKey('video.id'), nullable=False)
added_at = db.Column(db.DateTime, default=datetime.utcnow)
user = db.relationship('User', backref='watch_later', lazy=True)
video = db.relationship('Video', lazy=True)
class Subscription(db.Model):
id = db.Column(db.Integer, primary_key=True)
subscriber_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
channel_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class Reaction(db.Model):
id = db.Column(db.Integer, primary_key=True)
video_id = db.Column(db.Integer, db.ForeignKey('video.id'), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
type = db.Column(db.Integer, nullable=False) # 1 for like, -1 for dislike
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class Comment(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
date_posted = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
video_id = db.Column(db.Integer, db.ForeignKey('video.id'), nullable=False)
user = db.relationship('User', backref='comments', lazy=True)
video = db.relationship('Video', backref=db.backref('comments', lazy=True, cascade="all, delete-orphan"))
class ViewHistory(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
video_id = db.Column(db.Integer, db.ForeignKey('video.id'), nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
user = db.relationship('User', backref='view_history', lazy=True)
video = db.relationship('Video', backref='view_events', lazy=True)
class Notification(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
message = db.Column(db.String(500), nullable=False)
link = db.Column(db.String(500), nullable=True)
is_read = db.Column(db.Boolean, default=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user = db.relationship('User', backref='notifications', lazy=True)