Add enemy creator.

This commit is contained in:
2019-01-12 16:27:51 +01:00
parent 9df47d7bb6
commit 9aa3d4395b
5 changed files with 136 additions and 24 deletions

32
app.py
View File

@@ -213,12 +213,42 @@ def enemies():
'columns': [
('id', 'ID'),
('name', 'Enemy Name'),
('vol', 'Is Boss')
('boss', 'Is Boss')
],
'controls': [('edit', 'Edit')]
}
return render_template('enemies.html', model=model)
@app.route('/newenemy', methods=['GET'])
@authorize
def new_enemy(preselect_season=None):
sql, args = db.load_season()
db_seasons = db.query_db(sql, args, cls=models.Season)
db_seasons = sorted(db_seasons, key=lambda s: s.code)
view_seasons = [(s.id, f'{s.code} - {s.game}') for s in db_seasons]
view_seasons.insert(0, (None, 'No Season'))
model = {
'boss': True,
'seasons': view_seasons,
'select_season': preselect_season
}
return render_template('editenemy.html', model=model)
@app.route('/saveenemy', methods=['POST'])
@authorize
def save_enemy():
valid_enemy = models.Enemy.from_form(request.form)
sql, args = db.save_enemy(valid_enemy)
error = db.update_db(sql, args)
if 'continue' not in request.form:
return redirect('/enemies')
last_selection = valid_enemy.season_id
return new_enemy(preselect_season=last_selection)
if __name__ == '__main__':
app.run()

15
db.py
View File

@@ -126,7 +126,19 @@ def load_enemies(id=None):
return enemies
def save_season_query(season):
def save_enemy(enemy: models.Enemy):
if not enemy.id:
sql = 'insert into enemy values (?, ?, ?, ?)'
args = (None, enemy.name, enemy.boss, enemy.season_id)
else:
sql = 'update enemy ' \
'set name=?, boss=?, season_id=? ' \
'where id==?'
args = (enemy.name, enemy.boss, enemy.season_id)
return sql, args
def save_season_query(season: models.Season):
if not season.id:
sql = 'insert into season values (?, ?, ?, ?, ?, ?)'
args = (None,
@@ -156,3 +168,4 @@ def load_season(id=None):
args = (id, )
sql += ' order by season.start'
return sql, args

View File

@@ -52,6 +52,7 @@ class Enemy:
id: int
name: str
boss: bool
season_id: int
@classmethod
def from_form(cls, form):
@@ -63,11 +64,19 @@ class Enemy:
raise AttributeError(INVALID_STR.format('name'))
name = str(name)
boss = form.get('boss', '')
boss = form.get('boss', False)
if boss not in [True, False, 'True', 'False']:
raise AttributeError(INVALID_STR.format('boss'))
boss = bool(boss)
self = cls(id=id, name=name, boss=boss)
season = form.get('season', None)
if season not in ['None', None]:
try:
season = int(season)
except ValueError:
raise AttributeError(INVALID_STR.format('boss'))
self = cls(id=id, name=name, boss=boss, season_id=season)
return self

View File

@@ -47,27 +47,11 @@ create table if not exists enemy
constraint enemy_pk
primary key autoincrement,
name text not null,
boss integer not null
boss integer not null,
season_id integer,
foreign key (season_id) references season(id)
);
create unique index if not exists enemy_id_uindex
on enemy (id);
create table if not exists season_enemy
(
id integer not null
constraint season_enemy_pk
primary key autoincrement,
season_id integer
constraint season_enemy_season_id_fk
references season,
enemy_id integer
constraint season_enemy_enemy_id_fk
references enemy
);
create unique index if not exists season_enemy_id_uindex
on season_enemy (id);

76
templates/editenemy.html Normal file
View File

@@ -0,0 +1,76 @@
{% extends "base.html" %}
{% set active_page = "enemies" %}
{% block title %}Enemies{% endblock %}
{% block content %}
<form class="needs-validation" novalidate action="/saveenemy" method="post">
<div class="form-group">
<label for="id">ID</label>
<input name="id"
type="text"
class="form-control"
id="id"
value="{{ model['id'] }}"
readonly>
</div>
<div class="form-group">
<label for="season">Season</label>
<select name="season"
type="range"
class="form-control"
id="season">
{% for id, display in model.seasons %}
<option value="{{ id }}" {% if id == model.select_season %} selected {% endif %}>
{{ display }}
</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<label for="name">Enemy Name</label>
<input name="name"
type="text"
class="form-control"
id="name"
placeholder="Enter name..."
value="{{ model['game'] }}"
required>
</div>
<div class="form-group form-check">
<input name="boss"
type="checkbox"
class="form-check-input"
id="boss"
value="True"
{% if model['boss'] %}
checked
{% endif %}>
<label class="form-check-label" for="newPlayerAnon">This enemy is a boss</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
<button type="submit" class="btn btn-primary" name="continue" value="true">Submit and Continue</button>
</form>
<script>
// Example starter JavaScript for disabling form submissions if there are invalid fields
(function() {
'use strict';
window.addEventListener('load', function() {
// Fetch all the forms we want to apply custom Bootstrap validation styles to
let forms = document.getElementsByClassName('needs-validation');
// Loop over them and prevent submission
let validation = Array.prototype.filter.call(forms, function (form) {
form.addEventListener('submit', function (event) {
if (form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
}, false);
})();
</script>
{% endblock %}