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:
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