stc

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

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     ]