Projekt

Obecné

Profil

Stáhnout (9.65 KB) Statistiky
| Větev: | Tag: | Revize:
1
from datetime import datetime
2

    
3
from fastapi import Depends, APIRouter, Form
4
from fastapi import Request
5
from fastapi.responses import HTMLResponse, RedirectResponse
6
from fastapi.templating import Jinja2Templates
7
from fastapi_jwt_auth import AuthJWT
8
from pydantic import BaseModel
9
from sqlalchemy.orm import Session
10
from sql_app.api.auth import fake_users_db
11
from sql_app import crud, models, schemas
12
from ..database import SessionLocal, engine
13

    
14
models.Base.metadata.create_all(bind=engine)
15

    
16
# Path to html templates used in this file
17
templates = Jinja2Templates(directory="templates/devices")
18

    
19
# prefix used for all endpoints in this file
20
device_web = APIRouter(prefix="")
21

    
22

    
23
# Dependency
24
def get_db():
25
    db = SessionLocal()
26
    try:
27
        yield db
28
    finally:
29
        db.close()
30

    
31

    
32
@device_web.get("/devices-web", response_class=HTMLResponse)
33
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db),
34
                       Authorize: AuthJWT = Depends()):
35
    """
36
    Returns template with all devices and its necessary attributes
37
    """
38
    Authorize.jwt_optional()
39
    current_user = Authorize.get_jwt_subject()
40

    
41
    device_dict = []
42
    devices = crud.get_devices(db, skip=skip, limit=limit)
43
    teams = crud.get_teams(db, skip=skip, limit=limit)
44
    # adding dictionary entry with all inforamtions needed in template
45
    for dev in devices:
46
        if len(dev.licenses) > 0:
47
            for lic in dev.licenses:
48
                device_dict.append({"device": dev, "license": lic.licenses, "log": dev.logs[len(dev.logs) - 1]})
49
        else:
50
            device_dict.append({"device": dev, "license": dev.licenses, "log": dev.logs[len(dev.logs) - 1]})
51
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
52
    if current_user == "admin":
53
        return templates.TemplateResponse("devices.html", {"request": request, "devices": device_dict,
54
                                                           "licenses": licenses, "devs": devices, "keyman_val": "",
55
                                                           "licn_val": "", "lici_val": "", "team_val": "",
56
                                                           "teams": teams, "user": current_user})
57
    else:
58
        current_user = "guest"
59
        return templates.TemplateResponse("devices_normal.html", {"request": request, "devices": device_dict,
60
                                                                  "licenses": licenses, "devs": devices, "keyman_val": "",
61
                                                                  "licn_val": "", "lici_val": "", "team_val": "",
62
                                                                  "teams": teams, "user": current_user})
63

    
64

    
65
@device_web.post("/devices-web", response_class=HTMLResponse)
66
async def filter_devices(request: Request, skip: int = 0, limit: int = 100,
67
                         keyman_id: str = Form("all"), lic_name: str = Form("all"),
68
                         lic_id: str = Form("all"), team: str = Form("all"),
69
                         db: Session = Depends(get_db), Authorize: AuthJWT = Depends()):
70
    """
71
    Endpoint used for filtering devices by user given inputs. returns html template with only
72
    devices that has assigned license defined by user input
73
    """
74
    Authorize.jwt_optional()
75
    current_user = Authorize.get_jwt_subject()
76
    device_dict = []
77
    devices_f = crud.get_filtered_devices(db, keyman_id, lic_name, lic_id, team)
78
    ids = []
79
    for d in devices_f:
80
        ids.append(d[0])
81
    devices = crud.get_devices_with_ids(db, ids)
82
    teams = crud.get_teams(db, skip=skip, limit=limit)
83
    # adding dictionary entry with all inforamtions needed in template
84
    for dev in devices:
85
        if len(dev.licenses) > 0:
86
            for lic in dev.licenses:
87
                device_dict.append({"device": dev, "license": lic.licenses, "log": dev.logs[len(dev.logs) - 1]})
88
        else:
89
            device_dict.append({"device": dev, "license": dev.licenses, "log": dev.logs[len(dev.logs) - 1]})
90
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
91
    if keyman_id == "all":
92
        keyman_id = ""
93
    if lic_name == "all":
94
        lic_name = ""
95
    if lic_id == "all":
96
        lic_id = ""
97
    if team == "all":
98
        team = ""
99
    if current_user == "admin":
100
        return templates.TemplateResponse("devices.html", {"request": request, "devices": device_dict,
101
                                                           "licenses": licenses, "devs": devices, "keyman_val": keyman_id,
102
                                                           "licn_val": lic_name, "lici_val": lic_id, "team_val": team,
103
                                                           "teams": teams, "user": current_user})
104
    else:
105
        current_user = "guest"
106
        return templates.TemplateResponse("devices_normal.html", {"request": request, "devices": device_dict,
107
                                                                  "licenses": licenses, "devs": devices, "keyman_val": keyman_id,
108
                                                                  "licn_val": lic_name, "lici_val": lic_id, "team_val": team,
109
                                                                  "teams": teams, "user": current_user})
110

    
111

    
112
@device_web.get("/device-license/{device_id}", response_class=HTMLResponse)
113
async def connect_dev_lic(request: Request, device_id: int, db: Session = Depends(get_db),
114
                          Authorize: AuthJWT = Depends()):
115
    """
116
    Returns template with one device and all available licenses that can be assigned to it. Plus all teams that can
117
    be assigned to device, inventory number text input and comment text input
118
    """
119
    Authorize.jwt_optional()
120
    current_user = Authorize.get_jwt_subject()
121
    if current_user != "admin":
122
        return RedirectResponse(url=f"/logs-web", status_code=303)
123
    device = crud.get_device(db, device_id)
124
    dev_licenses = crud.get_device_licenses(db, device_id)
125
    lic_ids = []
126
    dev_lics = []
127
    for dev_lic in dev_licenses:
128
        dev_lics.append(dev_lic.licenses)
129
    for dev_lic in dev_licenses:
130
        lic_ids.append(dev_lic.licenses.license_id)
131
    licenses = crud.get_licenses(db, 0, 100)
132
    lic_left = []
133
    for lic in licenses:
134
        if lic.license_id not in lic_ids and lic not in lic_left:
135
            lic_left.append(lic)
136
    teams = crud.get_teams(db, 0, 100)
137
    return templates.TemplateResponse("devicelicense.html",
138
                                      {"request": request, "device": device, "licenses": lic_left, "dev_lic": dev_lics,
139
                                       "teams": teams})
140

    
141

    
142
@device_web.post("/devices-web/{device_id}")
143
async def connect_post(device_id: int, lic: str = Form(...), db: Session = Depends(get_db),
144
                       Authorize: AuthJWT = Depends()):
145
    """
146
    Endpoint called from devicelicense.html template. Adds entry to devices_licenses
147
    table and redirects to devices-web endpoint
148
    """
149
    Authorize.jwt_optional()
150
    current_user = Authorize.get_jwt_subject()
151
    if current_user != "admin":
152
        return RedirectResponse(url=f"/logs-web", status_code=303)
153
    crud.create_device_license(db, device_id, int(lic), datetime.now())
154
    return RedirectResponse(url=f"/devices-web", status_code=303)
155

    
156

    
157
@device_web.post("/devices-web-del/{device_id}")
158
async def delete_post(device_id: int, lic_del: str = Form(...), db: Session = Depends(get_db),
159
                      Authorize: AuthJWT = Depends()):
160
    """
161
    Endpoint called from devicelicense.html template for deleting device-license connection. Deletes entry in
162
    bodydevices_licenses table and redirects to devices-web endpoint
163
    """
164
    Authorize.jwt_optional()
165
    current_user = Authorize.get_jwt_subject()
166
    if current_user != "admin":
167
        return RedirectResponse(url=f"/logs-web", status_code=303)
168
    crud.delete_device_license(db, device_id, int(lic_del))
169
    return RedirectResponse(url=f"/devices-web", status_code=303)
170

    
171

    
172
@device_web.post("/devices-web-team/{device_id}")
173
async def dev_team_con(device_id: int, team_con: str = Form(...), db: Session = Depends(get_db),
174
                       Authorize: AuthJWT = Depends()):
175
    """
176
    Endpoint called from devicelicense.html template, connects device with team and redirects to devices-web endpoint
177
    """
178
    Authorize.jwt_optional()
179
    current_user = Authorize.get_jwt_subject()
180
    if current_user != "admin":
181
        return RedirectResponse(url=f"/logs-web", status_code=303)
182
    crud.update_device(db, device_id, team_con)
183
    return RedirectResponse(url=f"/devices-web", status_code=303)
184

    
185

    
186
@device_web.post("/devices-web-inv/{device_id}")
187
async def dev_inv_new(device_id: int, dev_inv: str = Form(...), db: Session = Depends(get_db),
188
                      Authorize: AuthJWT = Depends()):
189
    """
190
    Endpoint called from template devicelicense.html, updates inventory number of device and redirects to devices-web
191
    endpoint
192
    """
193
    Authorize.jwt_optional()
194
    current_user = Authorize.get_jwt_subject()
195
    if current_user != "admin":
196
        return RedirectResponse(url=f"/logs-web", status_code=303)
197
    crud.update_device_inv(db, device_id, dev_inv)
198
    return RedirectResponse(url=f"/devices-web", status_code=303)
199

    
200

    
201
@device_web.post("/devices-web-comment/{device_id}")
202
async def dev_comm_new(device_id: int, dev_com: str = Form(...), db: Session = Depends(get_db),
203
                       Authorize: AuthJWT = Depends()):
204
    """
205
    Endpoint called from template devicelicense.html, updates comment of device and redirects to devices-web
206
    endpoint
207
    """
208
    Authorize.jwt_optional()
209
    current_user = Authorize.get_jwt_subject()
210
    if current_user != "admin":
211
        return RedirectResponse(url=f"/logs-web", status_code=303)
212
    crud.update_device_com(db, device_id, dev_com)
213
    return RedirectResponse(url=f"/devices-web", status_code=303)
(5-5/16)