routes.py (9933B)
1 from app import app 2 from flask_pymongo import PyMongo 3 from flask import render_template, redirect, url_for, flash, request 4 from flask_login import login_required 5 from bson.objectid import ObjectId 6 from app.routes import get_available_projects 7 from app.branches.routes import get_available_branches 8 from app.equipment import bp 9 from app.equipment.forms import NewEquipment, UpdateEquipment 10 from app.equipment.equipment import fetch_equipment, EquipmentNotFoundError, get_all_equipment, get_usable_equipment, get_available_equipment, get_available_equipment_type, get_equipment_types, count_equipment_types 11 import datetime 12 13 mongo = PyMongo(app) 14 15 #class EquipmentNotFoundError(Exception): 16 # pass 17 # 18 #def fetch_equipment(equipment_id): 19 # equipment = mongo.db.equipment_collection.find_one({"_id":ObjectId(equipment_id)}) 20 # 21 # if equipment == None: 22 # raise EquipmentNotFoundError(f'Equipment Id {equipment_id} returned None') 23 # else: 24 # return equipment 25 # 26 ## return all past and present equipment 27 #def get_all_equipment(): 28 # equipment = mongo.db.equipment_collection.find() 29 # return equipment 30 # 31 ## return all equipment not damaged, in use, and not in use presently 32 #def get_usable_equipment(): 33 # equipment = mongo.db.equipment_collection.find({'retired':{'$exists':False}}) 34 # return equipment 35 # 36 ## return equipment not damaged, and ready to use, does not return equipment in use presently 37 #def get_available_equipment(): 38 # equipment = mongo.db.equipment_collection.find({'retired':{'$exists':False},'checked_out':{'$exists':False}}) 39 # return equipment 40 # 41 ## return document of equipment type (_id) and count(number of occurances) 42 #def get_equipment_types(): 43 # types = mongo.db.equipment_collection.aggregate( [ 44 # { 45 # '$group':{ 46 # '_id':'$equipment_type', 47 # 'count': {'$count':{} } 48 # } 49 # }, 50 # { '$sort':{'equipment_type':1} } 51 # ] ) 52 # return types 53 # 54 ## return tuple list ('type','type (count)') 55 #def count_equipment_types(): 56 # counts = [] 57 # for tool in get_equipment_types(): 58 # label = "{} ({})".format(tool['_id'],tool['count']) 59 # counts.append((tool['_id'],label)) 60 # return counts 61 62 ## DEV and SEED Routes ## 63 64 @bp.route("/dev/equipment",methods=["GET"]) 65 @bp.route("/dev/equipment/",methods=["GET"]) 66 @login_required 67 def devEquipment(): 68 equipment = mongo.db.equipment_collection.find({}) 69 flash("dev=True") 70 return render_template("equipment.html",equipment=equipment,dev=True) 71 72 @bp.route("/dev/seed/equipment",methods=["GET","PUT"]) 73 @login_required 74 def seedEquipment(): 75 seeds = [ 76 { # If equipment_type == "vehicle" pass data as params to NewVehicle(FlaskForm) to add additional details like vehicle_number 77 "equipment_type":"vehicle", 78 "branch":ObjectId("6627f69645530484ae5a4ade"), #TODO Change all references to branches to branch_id for scaling via a branch_collection 79 "purchase_timestamp": datetime.datetime.now(), 80 "purchase_price": 26500.68, 81 "match_percentage": 10.25, 82 "purchasing_project": ObjectId("647a3d95ab70a58f2a44a886") 83 }, 84 { 85 "equipment_type":"shovel", 86 "branch":ObjectId("6627f69645530484ae5a4adf"), 87 "purchase_timestamp": datetime.datetime.now(), 88 "purchase_price": 16.68, 89 "match_percentage": 2.5, 90 "purchasing_project": ObjectId("647a3d95ab70a58f2a44a886") 91 }, 92 { 93 "equipment_type":"vehicle", 94 "branch":ObjectId("6627f69645530484ae5a4adf"), 95 "purchase_timestamp": datetime.datetime.now(), 96 "purchase_price": 65238.2, 97 "match_percentage": 12.5, 98 "purchasing_project": ObjectId("647a3d95ab70a58f2a44a886"), 99 "retired":True 100 }, 101 { 102 "equipment_type":"chainsaw", 103 "branch":ObjectId("6627f69645530484ae5a4ade"), 104 "purchase_timestamp": datetime.datetime.now(), 105 "purchase_price": 16.68, 106 "match_percentage": 2.5, 107 "purchasing_project": ObjectId("647a3d95ab70a58f2a44a886") 108 }, 109 { 110 "equipment_type":"chainsaw", 111 "branch":ObjectId("6627f69645530484ae5a4ade"), 112 "purchase_timestamp": datetime.datetime.now(), 113 "purchase_price": 16.68, 114 "match_percentage": 2.5, 115 "purchasing_project": ObjectId("647a3d95ab70a58f2a44a886") 116 } 117 ] 118 mongo.db.equipment_collection.delete_many({}) 119 mongo.db.equipment_collection.insert_many(seeds) 120 return redirect(url_for("equipment.devEquipment")) 121 122 ## END ## 123 124 @bp.route("/equipment") 125 @bp.route("/equipment/") 126 @login_required 127 def all_equipment(): 128 equipment = mongo.db.equipment_collection.find({}) 129 return render_template("equipment.html",equipment=equipment) 130 131 @bp.route("/equipment/<equipment_id>") 132 @login_required 133 def equipment(equipment_id): 134 equipment = mongo.db.equipment_collection.find({'_id':ObjectId(equipment_id)}) 135 return render_template("equipment.html",equipment_id=equipment_id,equipment=equipment) 136 137 @bp.route("/equipment/t/<equipmentType>",methods=["GET"]) 138 @login_required 139 def EquipmentType(equipmentType): 140 equipment = get_available_equipment_type(equipmentType) 141 return render_template("equipment.html",equipment=equipment) 142 143 @bp.route("/newequipment") 144 @bp.route("/newequipment/") 145 @login_required 146 def new_equipment(): 147 form = NewEquipment() 148 149 types = [('',"Select Type")] 150 for t in count_equipment_types(): 151 types.append(t) 152 types.append(('Create New Type','Create New Type')) 153 form.equipment_type.choices = types 154 form.purchasing_project.choices = get_available_projects() 155 156 return render_template("form_equipment.html",form=form,new=True) 157 158 # TODO change to retire? How should this work? 159 @bp.route("/equipment/<equipment_id>/remove",methods=["GET","POST"]) 160 @login_required 161 def remove_equipment(equipment_id): 162 form = RemoveEquipment() 163 return render_template("form_equipment.html") 164 165 @bp.route("/equipment/<equipment_id>/<update>",methods=["GET","POST"]) 166 @login_required 167 def update_equipment(equipment_id,update): 168 form = UpdateEquipment() 169 170 types = [('',"Select Type")] 171 for t in count_equipment_types(): 172 types.append(t) 173 types.append(('Create New Type','Create New Type')) 174 form.equipment_type.choices = types 175 form.purchasing_project.choices = get_available_projects() 176 form.branch.choices = get_available_branches() 177 178 try: 179 equipment = fetch_equipment(equipment_id) 180 except EquipmentNotFoundError as e: 181 return render_template('error.html',error=e) 182 else: 183 if form.validate_on_submit(): 184 match update: 185 case "equipment_type": 186 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'equipment_type':form.equipment_type.data}}) 187 flash("Updated Equipment Type to {}".format(form.equipment_type.data)) 188 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 189 case "equipment_type_number": 190 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'equipment_type_number':form.equipment_type_number.data}}) 191 flash("Updated Equipment Number for {} to {}".format(equipment['equipment_type'],form.equipment_type_number.data)) 192 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 193 case "purchase_timestamp": 194 timestamp = datetime.datetime.combine(form.date.data,datetime.min.time()) 195 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'purchase_timestamp':form.purchase_timestamp.data}}) 196 flash("Updated Purchase Timestamp to {}".format(timestamp)) 197 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 198 case "purchase_price": 199 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'purchase_price':form.purchase_price.data}}) 200 flash("Updated Purchase Price to {}".format(form.purchase_price.data)) 201 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 202 case "match_percentage": 203 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'match_percentage':form.match_percentage.data}}) 204 flash("Updated Match Percentage to {}".format(form.match_percentage.data)) 205 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 206 case "purchasing_project": 207 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'purchasing_project':form.purchasing_project.data}}) 208 flash("Updated Purchasing Project to {}".format(form.purchasing_project.data)) 209 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 210 case "branch": 211 mongo.db.equipment_collection.update_one({'_id':equipment['_id']},{'$set':{'branch':form.branch.data}}) 212 flash("Updated Branch to {}".format(form.branch.data)) 213 return redirect(url_for('equipment.equipment',equipment_id=equipment_id)) 214 215 return render_template("form_equipment.html",update=update,form=form,equipment=equipment) 216