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:
Joachim Lusiardi 2016-06-26 08:19:28 +02:00
parent 56757f29a1
commit 1072142a1b
4 changed files with 104 additions and 14 deletions

View File

@ -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'])

View File

@ -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)

View File

@ -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!')

View File

@ -1,18 +1,52 @@
{% extends "layout.html" %} {% extends "layout.html" %}
{% block body %} {% block body %}
<div class="col-md-2" ></div>
<div class="col-md-8">
<div class="panel panel-default">
<div class="panel-body">
<h3>Admin</h3> <h3>Admin</h3>
We have {{ data.users|length }} users so far: <div class="panel panel-default">
<div class="panel-heading">Users</div>
<div class="panel-body">
We have {{ 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 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> </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 %}