Projekt

Obecné

Profil

Stáhnout (8.74 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,
55
                                                           "teams": teams, "user": current_user})
56
    else:
57
        current_user = "guest"
58
        return templates.TemplateResponse("devices_normal.html", {"request": request, "devices": device_dict,
59
                                                                  "licenses": licenses, "user": current_user})
60

    
61

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

    
97

    
98
@device_web.get("/device-license/{device_id}", response_class=HTMLResponse)
99
async def connect_dev_lic(request: Request, device_id: int, db: Session = Depends(get_db),
100
                          Authorize: AuthJWT = Depends()):
101
    """
102
    Returns template with one device and all available licenses that can be assigned to it. Plus all teams that can
103
    be assigned to device, inventory number text input and comment text input
104
    """
105
    Authorize.jwt_optional()
106
    current_user = Authorize.get_jwt_subject()
107
    if current_user != "admin":
108
        return RedirectResponse(url=f"/logs-web", status_code=303)
109
    device = crud.get_device(db, device_id)
110
    dev_licenses = crud.get_device_licenses(db, device_id)
111
    lic_ids = []
112
    dev_lics = []
113
    for dev_lic in dev_licenses:
114
        dev_lics.append(dev_lic.licenses)
115
    for dev_lic in dev_licenses:
116
        lic_ids.append(dev_lic.licenses.license_id)
117
    licenses = crud.get_licenses(db, 0, 100)
118
    lic_left = []
119
    for lic in licenses:
120
        if lic.license_id not in lic_ids and lic not in lic_left:
121
            lic_left.append(lic)
122
    teams = crud.get_teams(db, 0, 100)
123
    return templates.TemplateResponse("devicelicense.html",
124
                                      {"request": request, "device": device, "licenses": lic_left, "dev_lic": dev_lics,
125
                                       "teams": teams})
126

    
127

    
128
@device_web.post("/devices-web/{device_id}")
129
async def connect_post(device_id: int, lic: str = Form(...), db: Session = Depends(get_db),
130
                       Authorize: AuthJWT = Depends()):
131
    """
132
    Endpoint called from devicelicense.html template. Adds entry to devices_licenses
133
    table and redirects to devices-web endpoint
134
    """
135
    Authorize.jwt_optional()
136
    current_user = Authorize.get_jwt_subject()
137
    if current_user != "admin":
138
        return RedirectResponse(url=f"/logs-web", status_code=303)
139
    crud.create_device_license(db, device_id, int(lic), datetime.now())
140
    return RedirectResponse(url=f"/devices-web", status_code=303)
141

    
142

    
143
@device_web.post("/devices-web-del/{device_id}")
144
async def delete_post(device_id: int, lic_del: str = Form(...), db: Session = Depends(get_db),
145
                      Authorize: AuthJWT = Depends()):
146
    """
147
    Endpoint called from devicelicense.html template for deleting device-license connection. Deletes entry in
148
    bodydevices_licenses table and redirects to devices-web endpoint
149
    """
150
    Authorize.jwt_optional()
151
    current_user = Authorize.get_jwt_subject()
152
    if current_user != "admin":
153
        return RedirectResponse(url=f"/logs-web", status_code=303)
154
    crud.delete_device_license(db, device_id, int(lic_del))
155
    return RedirectResponse(url=f"/devices-web", status_code=303)
156

    
157

    
158
@device_web.post("/devices-web-team/{device_id}")
159
async def dev_team_con(device_id: int, team_con: str = Form(...), db: Session = Depends(get_db),
160
                       Authorize: AuthJWT = Depends()):
161
    """
162
    Endpoint called from devicelicense.html template, connects device with team 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.update_device(db, device_id, team_con)
169
    return RedirectResponse(url=f"/devices-web", status_code=303)
170

    
171

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

    
186

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