First Commit

This commit is contained in:
Michał Gdula 2023-04-25 21:43:23 +01:00
parent 7efaf276e4
commit fda7ff28dd
19 changed files with 735 additions and 0 deletions

12
server/__init__.py Normal file
View file

@ -0,0 +1,12 @@
from flask import Flask
from server.extensions import db, migrate, cache
from server.views import blueprint
app = Flask(__name__)
app.config.from_pyfile('config.py')
db.init_app(app)
migrate.init_app(app, db)
cache.init_app(app)
app.register_blueprint(blueprint)

4
server/config.py Normal file
View file

@ -0,0 +1,4 @@
SECRET_KEY = 'dev'
SQLALCHEMY_DATABASE_URI = 'sqlite:///db.sqlite'
SQLALCHEMY_TRACK_MODIFICATIONS = False

7
server/extensions.py Normal file
View file

@ -0,0 +1,7 @@
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_caching import Cache
db = SQLAlchemy()
migrate = Migrate()
cache = Cache()

40
server/models.py Normal file
View file

@ -0,0 +1,40 @@
"""
Database models for the server
"""
from server.extensions import db
class Scores(db.Model):
"""
Post table
"""
__tablename__ = "scores"
id = db.Column(db.Integer, primary_key=True)
score = db.Column(db.Integer, nullable=False)
difficulty = db.Column(db.String, nullable=False)
achievements = db.Column(db.String, nullable=False)
scored_at = db.Column(
db.DateTime,
nullable=False,
server_default=db.func.now(),
)
class Users(db.Model):
"""
User table
"""
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
steam_uuid = db.Column(db.String, unique=True, nullable=False)
steam_name = db.Column(db.String, nullable=False)
creation_data = db.Column(
db.DateTime,
nullable=False,
server_default=db.func.now(),
)

64
server/views.py Normal file
View file

@ -0,0 +1,64 @@
from flask import Blueprint, jsonify, render_template_string
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField
from wtforms.validators import DataRequired
from server.models import Scores
from server.extensions import db, cache
blueprint = Blueprint('views', __name__)
class ScoreForm(FlaskForm):
score = IntegerField('Score', validators=[DataRequired()])
difficulty = StringField('Difficulty', validators=[DataRequired()])
achievements = StringField('Achievements', validators=[DataRequired()])
@blueprint.route('/', methods=['GET'])
@cache.cached(timeout=60)
def index():
top_scores = Scores.query.order_by(Scores.score.desc()).limit(10).all()
return render_template_string('''
<h1>Top Scores</h1>
<table>
<tr>
<th>Score</th>
<th>Difficulty</th>
<th>Achievements</th>
</tr>
{% for score in top_scores %}
<tr>
<td>{{ score.score }}</td>
<td>{{ score.difficulty }}</td>
<td>{{ score.achievements }}</td>
</tr>
{% endfor %}
</table>
<a href="/post">Post a score</a>
''', top_scores=top_scores)
@blueprint.route('/post', methods=['GET', 'POST'])
def post():
form = ScoreForm()
if form.validate_on_submit():
score = Scores(
score=form.score.data,
difficulty=form.difficulty.data,
achievements=form.achievements.data,
)
db.session.add(score)
db.session.commit()
return jsonify({'message': 'Success!'})
return render_template_string('''
<form method="POST" action="/post">
{{ form.csrf_token }}
{{ form.score.label }} {{ form.score(size=20) }}
{{ form.difficulty.label }} {{ form.difficulty(size=20) }}
{{ form.achievements.label }} {{ form.achievements(size=20) }}
<input type="submit" value="Go">
</form>
''', form=form)