-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb.py
More file actions
119 lines (105 loc) · 3.44 KB
/
Copy pathweb.py
File metadata and controls
119 lines (105 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from flask import Flask, render_template, request, redirect, url_for, jsonify, flash
from flask_cors import CORS
from sqlalchemy.sql import func
from datetime import datetime
import models
app = Flask("hrms")
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
CORS(app)
db = models.SQLAlchemy(model_class=models.HRDBBase)
@app.route("/")
def index():
return "<h1>HR API</h1>"
@app.route("/employees")
def employees():
query = db.select(models.Employee).order_by(
models.Employee.first_name, models.Employee.last_name
)
users = db.session.execute(query).scalars()
ret = []
for u in users:
ret.append(
{
"id": u.id,
"lname": u.last_name,
"fname": u.first_name,
}
)
return jsonify(ret)
@app.route("/employees/<int:empid>")
def employee_details(empid):
user_query = db.select(models.Employee).where(models.Employee.id == empid)
user = db.session.execute(user_query).scalar()
users_id_query = db.select(models.Employee.id).order_by(
models.Employee.first_name, models.Employee.last_name
)
ids = db.session.execute(users_id_query).fetchall()
user_list = [id for id, in ids]
index = user_list.index(empid)
prev = user_list[index - 1]
try:
next = user_list[index + 1]
except:
next = user_list[0]
leave_query = db.select(func.count(models.Leave.id)).where(
models.Leave.employee_id == empid
)
leave = db.session.execute(leave_query).scalar()
ret = {
"id": user.id,
"fname": user.first_name,
"lname": user.last_name,
"title": user.title.title,
"email": user.email,
"phone": user.phone,
"leaves_taken": leave,
"total_leaves": user.title.max_leaves,
"prev": prev,
"next": next,
}
return jsonify(ret)
@app.route("/leave/<int:empid>", methods=["POST"])
def add_leave(empid):
leave_request = request.get_json()
date = datetime.strptime(leave_request["date"], "%Y-%m-%d").date()
reason = leave_request["reason"]
user_query = db.select(models.Employee).where(models.Employee.id == empid)
user = db.session.execute(user_query).scalar()
leave_query = db.select(func.count(models.Leave.id)).where(
models.Leave.employee_id == empid
)
leave = db.session.execute(leave_query).scalar()
if user.title.max_leaves <= leave:
ret = {
"success": False,
"message": f"Employee reached leave limit {user.title.max_leaves}",
}
return jsonify(ret)
try:
l = models.Leave(date=date, employee_id=empid, reason=reason)
db.session.add(l)
db.session.commit()
ret = {"success": True, "message": "Leave added successfully"}
return jsonify(ret)
except:
ret = {"success": False, "message": f"Employee already taken leave on {date}"}
return jsonify(ret)
@app.route("/vcard/<int:empid>")
def generate_vcard(empid):
query = db.select(models.Employee).where(models.Employee.id == empid)
user = db.session.execute(query).scalar()
ret = {
"vcard": f"""BEGIN:VCARD
VERSION:2.1
N:{user.last_name};{user.first_name}
FN:{user.first_name} {user.last_name}
ORG:Authors, Inc.
TITLE:{user.title.title}
TEL;WORK;VOICE:{user.phone}
ADR;WORK:;;100 Flat Grape Dr.;Fresno;CA;95555;United States of America
EMAIL;PREF;INTERNET:{user.email}
REV:20150922T195243Z
END:VCARD
"""
}
return jsonify(ret)