2015-11-08 06:10:26 +00:00
|
|
|
from peewee import *
|
2016-07-11 22:27:53 +00:00
|
|
|
import bcrypt
|
2016-07-15 20:37:03 +00:00
|
|
|
import config
|
|
|
|
if config.production:
|
|
|
|
db = PostgresqlDatabase(config.database.database, user=config.database.user, password=config.database.password)
|
|
|
|
else:
|
|
|
|
db = SqliteDatabase("dev.db")
|
|
|
|
|
2015-11-08 06:10:26 +00:00
|
|
|
|
|
|
|
class BaseModel(Model):
|
|
|
|
class Meta:
|
|
|
|
database = db
|
|
|
|
|
2016-07-12 12:03:04 +00:00
|
|
|
class Team(BaseModel):
|
|
|
|
name = CharField(unique=True)
|
2016-07-12 20:53:28 +00:00
|
|
|
affiliation = CharField(null = True)
|
2016-07-12 12:03:04 +00:00
|
|
|
restricts = TextField(default="")
|
|
|
|
key = CharField(unique=True, index=True)
|
|
|
|
|
|
|
|
def solved(self, challenge):
|
|
|
|
return ChallengeSolve.select().where(ChallengeSolve.team == self, ChallengeSolve.challenge == challenge).count()
|
|
|
|
|
|
|
|
def eligible(self):
|
2016-07-12 19:26:19 +00:00
|
|
|
return all([member.eligible() for member in self.members]) and self.members.count() <= 3
|
2016-07-12 12:03:04 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def score(self):
|
|
|
|
challenge_points = sum([i.challenge.points for i in self.solves])
|
|
|
|
adjust_points = sum([i.value for i in self.adjustments])
|
|
|
|
return challenge_points + adjust_points
|
|
|
|
|
2016-07-11 00:01:00 +00:00
|
|
|
class User(BaseModel):
|
2016-07-12 12:03:04 +00:00
|
|
|
username = CharField(unique=True, index=True)
|
2016-07-12 20:02:51 +00:00
|
|
|
email = CharField(index=True)
|
2016-07-11 00:01:00 +00:00
|
|
|
email_confirmed = BooleanField(default=False)
|
|
|
|
email_confirmation_key = CharField()
|
2016-07-11 23:57:43 +00:00
|
|
|
password = CharField(null = True)
|
2016-07-12 14:24:19 +00:00
|
|
|
background = CharField()
|
2016-07-11 00:01:00 +00:00
|
|
|
country = CharField()
|
2016-07-11 23:57:43 +00:00
|
|
|
tshirt_size = CharField(null = True)
|
|
|
|
gender = CharField(null = True)
|
|
|
|
first_login = BooleanField(default=True)
|
|
|
|
restricts = TextField(default="")
|
2016-07-12 12:03:04 +00:00
|
|
|
team = ForeignKeyField(Team, related_name="members")
|
2016-07-12 20:02:51 +00:00
|
|
|
banned = BooleanField(default=False)
|
|
|
|
password_reset_token = CharField(null = True)
|
2016-07-13 10:08:46 +00:00
|
|
|
password_reset_expired = DateTimeField(null = True)
|
2016-07-11 00:01:00 +00:00
|
|
|
|
2016-07-11 22:27:53 +00:00
|
|
|
def setPassword(self, pw):
|
2016-07-11 23:57:43 +00:00
|
|
|
self.password = bcrypt.hashpw(pw.encode("utf-8"), bcrypt.gensalt())
|
2016-07-11 22:27:53 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
def checkPassword(self, pw):
|
2016-07-12 17:58:28 +00:00
|
|
|
return bcrypt.checkpw(pw.encode("utf-8"), self.password.encode("utf-8"))
|
2016-07-11 22:27:53 +00:00
|
|
|
|
2016-07-12 12:03:04 +00:00
|
|
|
def eligible(self):
|
2016-07-12 14:24:19 +00:00
|
|
|
return self.country == "ISL"
|
2015-11-08 06:10:26 +00:00
|
|
|
|
2016-07-12 20:01:54 +00:00
|
|
|
class UserAccess(BaseModel):
|
|
|
|
user = ForeignKeyField(User, related_name='accesses')
|
2015-11-08 06:10:26 +00:00
|
|
|
ip = CharField()
|
2015-11-29 19:01:22 +00:00
|
|
|
time = DateTimeField()
|
2015-11-08 06:10:26 +00:00
|
|
|
|
|
|
|
class Challenge(BaseModel):
|
|
|
|
name = CharField()
|
|
|
|
category = CharField()
|
2015-11-29 02:38:56 +00:00
|
|
|
author = CharField()
|
2015-11-08 06:10:26 +00:00
|
|
|
description = TextField()
|
|
|
|
points = IntegerField()
|
2015-12-03 23:18:00 +00:00
|
|
|
breakthrough_bonus = IntegerField(default=0)
|
|
|
|
enabled = BooleanField(default=True)
|
2016-04-24 04:20:28 +00:00
|
|
|
flag = TextField()
|
2015-11-08 06:10:26 +00:00
|
|
|
|
|
|
|
class ChallengeSolve(BaseModel):
|
|
|
|
team = ForeignKeyField(Team, related_name='solves')
|
|
|
|
challenge = ForeignKeyField(Challenge, related_name='solves')
|
|
|
|
time = DateTimeField()
|
|
|
|
|
2015-11-12 21:33:36 +00:00
|
|
|
class Meta:
|
|
|
|
primary_key = CompositeKey('team', 'challenge')
|
|
|
|
|
2015-11-08 06:10:26 +00:00
|
|
|
class ChallengeFailure(BaseModel):
|
|
|
|
team = ForeignKeyField(Team, related_name='failures')
|
|
|
|
challenge = ForeignKeyField(Challenge, related_name='failures')
|
|
|
|
attempt = CharField()
|
|
|
|
time = DateTimeField()
|
|
|
|
|
2015-11-29 19:01:22 +00:00
|
|
|
class NewsItem(BaseModel):
|
|
|
|
summary = CharField()
|
|
|
|
description = TextField()
|
|
|
|
|
|
|
|
class TroubleTicket(BaseModel):
|
|
|
|
team = ForeignKeyField(Team, related_name='tickets')
|
|
|
|
summary = CharField()
|
|
|
|
description = TextField()
|
|
|
|
active = BooleanField(default=True)
|
|
|
|
opened_at = DateTimeField()
|
|
|
|
|
|
|
|
class TicketComment(BaseModel):
|
|
|
|
ticket = ForeignKeyField(TroubleTicket, related_name='comments')
|
|
|
|
comment_by = CharField()
|
|
|
|
comment = TextField()
|
|
|
|
time = DateTimeField()
|
2015-11-12 21:33:36 +00:00
|
|
|
|
2015-11-29 19:01:22 +00:00
|
|
|
class Notification(BaseModel):
|
|
|
|
team = ForeignKeyField(Team, related_name='notifications')
|
|
|
|
notification = TextField()
|
2015-11-12 21:33:36 +00:00
|
|
|
|
2015-11-08 06:10:26 +00:00
|
|
|
class ScoreAdjustment(BaseModel):
|
|
|
|
team = ForeignKeyField(Team, related_name='adjustments')
|
|
|
|
value = IntegerField()
|
|
|
|
reason = TextField()
|
2015-11-12 21:33:36 +00:00
|
|
|
|
|
|
|
class AdminUser(BaseModel):
|
|
|
|
username = CharField()
|
|
|
|
password = CharField()
|
2016-05-05 01:18:52 +00:00
|
|
|
secret = CharField()
|