Pastebin
Paste #24103: No description
< previous paste - next paste>
Pasted by Anonymous Coward
#models.py
from sqlalchemy.dialects.postgresql import UUID
import uuid
from datetime import datetime
from hashlib import md5
from app import db, login
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
posts = db.relationship('Post', backref='author', lazy='dynamic')
about_me = db.Column(db.String(140))
last_seen = db.Column(db.DateTime, default=datetime.utcnow)
is_deleted = db.Column(db.Boolean, default=False)
def __repr__(self):
return '<User {}>'.format(self.username)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def avatar(self, size):
digest = md5(self.username.encode('utf-8')).hexdigest()
return 'https://www.gravatar.com/avatar/{}?d=identicon&s={}'.format(
digest, size)
@login.user_loader
def load_user(id):
return User.query.get(int(id))
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self):
return '<Post {}>'.format(self.body)
class ChallengeCategory(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
description = db.Column(db.String)
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
is_deleted = db.Column(db.Boolean, default=False)
challenges = db.relationship('Challenge', backref='category_challenge', lazy='dynamic')
def __repr__(self):
return f'<ChallengeCategory {self.name}>'
class ChallengeLevel(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
description = db.Column(db.String)
sort_key = db.Column(db.Integer)
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
is_deleted = db.Column(db.Boolean, default=False)
challenges = db.relationship('Challenge', backref='level_challenge', lazy='dynamic')
def __repr__(self):
return f'<ChallengeLevel {self.name}>'
class Challenge(db.Model):
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
is_deleted = db.Column(db.Boolean, default=False)
is_published = db.Column(db.Boolean, default=False)
name = db.Column(db.String)
instructions = db.Column(db.String)
hint = db.Column(db.String)
flag_hash = db.Column(db.String(128))
category_id = db.Column(db.Integer, db.ForeignKey('challenge_category.id'))
level_id = db.Column(db.Integer, db.ForeignKey('challenge_level.id'))
score = db.Column(db.Integer, default=0)
def get_category(self):
return ChallengeCategory.query.get(self.category_id)
def set_flag(self, flag):
self.flag_hash = generate_password_hash(flag)
def check_flag(self, flag):
return check_password_hash(self.flag_hash, flag)
def __repr__(self):
return f'<Challenge {self.name}>'
## templates/challenges.html
{% extends "base.html" %}
{% block content %}
<h1>Challenges</h1>
{% for challenge in challenges %}
<div class="container">
<div class="row">
<div class="col-lg-4 col-md-6 col-sm-6 mb-5">
<div class="card h-100">
<a href="{{ url_for("challenge", challenge_id=challenge.id) }}">
<img class="card-img-top" src="">
</a>
<div class="card-body">
<p>
{{ challenge.name }}
</p>
<p>
Category:
{{ challenge.category.name }}
</p>
</div>
</div>
<div class="card-footer text-center">
<a href="{{ url_for("challenge", challenge_id=challenge.id) }}">
Start challenge
</a>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</p>
{% endblock %}
New Paste
Go to most recent paste.