stc

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

commit 370684c8927dc4e4c8fc167a57786eac7259554a
parent ae25b01a4a94e857589e8aa18533e5a742ac27e3
Author: Brennen T. Mazur <brennen@madis.cool>
Date:   Sun, 19 Mar 2023 17:31:21 -0600

create new agreements route, page, style, form. Seed update. Minor new user title content fix

Diffstat:
Mapp/forms.py | 75++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mapp/routes.py | 35+++++++++++++++++++++++++++++++++--
Mapp/static/css/main.css | 2+-
Aapp/templates/admin/agreements/newagreement.html | 37+++++++++++++++++++++++++++++++++++++
Mapp/templates/admin/users/newuser.html | 2+-
Mseeds.py | 44++++++++++++++++++++++++++++++++++++--------
6 files changed, 160 insertions(+), 35 deletions(-)

diff --git a/app/forms.py b/app/forms.py @@ -7,6 +7,21 @@ from wtforms.validators import DataRequired, optional, length # Name: [username], # Password: [hashed_password] # } +##### ##### +### Sub Forms ### +##### ##### +#class ContactForm(FlaskForm): #Fill out, can apply to volunteers as well as agreement/project contacts etc... +class BudgetForm(FlaskForm): #Iff ContactForm is completed change to be subform of ContactForm + laborBudget = FloatField('Labor', validators=[DataRequired()]) + travelBudget = FloatField('Travel', validators=[DataRequired()]) + suppliesBudget = FloatField('Supplies', validators=[DataRequired()]) + contactBudget = FloatField('Contact', validators=[DataRequired()]) + equipmentBudget = FloatField('Equipment', validators=[DataRequired()]) + otherBudget = FloatField('Other',validators=[optional()]) + +##### ##### +### Main Forms ### +##### ##### class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) @@ -27,6 +42,20 @@ class NewUserForm(FlaskForm): setActive = BooleanField('Active',default="checked")# Require some sort of validator for check... createNewUser = SubmitField('Create New User') +class NewRoleForm(FlaskForm): + rolename = StringField('Role Name', validators=[DataRequired()]) + +class NewProjectForm(BudgetForm): + projectName = StringField('Project Name', validators=[DataRequired()]) + agreement = SelectField('Part of Agreement', validators=[DataRequired()]) + +class NewAgreementForm(BudgetForm): + agreementName = StringField('Agreement Name', validators=[DataRequired()]) + agency = StringField('Signing Agency', validators=[DataRequired()]) + startDate = DateField('Start Date',validators=[DataRequired()]) + endDate = DateField('End Date') + createNewAgreement = SubmitField('Create New Agreement') + class PunchclockoutWidget(FlaskForm): projectsSel = SelectField('Project', validators=[DataRequired()]) #clockout = currenttime @@ -41,6 +70,28 @@ class PunchclockinWidget(FlaskForm): # IFF user.role is_in(trusted_role[]) then allow lunch minute definition clockin = SubmitField('Clock In') +class FleetCheckoutForm(FlaskForm): + vehicle = SelectField('Vehicle', validators = [DataRequired()]) + start_mileage = IntegerField('Starting Mileage', 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 Vehicle')#Update to take role name for pass to write fn + +class FleetCheckinForm(FlaskForm): + end_mileage = IntegerField('Ending Mileage',validators=[DataRequired()])# Require some sort of validator for check... + incident_notes = StringField('Incident Notes',validators=[optional()])# May not need this at all? + checkin = SubmitField('Checkin Vehicle')#Update to take role name for pass to write fn + class ChangeHoursForm(FlaskForm): projectChg = SelectField('Project') startTiChg = TimeField('Start') @@ -50,9 +101,6 @@ class ChangeHoursForm(FlaskForm): updateEntr = SubmitField('Update') removeEntr = SubmitField('Remove') -class NewRoleForm(FlaskForm): - rolename = StringField('Role Name', validators=[DataRequired()]) - class DashPermissionsForm(FlaskForm):# for each module make Boolean field. Gets passed to fn writing to permissions_collection SET MANUALLY CURRENTLY punchclock = BooleanField('Punch Clock',default="checked") activecrew = BooleanField('Active Crew List') @@ -62,29 +110,10 @@ class DashPermissionsForm(FlaskForm):# for each module make Boolean field. Gets class AdmnPermissionsForm(FlaskForm):# for each module make Boolean field. Gets passed to fn writing to permissions_collection SET MANUALLY CURRENTLY agreements = BooleanField('Agreements') + updateEntr = SubmitField('Update') reports = BooleanField('Reports') manageusers = BooleanField('Manage Users') ###### End Modules ##### updaterole = SubmitField('Update')#Update to take role name for pass to write fn -class FleetCheckoutForm(FlaskForm): - vehicle = SelectField('Vehicle', validators = [DataRequired()]) - start_mileage = IntegerField('Starting Mileage', 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 Vehicle')#Update to take role name for pass to write fn -class FleetCheckinForm(FlaskForm): - end_mileage = IntegerField('Ending Mileage',validators=[DataRequired()])# Require some sort of validator for check... - incident_notes = StringField('Incident Notes',validators=[optional()])# May not need this at all? - checkin = SubmitField('Checkin Vehicle')#Update to take role name for pass to write fn diff --git a/app/routes.py b/app/routes.py @@ -4,7 +4,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, PunchclockinWidget, PunchclockoutWidget, FleetCheckoutForm, FleetCheckinForm, NewUserForm, AdmnPermissionsForm, DashPermissionsForm, ChangeHoursForm +from app.forms import LoginForm, PunchclockinWidget, PunchclockoutWidget, FleetCheckoutForm, FleetCheckinForm, NewUserForm, AdmnPermissionsForm, DashPermissionsForm, ChangeHoursForm, NewAgreementForm from flask import request from werkzeug.urls import url_parse from werkzeug.security import generate_password_hash, check_password_hash @@ -361,7 +361,7 @@ def inactiveusers(): #### #### ####### New User Admin Route ####### #### #### -@app.route("/admin/newuser", methods=["GET","POST"]) +@app.route("/admin/users/new", methods=["GET","POST"]) @login_required def newuser(): # Temp values, change to modular db dependent values @@ -415,6 +415,37 @@ def newuser(): def agreement(): return render_template('admin/agreement/index.html',ORGNAME=OrganizationName) +@app.route("/admin/agreements/new", methods=["GET","POST"]) +@login_required +def newagreement(): +# Temp values, change to modular db dependent values +# END TMP Values + + form = NewAgreementForm() + + if form.validate_on_submit(): + # create deterministic agreement unique _id? Example being genpasswd in new user validate on submit + + mongo.db.agreement_collection.insert_one({ + 'agreement_name':form.agreementName.data, + 'agency':form.agency.data, + 'projects':[], + 'start_date':form.startDate.data.strftime('%Y-%m-%d'), + 'end_date':form.endDate.data.strftime('%Y-%m-%d'), + 'budget':[{ + 'labor':form.laborBudget.data, + 'travel':form.travelBudget.data, + 'supplies':form.suppliesBudget.data, + 'contact':form.contactBudget.data, + 'equipment':form.equipmentBudget.data, + 'other':form.otherBudget.data + }] # most recent labor budget accessed via budget.0.labor + }) + flash("{} with {} added".format(form.agreementName.data, form.agency.data )) #Will need to sendmail password to form.email.data later + return redirect(url_for('newagreement')) + + return render_template('admin/agreements/newagreement.html',form=form,ORGNAME=OrganizationName) + #### #### ####### Knowlegebase Route ####### #### #### diff --git a/app/static/css/main.css b/app/static/css/main.css @@ -90,7 +90,7 @@ header { /* box-shadow: 0px 0px .1em .1em var(--accent);/* probably shouldn't have box-shadow for clean ui at intermediate page sizes (between laptop and phone off ratio) */ } /********** FULL PAGE **********/ -.hours-grid, .new-user-grid, .role-permissions, .activeusers-grid { +.hours-grid, .new-user-grid, .new-agreement-grid, .role-permissions, .activeusers-grid { padding:5rem; margin:1rem; display: grid; diff --git a/app/templates/admin/agreements/newagreement.html b/app/templates/admin/agreements/newagreement.html @@ -0,0 +1,37 @@ +{% extends 'base.html' %} + +{% block title %}Add New Agreement{% endblock %} + +{% block content %} +<section class="new-agreement-grid"> + <h3>Add New Agreement</h3> + <form action="" method="POST" novalidate> + {{ form.hidden_tag() }} + {% for error in form.errors %} + <span style="color:red;">[{{ error }}]</span> + {% endfor %} + {% for ferror in form.form_errors %} + <span style="color:yellow;">[{{ ferror }}]</span> + {% endfor %} + {{ form.agreementName.label }}{{ form.agreementName() }}<br> + {{ form.agency.label }}{{ form.agency() }}<br> + {{ form.startDate.label }}{{ form.startDate() }}<br> + {{ form.endDate.label }}{{ form.endDate() }}<br> + <h4>Budget</h4> + {{ form.laborBudget.label }}{{ form.laborBudget() }}<br> + {{ form.travelBudget.label }}{{ form.travelBudget() }}<br> + {{ form.suppliesBudget.label }}{{ form.suppliesBudget() }}<br> + {{ form.contactBudget.label }}{{ form.contactBudget() }}<br> + {{ form.equipmentBudget.label }}{{ form.equipmentBudget() }}<br> + {{ form.otherBudget.label }}{{ form.otherBudget() }}<br><br> + {{ form.createNewAgreement() }} + </form> + {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} + <p style='color:green'>{{ message }}</p> + {% endfor %} + {% endif %} + {% endwith %} +</section> +{% endblock %} diff --git a/app/templates/admin/users/newuser.html b/app/templates/admin/users/newuser.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} -{% block title %}Add new Employee{% endblock %} +{% block title %}Add New Employee{% endblock %} {% block content %} <section class="new-user-grid"> diff --git a/seeds.py b/seeds.py @@ -120,23 +120,51 @@ fleet2 = { agreement1 = { 'agreement_name': 'Agreement 1', 'agency': ['USFS'], - 'projects': [2,3,4] + 'projects': [2,3,4], 'start_date': '2023-12-5', 'end_date': '2023-8-12', - 'bid_document': '/asset/document/agreements/New-Agreement.pdf', #Filepath to document - 'budget': 1259.40, - 'cost': 500, + #'bid_document': '/asset/document/agreements/New-Agreement.pdf', #Filepath to document + 'budget': [{ + 'labor':1259.40, + 'travel':220.00, + 'supplies':320.00, + 'contact':420.00, + 'equipment':620.00, + 'other':20.00 + }], + 'costs': [{ + 'labor':159.40, + 'travel':20.00, + 'supplies':30.00, + 'contact':40.00, + 'equipment':60.00, + 'other':2.00 + }] } agreement2 = { 'agreement_name': 'Agreement 2', 'agency': ['SMSP'], - 'projects': [1,5] + 'projects': [1,5], 'start_date': '2021-2-21', 'end_date': '2022-12-13', - 'bid_document': '/asset/document/agreements/Old-Agreement.pdf', #Filepath to document - 'budget': 1259.40, - 'cost': 500, + #'bid_document': '/asset/document/agreements/Old-Agreement.pdf', #Filepath to document + 'budget': [{ + 'labor':1259.40, + 'travel':220.00, + 'supplies':320.00, + 'contact':420.00, + 'equipment':620.00, + 'other':20.00 + }], + 'costs': [{ + 'labor':159.40, + 'travel':20.00, + 'supplies':30.00, + 'contact':40.00, + 'equipment':60.00, + 'other':2.00 + }] } # Projects documents