commit 3fedc042ffe27b9edda4dbe0c5b120e06ae3aa37
parent 285fd788569d380e7d0f06e4f89e043da0ec80a3
Author: Brennen T. Mazur <brennen@madis.cool>
Date:   Wed,  1 Mar 2023 16:36:39 -0700
added role/permission functionality to admin and dashboard pages
Diffstat:
4 files changed, 74 insertions(+), 57 deletions(-)
diff --git a/app/routes.py b/app/routes.py
@@ -106,22 +106,33 @@ def load_user(username):
 @login_required
 def dashboard():
 
-#    all_permissions=mongo.db.permissions_collection.find_one('current_user.role')
-#    dashperms=all_permissions['dashboard']
+    dashperms=mongo.db.permissions_collection.find_one({'label': current_user.role},{'dashboard':1,'_id':0})
+    dashperms=dashperms['dashboard']
+
+    clocked_in_users = mongo.db.time_collection.find({'clock_out': {'$exists':False}})
+    # Move to a isUserClockedIn(default: username=current_user)
+    if mongo.db.time_collection.find_one({'modified_by.0': current_user.username,'clock_out':{'$exists':False}}):
+        clocked_out = False
+    else:
+        clocked_out = True
+    #End isUserClockedIn()
 
     clockinform=PunchclockinWidget()
     clockoutform=PunchclockoutWidget()
     fleetoutform=FleetCheckoutForm()
     fleetinform=FleetCheckinForm()
-    currenttime=datetime.datetime.utcnow()
+
+    if clockoutform.validate_on_submit():
+        mongo.db.time_collection.insert({'clock_out' : [datetime.datetime.utcnow()],
+                                         'lunch' : clockoutform.lunchBox.data,
+                                         'per_diem' : clockoutform.per_diemBox.data})
+        return redirect(url_for('dashboard'))
 
     if clockinform.validate_on_submit():
-        mongo.db.fleet_collection.insert_one({'clock_in' : datetime.datetime.utcnow(),
-                                              'modified_by' : [current_user.username],
-                                              'date' : datetime.datetime.today(),
-                                              'project' : clockinform.project.data,
-                                              'lunch' : clockinform.lunch.data,
-                                              'per_diem' : clockinform.perdiem.data})
+        mongo.db.time_collection.insert({'clock_in' : [datetime.datetime.utcnow()],
+                                         'modified_by' : [current_user.username],
+                                         'date' : datetime.datetime.today(),
+                                         'project' : clockinform.project.data})
         return redirect(url_for('dashboard'))
 
     available_projects = {'STC Webapp':'stcapp','YEP Website':'yepsite','Volunteer Day':'volday'} #not used/not working
@@ -133,14 +144,17 @@ def dashboard():
                                               '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,clockinform=clockinform,fleetinform=fleetinform,fleetoutform=fleetoutform,ORGNAME=OrganizationName)
+    return render_template('dashboard/layout.html',permissions=dashperms,projects=available_projects,clocked_out=clocked_out,clockoutform=clockoutform,clockinform=clockinform,fleetinform=fleetinform,fleetoutform=fleetoutform,ORGNAME=OrganizationName)
 
 @app.route("/admin")
 @login_required
 def admin():
+    adminperms=mongo.db.permissions_collection.find_one({'label': current_user.role},{'admin':1,'_id':0})
+    adminperms=adminperms['admin']
+
     #all_permissions=mongo.db.permissions_collection.find_one({"label":current_user.role})
     #admnperms=all_permissions.admin
-    return render_template ('admin/layout.html',ORGNAME=OrganizationName)
+    return render_template ('admin/layout.html',permissions=adminperms,ORGNAME=OrganizationName)
 
 # Report Routes
 @app.route('/admin/agreement')
diff --git a/app/templates/admin/layout.html b/app/templates/admin/layout.html
@@ -1,16 +1,11 @@
 {% extends 'base.html' %}
 
-{% block title %}Management{% endblock %}
+{% block title %}Admin{% endblock %}
 
 {% block content %}
 	<section class="admin-grid">
-		<!--functioncall checking role for admin. while loop return permissioned 'widgets' -->
-
 		<!-- returned values from admin check is array of permissive ACCESS else return 'missing permissions response' -->
-
-
-<!-- for x in db.get_collection('permissions_collection').find_one(current_user.role) -->
-		{%- for x in ['reports','agreements','roles','users'] %}
+		{%- for x in permissions %}
 			{% include 'admin/'~x~'/widget.html' %}
 		{%- else-%}
 			{{ 'You do not have permission to access this page' }}
diff --git a/app/templates/dashboard/layout.html b/app/templates/dashboard/layout.html
@@ -4,13 +4,11 @@
 
 {% block content %}
 	<section class="base-grid">
-		<!-- TODO: function call for permissive ACCESS, returns array of strings -->
-
-		<!-- For loop takes getWidget()'s -> [] iterates through to include Accessabe widgets, else deny's request -->
-		{%- for x in ['punchclock','activeusers','fleet'] %}
+		<!-- for loop takes current user's dashboard permissions and iterates through to include Accessable widgets, else reports lack of permissions -->
+		{%- for x in permissions %}
 			{% include '/dashboard/'~x~'/widget.html' %}
 		{%- else %}
-			{{ 'You do not have permission to access this page' }}<!--reroute to login page on no access? -->
+			{{ 'You do not have permission to access this page' }}
 		{%- endfor %}
 	
 	</section>
diff --git a/seeds.py b/seeds.py
@@ -36,7 +36,7 @@ user1 = {
         'username': 'nikolasmmazur',
         'birthday': '1999-03-26',
         'password_hash': 'pbkdf2:sha256:260000$DBIF9Dfq1OcsYwSk$37f5cc231ff2c97cc7a6b60f25c767380574f1c01cc17069da4f3e7e25ba3370',
-        'role': 'developer',
+        'role': 'Web Developer',
         'address': '275 DuPont Dr, Lander Wy 82520',
         'branch': 'Lander',
         'phonenumber': '3074380460',
@@ -54,7 +54,7 @@ user2 = {
         'username': 'brennentmazur',
         'birthday': '1997-04-28',
         'password_hash': 'pbkdf2:sha256:260000$ukazhSEG3m9xH2oL$5cc00ff3411f614720287c18f615d71578face70abc990ea5def89f520b0ac2c',
-        'role': 'crewlead',
+        'role': 'Crew Lead',
         'branch': 'Dillon',
         'phonenumber': 3074380491,
         'address': '705 N Railroad Ave, Dillon MT, 59725',
@@ -151,38 +151,48 @@ projects2 = {
 }
 
 # Permissions documents (only needs array list of str for each 'service')
-roles = {
-	'crew': {
-		'label': 'Crew',
-		'dashboard': ['punchclock'],
-		'admin': []
-		},
-	'asistcrewlead': {
-		'label': 'Assistant Lead',
-		'dashboard': ['punchclock','fleet'],
-		'admin': []
-		},
-	'crewlead': {
-		'label': 'Crew Lead',
-		'dashboard': ['punchclock','fleet','activecrew'],
-		'admin': []
-		},
-	'developer': {
-		'label': 'Web Developer',
-		'dashboard': ['punchclock','fleet','activecrew'],
-		'admin': ['agreements','reports','users']
-		},
-	'projectmanager': {
-		'label': 'Project Manager',
-		'dashboard': ['punchclock','fleet','activecrew'],
-		'admin': ['agreements','reports','users']
-		},
-	'accounting': {
-		'label': 'Accountant',
-		'dashboard': ['punchclock','fleet','activecrew'],
-		'admin': ['agreements','reports','users']
+crew = {
+            '_id':1,
+		    'label': 'Crew',
+		    'dashboard': ['punchclock'],
+		    'admin': []
 		}
-}
+	    
+alead = {
+            '_id':2,
+		    'label': 'Assistant Lead',
+		    'dashboard': ['punchclock','fleet'],
+		    'admin': []
+		}
+	    
+lead = {
+            '_id':3,
+		    'label': 'Crew Lead',
+		    'dashboard': ['punchclock','fleet','activeusers'],
+		    'admin': []
+		}
+	    
+developer = {
+            '_id':4,
+		    'label': 'Web Developer',
+		    'dashboard': ['punchclock','fleet','activeusers'],
+		    'admin': ['agreements','reports','users','roles']
+		}
+	    
+manager = {
+            '_id':5,
+		    'label': 'Project Manager',
+		    'dashboard': ['punchclock','fleet','activeusers'],
+		    'admin': ['agreements','reports','users','roles']
+		}
+	    
+accountant = {
+            '_id':6,
+		    'label': 'Accountant',
+		    'dashboard': ['punchclock','fleet','activeusers'],
+		    'admin': ['agreements','reports','users']
+		}
+        
 
 # Insert documents
 user_collection.insert_many([user1, user2])
@@ -190,7 +200,7 @@ time_collection.insert_many([time1, time2])
 fleet_collection.insert_many([fleet1, fleet2])
 agreement_collection.insert_many([agreement1, agreement2])
 projects_collection.insert_many([projects1, projects2])
-permissions_collection.insert_one(roles)
+permissions_collection.insert_many([crew,alead,lead,developer,manager,accountant])
 
 # Print seeded data
 for x in user_collection.find():