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.