Merge branch 'issue_1' into 'development'

Handle vehicle name uniqueness

Vehicle names now must be only unique per owner, not globally.
Also errors are displayed to the forms on creation and edit of
vehicles.

See merge request !9
This commit is contained in:
Joachim Lusiardi 2016-05-16 18:49:39 +02:00
commit 227dc79e6b
4 changed files with 38 additions and 14 deletions

View File

@ -11,6 +11,9 @@ a folder that will serve as configuration directory and fill in the
information. The directory will be used as volume during container information. The directory will be used as volume during container
operation. operation.
## start database
`docker run --name pitstops_db -e MYSQL_ROOT_PASSWORD=$SOMESECUREPASSWORD$ -e MYSQL_DATABASE=pitstops -d mysql:latest`
## run in development ## run in development
Include the development version of the code as volume, so the app gets Include the development version of the code as volume, so the app gets
@ -22,3 +25,4 @@ debugging during development.
## run in production ## run in production
`docker run --name pitstops -d -v /data/pitstops/:/data -v /configs/pitstops/:/app/config -p 80:5000 rollerverbrauch` `docker run --name pitstops -d -v /data/pitstops/:/data -v /configs/pitstops/:/app/config -p 80:5000 rollerverbrauch`

View File

@ -21,11 +21,7 @@ app.config.from_object(__name__)
db = SQLAlchemy(app) db = SQLAlchemy(app)
mail = Mail(app) mail = Mail(app)
from rollerverbrauch.tools import \ import rollerverbrauch.tools as tools
VehicleStats, \
db_log_add, \
db_log_delete, \
db_log_update
from rollerverbrauch.forms import \ from rollerverbrauch.forms import \
CreatePitstopForm, \ CreatePitstopForm, \
@ -58,8 +54,8 @@ def user_registered_sighandler(app, user, confirm_token):
db.session.add(new_vehicle) db.session.add(new_vehicle)
user.vehicles.append(new_vehicle) user.vehicles.append(new_vehicle)
db.session.commit() db.session.commit()
db_log_add(user) tools.db_log_add(user)
db_log_add(new_vehicle) tools.db_log_add(new_vehicle)
@app.before_first_request @app.before_first_request
@ -88,9 +84,11 @@ def edit_vehicle(vid):
form = EditVehicleForm() form = EditVehicleForm()
if form.validate_on_submit(): if form.validate_on_submit():
if not tools.check_vehicle_name_is_unique(current_user, form.name):
return render_template('editVehicleForm.html', form=form)
vehicle.name = form.name.data vehicle.name = form.name.data
db.session.commit() db.session.commit()
db_log_update(vehicle) tools.db_log_update(vehicle)
return redirect(url_for('get_account_page')) return redirect(url_for('get_account_page'))
form.name.default = vehicle.name form.name.default = vehicle.name
@ -112,7 +110,7 @@ def delete_vehicle(vid):
if form.validate_on_submit(): if form.validate_on_submit():
db.session.delete(vehicle) db.session.delete(vehicle)
db.session.commit() db.session.commit()
db_log_delete(vehicle) tools.db_log_delete(vehicle)
return redirect(url_for('get_account_page')) return redirect(url_for('get_account_page'))
return render_template('deleteVehicleForm.html', form=form, vehicle=vehicle) return render_template('deleteVehicleForm.html', form=form, vehicle=vehicle)
@ -124,11 +122,14 @@ def create_vehicle():
form = EditVehicleForm() form = EditVehicleForm()
if form.validate_on_submit(): if form.validate_on_submit():
new_vehicle = Vehicle(form.name.data) vehicle_name = form.name.data
if not tools.check_vehicle_name_is_unique(current_user, form.name):
return render_template('createVehicleForm.html', form=form)
new_vehicle = Vehicle(vehicle_name)
db.session.add(new_vehicle) db.session.add(new_vehicle)
current_user.vehicles.append(new_vehicle) current_user.vehicles.append(new_vehicle)
db.session.commit() db.session.commit()
db_log_add(new_vehicle) tools.db_log_add(new_vehicle)
return redirect(url_for('get_account_page')) return redirect(url_for('get_account_page'))
return render_template('createVehicleForm.html', form=form) return render_template('createVehicleForm.html', form=form)
@ -170,7 +171,7 @@ def create_pit_stop_form(vid):
db.session.add(new_stop) db.session.add(new_stop)
vehicle.pitstops.append(new_stop) vehicle.pitstops.append(new_stop)
db.session.commit() db.session.commit()
db_log_add(new_stop) tools.db_log_add(new_stop)
return redirect(url_for('get_pit_stops', _anchor= 'v' + str(vehicle.id))) return redirect(url_for('get_pit_stops', _anchor= 'v' + str(vehicle.id)))
form.odometer.default = last_pitstop.odometer form.odometer.default = last_pitstop.odometer
@ -214,5 +215,5 @@ def get_account_page():
def get_statistics(): def get_statistics():
stats = [] stats = []
for vehicle in current_user.vehicles: for vehicle in current_user.vehicles:
stats.append(VehicleStats(vehicle)) stats.append(tools.VehicleStats(vehicle))
return render_template('statistics.html', data=stats) return render_template('statistics.html', data=stats)

View File

@ -40,10 +40,11 @@ class User(db.Model, UserMixin):
class Vehicle(db.Model): class Vehicle(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
owner_id = db.Column(db.Integer, db.ForeignKey('user.id')) owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
name = db.Column(db.String(255), unique=True) name = db.Column(db.String(255))
pitstops = db.relationship( pitstops = db.relationship(
'Pitstop' 'Pitstop'
) )
__table_args__ = (db.UniqueConstraint('owner_id', 'name', name='_owner_name_uniq'),)
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name

View File

@ -47,3 +47,21 @@ def db_log_delete(entity):
def db_log_update(entity): def db_log_update(entity):
logging.info('db_update: %s' % str(entity)) logging.info('db_update: %s' % str(entity))
def check_vehicle_name_is_unique(current_user, name_field):
"""
Checks if the vehicle name given in the name_field is unique for the vehicles of the current user. An error is added
to the field it the name is not unique.
:param current_user: the user currently logged in
:param name_field: the form field to enter the name to
:return: True if the name is unique, False otherwise.
"""
vehicle_name = name_field.data
for vehicle in current_user.vehicles:
if vehicle.name == vehicle_name:
name_field.default = vehicle_name
name_field.errors.append('Vehicle "%s" already exists.' % vehicle_name)
return False
return True