This repository has been archived by the owner on May 1, 2023. It is now read-only.
/
models.py
205 lines (172 loc) · 7.56 KB
/
models.py
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
from datetime import datetime, timedelta
from hashlib import sha512, md5
from flamejam import db, filters
from flask import url_for, Markup
class Participant(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
password = db.Column(db.String(128))
email = db.Column(db.String(256), unique=True)
is_admin = db.Column(db.Boolean)
is_verified = db.Column(db.Boolean)
registered = db.Column(db.DateTime)
entries = db.relationship('Entry', backref='participant', lazy='dynamic')
ratings = db.relationship('Rating', backref='participant', lazy='dynamic')
comments = db.relationship('Comment', backref='participant', lazy='dynamic')
jams = db.relationship('Jam', backref='author', lazy='dynamic')
def __init__(self, username, password, email, is_admin=False,
is_verified=False):
self.username = username
self.password = sha512(password).hexdigest()
self.email = email
self.is_admin = is_admin
self.is_verified = is_verified
self.registered = datetime.utcnow()
def __repr__(self):
return '<User %r>' % self.username
def url(self):
return url_for('show_participant', username = self.username)
def getAvatar(self, size = 32):
return "http://www.gravatar.com/avatar/{0}?s={1}&d=identicon".format(md5(self.email.lower()).hexdigest(), size)
def getLink(self):
s = 12
return Markup('<a class="user" href="{0}"><img width="{2}" height="{2}" src="{3}" class="icon"/> {1}</a>'.format(
self.url(), self.username, s, self.getAvatar(s)))
class JamStatusCode(object):
ANNOUNCED = 0
RUNNING = 1
PACKAGING = 2
RATING = 3
FINISHED = 4
class JamStatus(object):
def __init__(self, code, time):
self.code = code
self.time = time
def __repr__(self):
t = filters.formattime(self.time)
d = filters.humandelta(datetime.utcnow(), self.time)
if self.code == JamStatusCode.ANNOUNCED:
return "Announced for {0}".format(t)
elif self.code == JamStatusCode.RUNNING:
return "Running until {0} ({1} left)".format(t, d)
elif self.code == JamStatusCode.PACKAGING:
return "Packaging until {0} ({1} left)".format(t, d)
elif self.code == JamStatusCode.RATING:
return "Rating until {0} ({1} left)".format(t, d)
elif self.code == JamStatusCode.PACKAGING:
return "Finished since {0}".format(t)
class Jam(db.Model):
id = db.Column(db.Integer, primary_key=True)
short_name = db.Column(db.String(16), unique=True)
long_name = db.Column(db.String(128), unique=True)
theme = db.Column(db.String(128))
announced = db.Column(db.DateTime) # Date on which the jam was announced
start_time = db.Column(db.DateTime) # The jam starts at this moment
end_time = db.Column(db.DateTime) # The jamming phase ends at this moment
packaging_deadline = db.Column(db.DateTime) # Packaging ends at this moment
rating_end = db.Column(db.DateTime) # Rating period ends and jam is over
entries = db.relationship('Entry', backref='jam', lazy='dynamic')
author_id = db.Column(db.Integer, db.ForeignKey('participant.id'))
def __init__(self, short_name, long_name, author, start_time, end_time=None,
packaging_deadline=None, voting_end=None, theme = ''):
self.short_name = short_name
self.long_name = long_name
self.start_time = start_time
self.theme = theme
author.jams.append(self)
if end_time is None:
self.end_time = start_time + timedelta(days=2)
else:
self.end_time = end_time
if packaging_deadline is None:
self.packaging_deadline = start_time + timedelta(days=3)
else:
self.packaging_deadline = packaging_deadline
if self.rating_end is None:
self.rating_end = start_time + timedelta(days=7)
else:
self.rating_end = rating_end
self.announced = datetime.utcnow()
def __repr__(self):
return '<Jam %r>' % self.short_name
def getStatus(self):
now = datetime.utcnow()
if self.start_time > now:
return JamStatus(JamStatusCode.ANNOUNCED, self.start_time)
elif self.end_time > now:
return JamStatus(JamStatusCode.RUNNING, self.end_time)
elif self.packaging_deadline > now:
return JamStatus(JamStatusCode.PACKAGING, self.packaging_deadline)
elif self.rating_end > now:
return JamStatus(JamStatusCode.RATING, self.rating_end)
else:
return JamStatus(JamStatusCode.FINISHED, self.end_time)
def getFullName(self):
return "{0} [{1}]".format(self.long_name, self.short_name)
def url(self):
return url_for('show_jam', jam_name = self.short_name)
class Entry(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
description = db.Column(db.Text)
posted = db.Column(db.DateTime)
jam_id = db.Column(db.Integer, db.ForeignKey('jam.id'))
participant_id = db.Column(db.Integer, db.ForeignKey('participant.id'))
ratings = db.relationship('Rating', backref='entry', lazy='dynamic')
comments = db.relationship('Comment', backref='entry', lazy='dynamic')
def __init__(self, name, description, jam, participant):
self.name = name
self.description = description
self.jam = jam
self.participant = participant
self.posted = datetime.utcnow()
def __repr__(self):
return '<Entry %r>' % self.name
class Rating(db.Model):
id = db.Column(db.Integer, primary_key=True)
score_graphics = db.Column(db.SmallInteger)
score_audio = db.Column(db.SmallInteger)
score_innovation = db.Column(db.SmallInteger)
score_humor = db.Column(db.SmallInteger)
score_fun = db.Column(db.SmallInteger)
score_overall = db.Column(db.SmallInteger)
text = db.Column(db.Text)
posted = db.Column(db.DateTime)
entry_id = db.Column(db.Integer, db.ForeignKey('entry.id'))
participant_id = db.Column(db.Integer, db.ForeignKey('participant.id'))
def __init__(self, score_graphics, score_audio, score_innovation,
score_humor, score_fun, score_overall, text, entry, participant):
self.score_graphics = score_graphics
self.score_audio = score_audio
self.score_innovation = score_innovation
self.score_humor = score_humor
self.score_fun = score_fun
self.score_overall = score_overall
self.text = text
self.entry = entry
self.participant = participant
self.posted = datetime.utcnow()
def __repr__(self):
return '<Rating %r>' % self.id
class Comment(db.Model):
id = db.Column(db.Integer, primary_key=True)
text = db.Column(db.Text)
posted = db.Column(db.DateTime)
entry_id = db.Column(db.Integer, db.ForeignKey('entry.id'))
participant_id = db.Column(db.Integer, db.ForeignKey('participant.id'))
def __init__(self, text, entry, participant):
self.text = text
self.entry = entry
self.participant = participant
self.posted = datetime.utcnow()
def __repr__(self):
return '<Comment %r>' % self.id
class Announcement(db.Model):
id = db.Column(db.Integer, primary_key = True)
text = db.Column(db.Text)
posted = db.Column(db.DateTime)
def __init__(self, text):
self.text = text
self.posted = datetime.utcnow()
def __repr__(self):
return '<Announcement %r>' % self.id