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, \
|
||||
DeleteAccountForm, \
|
||||
DeletePitStopForm, \
|
||||
EditPitstopForm
|
||||
EditPitstopForm, \
|
||||
CreateConsumableForm
|
||||
|
||||
from rollerverbrauch.entities import \
|
||||
User, \
|
||||
Role, \
|
||||
Pitstop, \
|
||||
Vehicle
|
||||
Vehicle, \
|
||||
Consumable
|
||||
|
||||
# required to activate the filters
|
||||
import rollerverbrauch.filters
|
||||
|
@ -65,6 +67,11 @@ def user_registered_sighandler(app, user, confirm_token):
|
|||
@app.before_first_request
|
||||
def before_first_request():
|
||||
db.create_all()
|
||||
print("""
|
||||
=========================
|
||||
TEST
|
||||
========================
|
||||
""")
|
||||
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.')
|
||||
db.session.commit()
|
||||
|
@ -105,6 +112,7 @@ def index():
|
|||
def edit_vehicle(vid):
|
||||
vehicle = Vehicle.query.filter(Vehicle.id == vid).first()
|
||||
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 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'))
|
||||
|
||||
form.name.default = vehicle.name
|
||||
#form.consumables.default = [g.id for g in vehicle.consumables]
|
||||
#print(form.consumables.name)
|
||||
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'])
|
||||
|
@ -287,8 +297,24 @@ def get_manual():
|
|||
@app.route('/admin', methods=['GET'])
|
||||
@roles_required('admin')
|
||||
def get_admin_page():
|
||||
g.data['users'] = User.query.all()
|
||||
return render_template('admin.html', data=g.data)
|
||||
users = User.query.all()
|
||||
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'])
|
||||
|
|
|
@ -5,6 +5,10 @@ roles_users = db.Table('roles_users',
|
|||
db.Column('user_id', db.Integer(), db.ForeignKey('user.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):
|
||||
id = db.Column(db.Integer(), primary_key=True)
|
||||
|
@ -44,6 +48,11 @@ class Vehicle(db.Model):
|
|||
pitstops = db.relationship(
|
||||
'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'),)
|
||||
|
||||
def __init__(self, name):
|
||||
|
@ -68,4 +77,18 @@ class Pitstop(db.Model):
|
|||
self.costs = costs
|
||||
|
||||
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 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 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:
|
||||
raise ValidationError('Costs must be above 0.01 €.')
|
||||
|
||||
|
||||
class SelectVehicleForm(Form):
|
||||
vehicle = SelectField('Vehicle', coerce=int)
|
||||
submit = SubmitField(label='Do it!')
|
||||
|
@ -50,6 +51,7 @@ class CreatePitstopForm(Form):
|
|||
|
||||
class EditVehicleForm(Form):
|
||||
name = StringField('Name', validators=[Length(1, 255)])
|
||||
#consumables = SelectMultipleField('Consumables')
|
||||
submit = SubmitField(label='Do it!')
|
||||
|
||||
|
||||
|
@ -77,3 +79,8 @@ class EditPitstopForm(Form):
|
|||
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" %}
|
||||
|
||||
{% 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>
|
||||
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>
|
||||
{% for user in data.users %}
|
||||
{% for user in users %}
|
||||
<li>{{user.email}}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</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 %}
|
||||
|
|
Loading…
Reference in New Issue