models.py (6034B)
1 # Test enviroment added validators username 2 # removed BaseModel 3 # added jsonify 4 # fixed datetime 5 6 import datetime 7 import uuid 8 from flask import jsonify, request, redirect, session 9 from fastapi.encoders import jsonable_encoder 10 from typing import List, Optional 11 from pydantic import Field, ValidationError, validator 12 from werkzeug.security import generate_password_hash, check_password_hash 13 #from app import db 14 15 class User(): 16 17 def __init__(self, fname, mname, lname, email, phonenumber, branch, address, birthday, role): 18 self.fname = str(fname) 19 self.mname = str(mname) 20 self.lname = str(lname) 21 self.username = self.fname.lower() + self.mname.lower() + self.lname.lower() 22 self.email = email 23 self.phonenumber = phonenumber 24 self.branch = str(branch) 25 self.address = address 26 self.birthday = birthday 27 self.role = role 28 self.password_hash = None 29 30 def set_password(self, password): 31 self.password_hash = generate_password_hash(password) 32 33 def check_password(self, password): 34 return check_password_hash(self['password_hash'], password) 35 36 @staticmethod 37 def is_authenticated(): 38 return True 39 40 @staticmethod 41 def is_active(): 42 return True 43 44 @staticmethod 45 def is_anonymous(): 46 return False 47 48 def get_id(self): 49 return self.username 50 51 52 53 #def start_session(self, user): 54 # del user['password'] 55 # session['logged_in'] = True 56 # session['user'] = user 57 #return jsonify(user), 200 58 59 #ought to update this fn 60 def signup(self): 61 print(request.form) 62 user = { 63 '_id': uuid.uuid4().hex, 64 'username': request.form.get('username'), 65 'password_hash': request.form.get('password'), 66 'role': request.form.get('Role'), 67 'location': request.form.get('Primary Location'), 68 'phone': request.form.get('Phone Number'), 69 'email': request.form.get('Email'), 70 'pay_period': request.form.get('Pay Period'), 71 'pay_value': request.form.get('Pay Value'), 72 } 73 74 # user['password'] = generate_password_hash(user['password']) 75 76 return jsonify(user), 200 77 78 #ought to update this fn 79 def signout(self): 80 session.clear() 81 return redirect('/login') 82 83 # def loginModel(self): 84 # user = db.user.find_one({ 85 # 'email': request.form.get('email') 86 # }) 87 88 # if user and password_verify(request.form.get('password'), user['password']): 89 # return self.start_session(user) 90 91 # return jsonify({ 'error': 'Invalid login' }), 401 92 93 #ought to update this fn 94 @validator('username') 95 def username_alphanumeric(cls, v): 96 assert v.isalnum(), 'Username must be alphanumeric' 97 return v 98 99 100 class Time: 101 102 def clockin(self, clockin): 103 clockin = { 104 '_id': int, 105 'clock_in': Optional[datetime.datetime.utcnow], 106 'date': Optional[datetime.datetime.today], 107 'project': str, 108 'note': str, 109 } 110 111 return jsonify(clockin), 200 112 113 def clockout(self, clockout): 114 clockout = { 115 '_id': int, 116 'clock_out': Optional[datetime.datetime.utcnow], 117 'date': Optional[datetime.datetime.today], 118 'project': str, 119 'note': Optional[str], 120 'total_time': int 121 } 122 123 return jsonify(clockout), 200 124 125 _id: int 126 # forign key 127 clock_in: Optional[datetime.datetime.utcnow] #System time Clock_out should be optional, but can clock_in? 128 modified_by: str #link to _id of user 129 date: Optional [datetime.datetime.today] 130 project: str 131 clock_out: Optional[datetime.datetime.utcnow] #System time 132 note: str 133 perdium: bool 134 total_time: int #clock_out - clock_in OR if ! clock_out utcnow - clock_in 135 136 def to_json(self): 137 return jsonable_encoder(self, exclude_none=True) 138 139 def to_bson(self): 140 data = self.dict(by_alias=True, exclude_none=True) 141 142 if data["_id"] is None: 143 data.pop("_id") 144 return data 145 146 147 class Fleet: 148 149 def vehicle_repair(self, vehicle_repair): 150 vehicle_repair = { 151 '_id': int, 152 'date': Optional[datetime.datetime.utcnow], 153 'operator': int, #User ID forign key 154 'safety_checks': bool, 155 'additional_notes': str, 156 'vehicle': int, 157 'incident_report': str, 158 'mileage': int 159 } 160 161 return jsonify(vehicle_repair), 200 162 163 _id: int 164 date: Optional[datetime.datetime.utcnow] 165 operator: int #forign key to userID 166 safety_checks: bool #array for different safety checks 167 additional_notes: str 168 vehicle: int #vehicleID 169 incident_report: str 170 mileage: int 171 172 173 class Agreement: 174 175 def document(self, document): 176 document = { 177 '_id': int, #forign key to user 178 'start_date': int, 179 'end_date': int, 180 'bid_document': str, #Filepath to document 181 'budget': float, 182 'cost': int, 183 } 184 185 return jsonify(document), 200 186 187 _id: int #forign key to user 188 start_date: int 189 end_date: int 190 bid_document: str #Filepath to document 191 budget: float 192 cost: int 193 194 class Projects:#Projects references agreement 195 196 def project(self, project): 197 project = { 198 'project_id': int, 199 'project_name': str, 200 # 'project_budget': List[float] = [] 201 } 202 203 return jsonify(project), 200 204 205 project_id: int 206 project_name: str 207 project_role: List[str] = [ 208 209 ] 210 project_budget: List[float] = [ 211 # labor_budget: float | Indexed 0 212 # travel_budget: float | Indexed 1 213 # supplies_budget: float | Indexed 2 214 # contact_budget: float | Indexed 3 215 # equipment_budget: float | Indexed 4 216 # other: float | Indexed 5 217 ]