adds consumables to database
this adds a new consumables entity to the database and the possibility in the admin page to add these.
This commit is contained in:
parent
56757f29a1
commit
1072142a1b
|
@ -31,13 +31,15 @@ from rollerverbrauch.forms import \
|
||||||
SelectVehicleForm, \
|
SelectVehicleForm, \
|
||||||
DeleteAccountForm, \
|
DeleteAccountForm, \
|
||||||
DeletePitStopForm, \
|
DeletePitStopForm, \
|
||||||
EditPitstopForm
|
EditPitstopForm, \
|
||||||
|
CreateConsumableForm
|
||||||
|
|
||||||
from rollerverbrauch.entities import \
|
from rollerverbrauch.entities import \
|
||||||
User, \
|
User, \
|
||||||
Role, \
|
Role, \
|
||||||
Pitstop, \
|
Pitstop, \
|
||||||
Vehicle
|
Vehicle, \
|
||||||
|
Consumable
|
||||||
|
|
||||||
# required to activate the filters
|
# required to activate the filters
|
||||||
import rollerverbrauch.filters
|
import rollerverbrauch.filters
|
||||||
|
@ -65,6 +67,11 @@ def user_registered_sighandler(app, user, confirm_token):
|
||||||
@app.before_first_request
|
@app.before_first_request
|
||||||
def before_first_request():
|
def before_first_request():
|
||||||
db.create_all()
|
db.create_all()
|
||||||
|
print("""
|
||||||
|
=========================
|
||||||
|
TEST
|
||||||
|
========================
|
||||||
|
""")
|
||||||
user_datastore.find_or_create_role(name='admin', description='Role for administrators')
|
user_datastore.find_or_create_role(name='admin', description='Role for administrators')
|
||||||
user_datastore.find_or_create_role(name='user', description='Role for all users.')
|
user_datastore.find_or_create_role(name='user', description='Role for all users.')
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
@ -105,6 +112,7 @@ def index():
|
||||||
def edit_vehicle(vid):
|
def edit_vehicle(vid):
|
||||||
vehicle = Vehicle.query.filter(Vehicle.id == vid).first()
|
vehicle = Vehicle.query.filter(Vehicle.id == vid).first()
|
||||||
form = EditVehicleForm()
|
form = EditVehicleForm()
|
||||||
|
#form.consumables.choices = [(g.id, '%s (%s)' % (g.name, g.unit)) for g in Consumable.query.all()]
|
||||||
|
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
if not tools.check_vehicle_name_is_unique(current_user, form.name):
|
if not tools.check_vehicle_name_is_unique(current_user, form.name):
|
||||||
|
@ -115,8 +123,10 @@ def edit_vehicle(vid):
|
||||||
return redirect(url_for('get_account_page'))
|
return redirect(url_for('get_account_page'))
|
||||||
|
|
||||||
form.name.default = vehicle.name
|
form.name.default = vehicle.name
|
||||||
|
#form.consumables.default = [g.id for g in vehicle.consumables]
|
||||||
|
#print(form.consumables.name)
|
||||||
form.process()
|
form.process()
|
||||||
return render_template('editVehicleForm.html', form=form)
|
return render_template('editVehicleForm.html', form=form, vehicle=vehicle)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/account/delete_vehicle/<int:vid>', methods=['GET', 'POST'])
|
@app.route('/account/delete_vehicle/<int:vid>', methods=['GET', 'POST'])
|
||||||
|
@ -287,8 +297,24 @@ def get_manual():
|
||||||
@app.route('/admin', methods=['GET'])
|
@app.route('/admin', methods=['GET'])
|
||||||
@roles_required('admin')
|
@roles_required('admin')
|
||||||
def get_admin_page():
|
def get_admin_page():
|
||||||
g.data['users'] = User.query.all()
|
users = User.query.all()
|
||||||
return render_template('admin.html', data=g.data)
|
consumables = Consumable.query.all()
|
||||||
|
return render_template('admin.html', users=users, consumables=consumables)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/admin/create_consumable', methods=['GET', 'POST'])
|
||||||
|
@login_required
|
||||||
|
def create_consumable():
|
||||||
|
form = CreateConsumableForm()
|
||||||
|
|
||||||
|
if form.validate_on_submit():
|
||||||
|
new_consumable = Consumable(form.name.data, form.unit.data)
|
||||||
|
db.session.add(new_consumable)
|
||||||
|
db.session.commit()
|
||||||
|
tools.db_log_add(new_consumable)
|
||||||
|
return redirect(url_for('get_admin_page'))
|
||||||
|
|
||||||
|
return render_template('createConsumableForm.html', form=form)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/account', methods=['GET'])
|
@app.route('/account', methods=['GET'])
|
||||||
|
|
|
@ -5,6 +5,10 @@ roles_users = db.Table('roles_users',
|
||||||
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
|
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
|
||||||
db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
|
db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
|
||||||
|
|
||||||
|
vehicles_consumables = db.Table('vehicles_consumables',
|
||||||
|
db.Column('vehicle_id', db.Integer(), db.ForeignKey('vehicle.id')),
|
||||||
|
db.Column('consumable_id', db.Integer(), db.ForeignKey('consumable.id')))
|
||||||
|
|
||||||
|
|
||||||
class Role(db.Model, RoleMixin):
|
class Role(db.Model, RoleMixin):
|
||||||
id = db.Column(db.Integer(), primary_key=True)
|
id = db.Column(db.Integer(), primary_key=True)
|
||||||
|
@ -44,6 +48,11 @@ class Vehicle(db.Model):
|
||||||
pitstops = db.relationship(
|
pitstops = db.relationship(
|
||||||
'Pitstop'
|
'Pitstop'
|
||||||
)
|
)
|
||||||
|
consumables = db.relationship(
|
||||||
|
'Consumable',
|
||||||
|
secondary=vehicles_consumables,
|
||||||
|
backref=db.backref('consumes', lazy='dynamic')
|
||||||
|
)
|
||||||
__table_args__ = (db.UniqueConstraint('owner_id', 'name', name='_owner_name_uniq'),)
|
__table_args__ = (db.UniqueConstraint('owner_id', 'name', name='_owner_name_uniq'),)
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
|
@ -68,4 +77,18 @@ class Pitstop(db.Model):
|
||||||
self.costs = costs
|
self.costs = costs
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<Pitstop odometer="%r" litres="%r" date="%r" vehicle_id="%r">' % (self.odometer, self.litres, self.date, self.vehicle_id)
|
return '<Pitstop odometer="%r" litres="%r" date="%r" vehicle_id="%r">' % \
|
||||||
|
(self.odometer, self.litres, self.date, self.vehicle_id)
|
||||||
|
|
||||||
|
|
||||||
|
class Consumable(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
name = db.Column(db.String(255))
|
||||||
|
unit = db.Column(db.String(255))
|
||||||
|
|
||||||
|
def __init__(self, name, unit):
|
||||||
|
self.name = name
|
||||||
|
self.unit = unit
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '<Consumable name="%s" unit="%s" />' % (self.name, self.unit)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from flask_wtf import Form
|
from flask_wtf import Form
|
||||||
from wtforms import DateField, IntegerField, DecimalField, StringField, SelectField, SubmitField
|
from wtforms import DateField, IntegerField, DecimalField, StringField, SelectField, SubmitField, SelectMultipleField, BooleanField
|
||||||
from wtforms.validators import ValidationError, Length
|
from wtforms.validators import ValidationError, Length
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ def edit_costs_check(form, field):
|
||||||
if costs_check_required and field.data is not None and field.data <= 0:
|
if costs_check_required and field.data is not None and field.data <= 0:
|
||||||
raise ValidationError('Costs must be above 0.01 €.')
|
raise ValidationError('Costs must be above 0.01 €.')
|
||||||
|
|
||||||
|
|
||||||
class SelectVehicleForm(Form):
|
class SelectVehicleForm(Form):
|
||||||
vehicle = SelectField('Vehicle', coerce=int)
|
vehicle = SelectField('Vehicle', coerce=int)
|
||||||
submit = SubmitField(label='Do it!')
|
submit = SubmitField(label='Do it!')
|
||||||
|
@ -50,6 +51,7 @@ class CreatePitstopForm(Form):
|
||||||
|
|
||||||
class EditVehicleForm(Form):
|
class EditVehicleForm(Form):
|
||||||
name = StringField('Name', validators=[Length(1, 255)])
|
name = StringField('Name', validators=[Length(1, 255)])
|
||||||
|
#consumables = SelectMultipleField('Consumables')
|
||||||
submit = SubmitField(label='Do it!')
|
submit = SubmitField(label='Do it!')
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,3 +79,8 @@ class EditPitstopForm(Form):
|
||||||
self.last_pitstop = last_pitstop
|
self.last_pitstop = last_pitstop
|
||||||
|
|
||||||
|
|
||||||
|
class CreateConsumableForm(Form):
|
||||||
|
name = StringField('Name', validators=[Length(1, 255)])
|
||||||
|
unit = StringField('Unit', validators=[Length(1, 255)])
|
||||||
|
submit = SubmitField(label='Do it!')
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,52 @@
|
||||||
{% extends "layout.html" %}
|
{% extends "layout.html" %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="col-md-2" ></div>
|
<h3>Admin</h3>
|
||||||
<div class="col-md-8">
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Users</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<h3>Admin</h3>
|
We have {{ users|length }} users so far:
|
||||||
We have {{ data.users|length }} users so far:
|
|
||||||
<ul>
|
<ul>
|
||||||
{% for user in data.users %}
|
{% for user in users %}
|
||||||
<li>{{user.email}}</li>
|
<li>{{user.email}}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Consumables</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<a href="{{ url_for('create_consumable') }}" class="btn btn-primary " role="button">
|
||||||
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> create
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<table class="table table-striped table-bordered">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
Name
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Unit
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Actions
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
{% for consumable in consumables %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{ consumable.name }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ consumable.unit }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Loading…
Reference in New Issue