stc

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

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