stc

a simple time card webapp
git clone _git@git.brennen.work:stc.git
Log | Files | Refs | README

commit 3f057b40e43194d4ee30dae446775f66313f8d19
parent 5b69b3634af9c42c7d51e1286ba2a0c3ed6fb068
Author: Brennen T. Mazur <brennen@madis.cool>
Date:   Wed, 22 Feb 2023 22:15:52 -0700

linked fleet widget to write to collection, spelling fix for per diem(thanks Madi)

Diffstat:
Mapp/forms.py | 40+++++++++++++++++++++-------------------
Mapp/routes.py | 30++++++++++++++++++++++--------
Mapp/templates/admin/roles/updateroles.html | 2+-
Mapp/templates/dashboard/fleet/widget.html | 25+++++--------------------
Mapp/templates/dashboard/punchclock/widget.html | 14+++++++-------
Mseeds.py | 6+++---
6 files changed, 59 insertions(+), 58 deletions(-)

diff --git a/app/forms.py b/app/forms.py @@ -1,5 +1,5 @@ from flask_wtf import FlaskForm -from wtforms import StringField, SubmitField, PasswordField, BooleanField, SelectField, DateField, TelField, EmailField, FloatField +from wtforms import StringField, SubmitField, PasswordField, BooleanField, SelectField, DateField, TelField, EmailField, FloatField, IntegerField from wtforms.validators import DataRequired, optional, length # Login class currently assumes mongodb collection(Users) with structure @@ -31,7 +31,7 @@ class PunchclockWidget(FlaskForm): projectsSel = SelectField('Project', validators=[DataRequired()]) #clockin = currenttime lunchBox = BooleanField('Lunch') - perdiumBox = BooleanField('Perdium') + per_diemBox = BooleanField('Perdium') # IFF user.role is_in(trusted_role[]) then allow lunch minute definition clockin = SubmitField('Clock In') @@ -53,23 +53,25 @@ class AdmnPermissionsForm(FlaskForm):# for each module make Boolean field. Gets updaterole = SubmitField('Update')#Update to take role name for pass to write fn class FleetCheckoutForm(FlaskForm): - vehicle = SelectField('Vehicle', validators=[DataRequired()]) - startmilage = StringField('Starting Milage',validators=[DataRequired()])# Require some sort of validator for check... - horn = BooleanField('Horn') - signals = BooleanField('Signals') - tires = BooleanField('Tires') - mirrors = BooleanField('Mirrors') - enginefluid = BooleanField('Engine Fluids') - steeringfluid = BooleanField('Steering Fluid') - brakefluid = BooleanField('Brake Fluid') - transmissionfluid = BooleanField('Transmission Fluid') - windshield = BooleanField('Windshield') - wipers = BooleanField('Windshield Wipers') - towingequipment = BooleanField('Towing Equipment') - additionalnotes = StringField('Additional Notes',validators=[optional()])# May not need this at all? - checkout = SubmitField('Checkout')#Update to take role name for pass to write fn + vehicles=['Vehicle 1','Vehicle 2', 'Vehicle 3'] + startingmiles=0 + vehicle = SelectField('Vehicle', validators = [DataRequired()], choices = vehicles) + start_milage = IntegerField('Starting Milage', validators=[DataRequired()], default=startingmiles)# Require some sort of validator for check... + horn = BooleanField('Horn') + signals = BooleanField('Signals') + tires = BooleanField('Tires') + mirrors = BooleanField('Mirrors') + enginefluid = BooleanField('Engine Fluids') + steeringfluid = BooleanField('Steering Fluid') + brakefluid = BooleanField('Brake Fluid') + transmissionfluid = BooleanField('Transmission Fluid') + windshield = BooleanField('Windshield') + wipers = BooleanField('Windshield Wipers') + towingequipment = BooleanField('Towing Equipment') + additionalnotes = StringField('Additional Notes',validators=[optional()])# May not need this at all? + checkout = SubmitField('Checkout Vehicle')#Update to take role name for pass to write fn class FleetCheckinForm(FlaskForm): - endmilage = StringField('Ending Milage',validators=[DataRequired()])# Require some sort of validator for check... + endmilage = IntegerField('Ending Milage',validators=[DataRequired()])# Require some sort of validator for check... additionalnotes = StringField('Additional Notes',validators=[optional()])# May not need this at all? - checkin = SubmitField('Checkin')#Update to take role name for pass to write fn + checkin = SubmitField('Checkin Vehicle')#Update to take role name for pass to write fn diff --git a/app/routes.py b/app/routes.py @@ -3,7 +3,7 @@ from app import app from flask_pymongo import PyMongo from flask_login import LoginManager from flask import render_template, url_for, request, flash, redirect -from app.forms import LoginForm, PunchclockWidget, NewUserForm, AdmnPermissionsForm, DashPermissionsForm +from app.forms import LoginForm, PunchclockWidget, FleetCheckoutForm, FleetCheckinForm, NewUserForm, AdmnPermissionsForm, DashPermissionsForm from flask import request from werkzeug.urls import url_parse from werkzeug.security import generate_password_hash, check_password_hash @@ -101,15 +101,23 @@ def load_user(username): user_obj.password_hash = u['password_hash'] return user_obj -@app.route("/dashboard") +@app.route("/dashboard", methods=['GET', 'POST']) @login_required def dashboard(): - form=PunchclockWidget() + clockform=PunchclockWidget() + fleetoutform=FleetCheckoutForm() + fleetinform=FleetCheckinForm() currenttime=datetime.datetime.utcnow() available_projects = {'STC Webapp':'stcapp','YEP Website':'yepsite','Volunteer Day':'volday'} - - return render_template('dashboard/layout.html',currenttime=currenttime,projects=available_projects,form=form,ORGNAME=OrganizationName) + if fleetoutform.validate_on_submit(): + mongo.db.fleet_collection.insert_one({'date':datetime.datetime.today(), # NEED to work on modular way of storing safety checks... might condence to single true if all checked. else returns false and records false datavalue.label in incident_report[] If incident report, remove vehicle from available pool and display widget in admin layout + 'vehicle':fleetoutform.vehicle.data, + 'start_milage':fleetoutform.start_milage.data, + 'operator':current_user.username, + 'additional_notes':fleetoutform.additionalnotes.data}) + return redirect(url_for('dashboard')) + return render_template('dashboard/layout.html',currenttime=currenttime,projects=available_projects,clockform=clockform,fleetinform=fleetinform,fleetoutform=fleetoutform,ORGNAME=OrganizationName) @app.route("/admin") #@login_required @@ -151,10 +159,16 @@ def knowlegebase(): # Page Routes -# DEVELOPMENT ROUTES, remove before production +# DEVELOPMENT ROUTES, remove/modify permissions before production + +@app.route("/dev/fleetdata") +@login_required +def fleetdatalist(): + allfleetdata = mongo.db.fleet_collection.find() + return render_template('dev/fleetdata.html', allfleetdata=allfleetdata) -@app.route("/usrs") +@app.route("/dev/usrs") @login_required -def listusers(): +def userslist(): allusers = mongo.db.user_collection.find() return render_template('dev/usrs.html', allusers=allusers) diff --git a/app/templates/admin/roles/updateroles.html b/app/templates/admin/roles/updateroles.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} -{% block title %}Current Activeated Users{% endblock %} +{% block title %}Current Activated Users{% endblock %} {% block content %} diff --git a/app/templates/dashboard/fleet/widget.html b/app/templates/dashboard/fleet/widget.html @@ -1,25 +1,10 @@ <section class="fleet"> - <h2>Fleet</h2> - <form> - <select name="Vehicle ID"><!--replace w/ selectVehicle() or FOR EACH loop for array passed as available Vehicle... Leaning towards latter --> - <option value="vehicle1">vehicle1</option><!-- for/while loop displaying each $vehicleID user has permission for --> - <option value="vehicle2" selected>vehicle2</option> - <option value="vehicle3">vehicle3</option> - </select></br> - <label for="startMileage">Starting Mileage</label> - <input type="number" id="startMileage" name="startMileage" value="102416" min="102416" required><!-- min is last vehicleID.endMileage ask about potential maximum value? --> - <!-- Should safety checks be a seperate form? --> + <h3>Fleet</h3> + <form class="widget-form" action="" method="POST" novalidate> <div class="safetychecks"> - <label for="safetyItem1">Safety Check 1</label> - <input type="checkbox" name="safetyItem1" value="safetyItem1" required></br> - <label for="safetyItem2">Safety Check 2</label> - <input type="checkbox" name="safetyItem2" value="safetyItem2" required></br> - <label for="safetyItem3">Safety Check 3</label> - <input type="checkbox" name="safetyItem3" value="safetyItem3" required></br> - <label for="safetyItem4">Safety Check 4</label> - <input type="checkbox" name="safetyItem4" value="safetyItem4" required></br> + {% for field in fleetoutform %} + {{ field }}{% if field.widget.input_type != 'submit' and field.widget.input_type != 'hidden' %}{{ field.label }}{% endif %}<br> + {% endfor %} </div> - <input type="text" id="notes" value="Additonal Inspection Notes"></br> - <input type="submit" value="Checkout Vehicle"> </form> </section> diff --git a/app/templates/dashboard/punchclock/widget.html b/app/templates/dashboard/punchclock/widget.html @@ -1,16 +1,16 @@ <section class="punchclock"> <h2 id="clock"></h2> - <form action="" method="" novalidate> - <p>{{ form.projectsSel.label }}<br>{{ form.projectsSel(choices=projects[]) }}</p> - <p>{{ form.lunchBox() }} {{ form.lunchBox.label }} - {{ form.perdiumBox() }} {{ form.perdiumBox.label }}</p> - <p>{{ form.clockin() }}</p> + <form class="widget-form" action="" method="" novalidate> + <p>{{ clockform.projectsSel.label }}<br>{{ clockform.projectsSel(choices=projects) }}</p> + <p>{{ clockform.lunchBox() }} {{ clockform.lunchBox.label }} + {{ clockform.per_diemBox() }} {{ clockform.per_diemBox.label }}</p> + <p>{{ clockform.clockin() }}</p> </form> <!-- Add iff satement for clocked_in==True <p> form.projects(choices=projects,default=(if(project[0]==0){return project[0].label })</p> <p>{ form.clockout() }}</p> - <p>{ form.lunchBox() }} {{ form.lunchBox.label }}</p> - <p>{ form.perdiumBox() }} {{ form.perdiumBox.label }}</p> + <p>{ form.lunchBox() }} { form.lunchBox.label }}</p> + <p>{ form.perdiumBox() }} { form.perdiumBox.label }}</p> --> <button><a href="{{ url_for('hours') }}">Change Hours</a></button><!--routes to userhours.html--> <h2>{{ current_user.fname }} {{ current_user.lname }}</h2><!-- something like currenttime above --> diff --git a/seeds.py b/seeds.py @@ -72,7 +72,7 @@ time1 = { 'project': 'Project 2', #Probably link with projects foreign key 'clock_out': datetime.datetime.utcnow(), #System time 'note': 'Changed due to clocking out early', - 'perdium': False, + 'per_diem': False, # 'total_time': } @@ -83,7 +83,7 @@ time2 = { 'project': 'Project 2', #Probably link with projects foreign key 'clock_out': datetime.datetime.utcnow(), #System time 'note': 'Changed due to clocking out early', - 'perdium': False, + 'per_diem': False, # 'total_time': } @@ -91,7 +91,7 @@ time2 = { fleet1 = { 'date': datetime.datetime.today(), 'operator': 'brennentmazur', #forign key to userID -# 'safety_checks': True, #array for different safety checks + 'safety_checks': [True,True,True,True,True]#array for different safety checks 'additional_notes': 'Oil needs checked', 'vehicle': 'The Big Truck', #vehicleID 'incident_report': '',