Projekt

Obecné

Profil

« Předchozí | Další » 

Revize b6f0e019

Přidáno uživatelem Matěj Zeman před asi 2 roky(ů)

re #9575 Filtering Over logs and devices.

Zobrazit rozdíly:

server/sql_app/api/devices.py
4 4
from sqlalchemy.orm import Session
5 5
from sql_app import crud, models, schemas
6 6
from ..database import SessionLocal, engine
7
from fastapi import FastAPI, Request
8
from fastapi.responses import HTMLResponse
9
from fastapi.staticfiles import StaticFiles
10
from fastapi.templating import Jinja2Templates
11 7

  
12 8
models.Base.metadata.create_all(bind=engine)
13
templates = Jinja2Templates(directory="templates/devices")
14 9

  
15 10
device = APIRouter(prefix="/api/v1")
16 11

  
......
23 18
        db.close()
24 19

  
25 20

  
26
@device.get("/devices-web", response_class=HTMLResponse)
27
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
28
    devices = crud.get_devices(db, skip=skip, limit=limit)
29
    return templates.TemplateResponse("devices.html", {"request": request, "devs": devices})
30

  
31

  
32 21
@device.post("/device", response_model=schemas.Device)
33 22
def create_device(device: schemas.DeviceCreate, db: Session = Depends(get_db)):
34 23
    print(crud.create_device(db=db, device=device))
server/sql_app/api/devices_web.py
1
from typing import List
2

  
3
from fastapi import Depends, FastAPI, HTTPException, APIRouter, Form
4
from sqlalchemy.orm import Session
5
from sql_app import crud, models, schemas
6
from datetime import datetime
7
from ..database import SessionLocal, engine
8
from fastapi import FastAPI, Request
9
from fastapi.responses import HTMLResponse
10
from fastapi.staticfiles import StaticFiles
11
from fastapi.templating import Jinja2Templates
12

  
13
models.Base.metadata.create_all(bind=engine)
14
templates = Jinja2Templates(directory="../templates/devices")
15

  
16
device_web = APIRouter(prefix="/api/v1")
17

  
18

  
19
# Dependency
20
def get_db():
21
    db = SessionLocal()
22
    try:
23
        yield db
24
    finally:
25
        db.close()
26

  
27

  
28
@device_web.get("/devices-web", response_class=HTMLResponse)
29
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
30
    devices = crud.get_devices(db, skip=skip, limit=limit)
31
    return templates.TemplateResponse("devices.html", {"request": request, "devs": devices})
32

  
33

  
34
@device_web.post("/devices-web", response_class=HTMLResponse)
35
async def filter_devices(request: Request, skip: int = 0, limit: int = 100, lic: str = Form("all"),
36
                         db: Session = Depends(get_db)):
37
    devices = crud.get_devices(db, skip=skip, limit=limit)
38
    def_devices = []
39
    for dev in devices:
40
        for l in dev.licenses:
41
            if dev not in def_devices and l.licenses.name == lic:
42
                def_devices.append(dev)
43
    if lic == "all":
44
        def_devices = devices
45
    return templates.TemplateResponse("devices.html", {"request": request, "devs": def_devices})
server/sql_app/api/licenses.py
2 2

  
3 3
from fastapi import Depends, FastAPI, HTTPException, APIRouter, Form
4 4
from sqlalchemy.orm import Session
5
from datetime import date
5
from datetime import datetime
6 6
from sql_app import crud, models, schemas
7 7
from ..database import SessionLocal, engine
8
from fastapi import FastAPI, Request
9
from fastapi.responses import HTMLResponse
10
from fastapi.staticfiles import StaticFiles
11
from fastapi.templating import Jinja2Templates
12 8

  
13 9
models.Base.metadata.create_all(bind=engine)
14
templates = Jinja2Templates(directory="templates/licenses")
15 10

  
16 11
licenses = APIRouter(prefix="/api/v1")
17 12

  
......
25 20
        db.close()
26 21

  
27 22

  
28
@licenses.get("/license-create", response_class=HTMLResponse)
29
async def licenses_create_web(request: Request):
30
    return templates.TemplateResponse("license_create.html", {"request": request})
31

  
32

  
33
@licenses.get("/licenses-web", response_class=HTMLResponse)
34
async def licenses_web(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
35
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
36
    return templates.TemplateResponse("licenses.html", {"request": request, "licenses": licenses})
37

  
38

  
39
@licenses.post("/licenses-web", response_class=HTMLResponse)
40
def create_license(request: Request, name: str = Form(...), expdate: date = Form(...), skip: int = 0, limit: int = 100,
41
                   db: Session = Depends(get_db)):
42
    db_license = crud.create_license(db, name, expdate)
43
    if db_license is None:
44
        print("something went wrong")
45
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
46
    return templates.TemplateResponse("licenses.html", {"request": request, "licenses": licenses})
47

  
48

  
49 23
@licenses.get("/licenses", response_model=List[schemas.License])
50 24
def read_licenses(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
51 25
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
......
54 28

  
55 29
@licenses.post("/device-license", response_model=schemas.DeviceLicense)
56 30
def create_device_license(device_license: schemas.DeviceLicenseCreate, db: Session = Depends(get_db)):
57
    print(crud.create_device_license(db=db, device_license=device_license))
31
    print(crud.create_device_license(db=db, device=device_license.device_id, license=device_license.license_id,
32
                                     time=datetime.now()))
server/sql_app/api/licenses_web.py
1
from typing import List
2

  
3
from fastapi import Depends, FastAPI, HTTPException, APIRouter, Form
4
from sqlalchemy.orm import Session
5
from datetime import date
6
from sql_app import crud, models, schemas
7
from ..database import SessionLocal, engine
8
from fastapi import FastAPI, Request
9
from fastapi.responses import HTMLResponse
10
from fastapi.staticfiles import StaticFiles
11
from fastapi.templating import Jinja2Templates
12

  
13
models.Base.metadata.create_all(bind=engine)
14
templates = Jinja2Templates(directory="../templates/licenses")
15

  
16
licenses_web = APIRouter(prefix="/api/v1")
17

  
18

  
19
# Dependency
20
def get_db():
21
    db = SessionLocal()
22
    try:
23
        yield db
24
    finally:
25
        db.close()
26

  
27

  
28
@licenses_web.get("/license-create", response_class=HTMLResponse)
29
async def licenses_create_web(request: Request):
30
    return templates.TemplateResponse("license_create.html", {"request": request})
31

  
32

  
33
@licenses_web.get("/licenses-web", response_class=HTMLResponse)
34
async def read_licenses_web(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
35
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
36
    return templates.TemplateResponse("licenses.html", {"request": request, "licenses": licenses})
37

  
38

  
39
@licenses_web.post("/licenses-web", response_class=HTMLResponse)
40
def create_license(request: Request, name: str = Form(...), expdate: date = Form(...), skip: int = 0, limit: int = 100,
41
                   db: Session = Depends(get_db)):
42
    db_license = crud.create_license(db, name, expdate)
43
    if db_license is None:
44
        print("something went wrong")
45
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
46
    return templates.TemplateResponse("licenses.html", {"request": request, "licenses": licenses})
server/sql_app/api/pcs.py
3 3
from sqlalchemy.orm import Session
4 4
from sql_app import crud, models, schemas
5 5
from ..database import SessionLocal, engine
6
from fastapi import FastAPI, Request
7
from fastapi.responses import HTMLResponse
8
from fastapi.staticfiles import StaticFiles
9
from fastapi.templating import Jinja2Templates
10 6

  
11 7
models.Base.metadata.create_all(bind=engine)
12
templates = Jinja2Templates(directory="templates/pcs")
13 8

  
14 9
pcs = APIRouter(prefix="/api/v1")
15 10

  
......
23 18
        db.close()
24 19

  
25 20

  
26
@pcs.get("/pcs-web", response_class=HTMLResponse)
27
async def read_pcs(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
28
    pcs = crud.get_pcs(db, skip=skip, limit=limit)
29
    return templates.TemplateResponse("pcs.html", {"request": request, "pcs": pcs})
30

  
31

  
32 21
@pcs.post("/pc", response_model=schemas.PC)
33 22
def create_pc(pc: schemas.PCCreate, db: Session = Depends(get_db)):
34 23
    print(crud.create_pc(db=db, user=pc.username, host=pc.hostname))
......
45 34
    db_pc = crud.get_pc(db, pc_id=pc_id)
46 35
    if db_pc is None:
47 36
        raise HTTPException(status_code=404, detail="Device not found")
48
    return db_pc
37
    return db_pc
server/sql_app/api/pcs_web.py
1
from typing import List
2
from fastapi import Depends, FastAPI, HTTPException, APIRouter, Form
3
from sqlalchemy.orm import Session
4
from sql_app import crud, models, schemas
5
from ..database import SessionLocal, engine
6
from fastapi import FastAPI, Request
7
from fastapi.responses import HTMLResponse
8
from fastapi.staticfiles import StaticFiles
9
from fastapi.templating import Jinja2Templates
10

  
11
models.Base.metadata.create_all(bind=engine)
12
templates = Jinja2Templates(directory="../templates/pcs")
13

  
14
pcs_web = APIRouter(prefix="/api/v1")
15

  
16

  
17
# Dependency
18
def get_db():
19
    db = SessionLocal()
20
    try:
21
        yield db
22
    finally:
23
        db.close()
24

  
25

  
26
@pcs_web.get("/pcs-web", response_class=HTMLResponse)
27
async def read_pcs(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
28
    pcs = crud.get_pcs(db, skip=skip, limit=limit)
29
    return templates.TemplateResponse("pcs.html", {"request": request, "pcs": pcs})
server/sql_app/api/teams.py
4 4
from sqlalchemy.orm import Session
5 5
from sql_app import crud, models, schemas
6 6
from ..database import SessionLocal, engine
7
from fastapi import FastAPI, Request
8
from fastapi.responses import HTMLResponse
9
from fastapi.staticfiles import StaticFiles
10
from fastapi.templating import Jinja2Templates
11 7

  
12 8
models.Base.metadata.create_all(bind=engine)
13
templates = Jinja2Templates(directory="templates/teams")
14 9

  
15 10
teams = APIRouter(prefix="/api/v1")
16 11

  
......
23 18
        db.close()
24 19

  
25 20

  
26
@teams.get("/teams-web", response_class=HTMLResponse)
27
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
28
    teams = crud.get_teams(db, skip=skip, limit=limit)
29
    return templates.TemplateResponse("teams.html", {"request": request, "teams": teams})
30

  
31

  
32 21
@teams.post("/team", response_model=schemas.Team)
33 22
def create_device(team: schemas.TeamCreate, db: Session = Depends(get_db)):
34 23
    print(crud.create_team(db=db, name=team.name))
server/sql_app/api/teams_web.py
1
from typing import List
2

  
3
from fastapi import Depends, FastAPI, HTTPException, APIRouter, Form
4
from sqlalchemy.orm import Session
5
from sql_app import crud, models, schemas
6
from ..database import SessionLocal, engine
7
from fastapi import FastAPI, Request
8
from fastapi.responses import HTMLResponse
9
from fastapi.staticfiles import StaticFiles
10
from fastapi.templating import Jinja2Templates
11

  
12
models.Base.metadata.create_all(bind=engine)
13
templates = Jinja2Templates(directory="../templates/teams")
14

  
15
teams_web = APIRouter(prefix="/api/v1")
16

  
17

  
18
# Dependency
19
def get_db():
20
    db = SessionLocal()
21
    try:
22
        yield db
23
    finally:
24
        db.close()
25

  
26

  
27
@teams_web.get("/teams-web", response_class=HTMLResponse)
28
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
29
    teams = crud.get_teams(db, skip=skip, limit=limit)
30
    return templates.TemplateResponse("teams.html", {"request": request, "teams": teams})
server/sql_app/api/usb_logs.py
4 4
from sqlalchemy.orm import Session
5 5
from sql_app import crud, models, schemas
6 6
from ..database import SessionLocal, engine
7
from fastapi import FastAPI, Request
8
from fastapi.responses import HTMLResponse
9
from fastapi.staticfiles import StaticFiles
10
from fastapi.templating import Jinja2Templates
11 7

  
12 8
models.Base.metadata.create_all(bind=engine)
13
templates = Jinja2Templates(directory="templates/usb-logs")
14 9

  
15 10
usblogs = APIRouter(prefix="/api/v1")
16 11

  
......
24 19
        db.close()
25 20

  
26 21

  
27
@usblogs.get("/logs-web", response_class=HTMLResponse)
28
async def read_logs(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
29
    logs = crud.get_logs(db, skip=skip, limit=limit)
30
    pcs = []
31
    for log in logs:
32
        if log.pc_id not in pcs:
33
            pcs.append(log.pc_id)
34
    pc_obj = crud.find_pcs(db, pcs)
35
    return templates.TemplateResponse("logs.html", {"request": request, "logs": logs, "pcs": pc_obj})
36

  
37

  
38
@usblogs.post("/logs-web", response_class=HTMLResponse)
39
async def filter_logs(request: Request, pc: str = Form(...), skip: int = 0, limit: int = 100,
40
                      db: Session = Depends(get_db)):
41
    logs_temp = crud.get_logs(db, skip=skip, limit=limit)
42
    pcs = []
43
    logs = []
44
    for log in logs_temp:
45
        if log.pc_id not in pcs:
46
            pcs.append(log.pc_id)
47
        if pc != "all":
48
            if log.pc_id == int(pc):
49
                logs.append(log)
50
    if pc == "all":
51
        logs = logs_temp
52
    pc_obj = crud.find_pcs(db, pcs)
53
    return templates.TemplateResponse("logs.html", {"request": request, "logs": logs, "pcs": pc_obj})
54

  
55

  
56 22
@usblogs.post("/usb-logs", response_model=schemas.USBLog)
57 23
def create_device_logs(log: schemas.USBTempBase, db: Session = Depends(get_db)):
58 24
    dev = crud.find_device(db, log.device)
server/sql_app/api/usb_logs_web.py
1
from typing import List
2
from fastapi import Depends, FastAPI, HTTPException, APIRouter, Form
3
from datetime import datetime
4
from sqlalchemy.orm import Session
5
from sql_app import crud, models, schemas
6
from ..database import SessionLocal, engine
7
from fastapi import FastAPI, Request
8
from fastapi.responses import HTMLResponse
9
from fastapi.staticfiles import StaticFiles
10
from fastapi.templating import Jinja2Templates
11

  
12
models.Base.metadata.create_all(bind=engine)
13
templates = Jinja2Templates(directory="../templates/usb-logs")
14

  
15
usblogs_web = APIRouter(prefix="/api/v1")
16

  
17

  
18
# Dependency
19
def get_db():
20
    db = SessionLocal()
21
    try:
22
        yield db
23
    finally:
24
        db.close()
25

  
26

  
27
@usblogs_web.get("/logs-web", response_class=HTMLResponse)
28
async def read_logs(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
29
    logs = crud.get_logs(db, skip=skip, limit=limit)
30
    pcs = []
31
    for log in logs:
32
        if log.pc_id not in pcs:
33
            pcs.append(log.pc_id)
34
    pc_obj = crud.find_pcs(db, pcs)
35
    teams = crud.get_teams(db, skip=skip, limit=limit)
36
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
37
    return templates.TemplateResponse("logs.html", {"request": request, "logs": logs, "pcs": pc_obj, "teams": teams,
38
                                                    "licenses": licenses})
39

  
40

  
41
@usblogs_web.post("/logs-web", response_class=HTMLResponse)
42
async def filter_logs(request: Request, pc: str = Form("all"), team: str = Form("all"), lic: str = Form("all"),
43
                      skip: int = 0, limit: int = 100,
44
                      db: Session = Depends(get_db)):
45
    log = crud.get_filtered_logs(db, pc, team, lic)
46
    logs_ids = []
47
    for l in log:
48
        logs_ids.append(l[0])
49
    logs = crud.find_filtered_logs(db, logs_ids)
50
    pc_obj = crud.get_pcs(db, skip=skip, limit=limit)
51
    teams = crud.get_teams(db, skip=skip, limit=limit)
52
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
53
    return templates.TemplateResponse("logs.html", {"request": request, "logs": logs, "pcs": pc_obj, "teams": teams,
54
                                                    "licenses": licenses})
55

  
server/sql_app/crud.py
1 1
from datetime import datetime, date
2 2

  
3 3
from sqlalchemy.orm import Session
4
from sqlalchemy import and_
4
from sqlalchemy import and_, desc
5 5
from . import models, schemas
6 6

  
7 7

  
......
15 15

  
16 16
def find_device(db: Session, device: schemas.DeviceBase):
17 17
    return db.query(models.Device).filter(and_(models.Device.product_id == device.product_id,
18
                                          models.Device.vendor_id == device.vendor_id,
19
                                          models.Device.serial_number == device.serial_number)).first()
18
                                               models.Device.vendor_id == device.vendor_id,
19
                                               models.Device.serial_number == device.serial_number)).first()
20 20

  
21 21

  
22 22
def create_device(db: Session, device: schemas.DeviceBase):
......
36 36
    return db.query(models.License).offset(skip).limit(limit).all()
37 37

  
38 38

  
39
def find_license(db: Session, name: str):
40
    return db.query(models.License).filter(models.License.name == name).first()
41

  
42

  
39 43
def create_license(db: Session, name: str, expdate: date):
40 44
    db_license = models.License(name=name, expiration_date=expdate)
41 45
    db.add(db_license)
......
44 48
    return db_license
45 49

  
46 50

  
47
def create_device_license(db: Session, device_license: schemas.DeviceLicenseBase):
48
    db_device_license = models.DeviceLicense(device_id=device_license.device_id, license_id=device_license.license_id,
49
                                             assigned_datetime=device_license.assigned_datetime)
51
def get_license_devices(db: Session, license_id: int):
52
    return db.query(models.DeviceLicense).filter(models.DeviceLicense.license_id == license_id).all()
53

  
54

  
55
def create_device_license(db: Session, device: int, license: int, time: datetime):
56
    db_device_license = models.DeviceLicense(device_id=device, license_id=license,
57
                                             assigned_datetime=time)
50 58
    db.add(db_device_license)
51 59
    db.commit()
52 60
    db.refresh(db_device_license)
53 61
    return db_device_license
54 62

  
55 63

  
64
def find_pc_by_username(db: Session, name: str):
65
    return db.query(models.PC).filter(models.PC.username == name).first()
66

  
67

  
56 68
def get_pc(db: Session, pc_id: int):
57 69
    return db.query(models.PC).filter(models.PC.id == pc_id).first()
58 70

  
59 71

  
72
def update_pc(db: Session, pc_id: int, team: str):
73
    old_pc = get_pc(db, pc_id)
74
    team = get_team(db, int(team))
75
    new = {'id': old_pc.id, 'username': old_pc.username, 'hostname': old_pc.hostname, 'assigned': True,
76
           'team_id': team.id}
77
    for key, value in new.items():
78
        setattr(old_pc, key, value)
79
    db.commit()
80
    db.refresh(old_pc)
81
    return old_pc
82

  
83

  
60 84
def get_pcs(db: Session, skip: int = 0, limit: int = 100):
61 85
    return db.query(models.PC).offset(skip).limit(limit).all()
62 86

  
63 87

  
64 88
def find_pc(db: Session, username: str, hostname: str):
65 89
    return db.query(models.PC).filter(and_(models.PC.username == username,
66
                                      models.PC.hostname == hostname)).first()
90
                                           models.PC.hostname == hostname)).first()
91

  
92

  
93
def find_pc_by_name(db: Session, username: str):
94
    return db.query(models.PC).filter(models.PC.username == username).first()
95

  
96

  
97
def find_pc_by_name_all(db: Session, username: str):
98
    return db.query(models.PC).filter(models.PC.username == username).offset(0).limit(100).all()
67 99

  
68 100

  
69 101
def find_pcs(db: Session, pcs: []):
70 102
    return db.query(models.PC).filter(models.PC.id.in_(pcs)).all()
71 103

  
72 104

  
105
def get_pcs_by_team(db: Session, team_id: int):
106
    return db.query(models.PC).filter(models.PC.team_id == team_id).all()
107

  
108

  
73 109
def create_pc(db: Session, user: str, host: str):
74 110
    db_pc = models.PC(username=user, hostname=host, assigned=False)
75 111
    db.add(db_pc)
......
86 122
    return db.query(models.Team).offset(skip).limit(limit).all()
87 123

  
88 124

  
125
def find_team(db: Session, name: str):
126
    return db.query(models.Team).filter(models.Team.name == name).first()
127

  
128

  
89 129
def create_team(db: Session, name: str):
90
    db_team = models.PC(name=name)
130
    db_team = models.Team(name=name)
91 131
    db.add(db_team)
92 132
    db.commit()
93 133
    db.refresh(db_team)
......
95 135

  
96 136

  
97 137
def get_logs(db: Session, skip: int = 0, limit: int = 100):
98
    return db.query(models.USBLog).offset(skip).limit(limit).all()
138
    return db.query(models.USBLog).order_by(desc(models.USBLog.timestamp)).offset(skip).limit(limit).all()
99 139

  
100 140

  
101 141
def get_log(db: Session, device_id: int, skip: int = 0, limit: int = 100):
102 142
    return db.query(models.USBLog).filter(models.USBLog.device_id == device_id).offset(skip).limit(limit).all()
103 143

  
104 144

  
145
def find_filtered_logs(db: Session, logs: []):
146
    return db.query(models.USBLog).filter(models.USBLog.id.in_(logs)).order_by(desc(models.USBLog.timestamp)).all()
147

  
148

  
149
def get_filtered_logs(db: Session, pc: str, tema: str, lic: str):
150
    execute_string = "SELECT * FROM usb_logs AS logs"
151
    if pc != "all":
152
        pcs = find_pc_by_username(db, pc)
153
        execute_string += "  WHERE logs.pc_id = " + str(pcs.id)
154
    if tema != "all":
155
        team = find_team(db, tema)
156
        pcs = get_pcs_by_team(db, team.id)
157
        pc_ids = "("
158
        for p in pcs:
159
            pc_ids += str(p.id) + ", "
160
        def_pc_ids = pc_ids[:-2] + ")"
161
        if pc != "all":
162
            execute_string += " AND logs.pc_id IN " + def_pc_ids
163
        else:
164
            execute_string += " WHERE logs.pc_id IN " + def_pc_ids
165
    if lic != "all":
166
        license = find_license(db, lic)
167
        device_licenses = get_license_devices(db, license.id)
168
        dev_ids = "("
169
        for dev in device_licenses:
170
            dev_ids += str(dev.device_id) + ", "
171
        defin_ids = dev_ids[:-2] + ")"
172
        if pc != "all" or tema != "all":
173
            execute_string += " AND logs.device_id IN " + defin_ids
174
        else:
175
            execute_string += " WHERE logs.device_id IN " + defin_ids
176

  
177
    result = db.execute(execute_string)
178
    return result
179

  
180

  
105 181
def create_device_logs(db: Session, item: schemas.USBTempBase, dev_id: int, pc_id: int, date: datetime):
106 182
    db_log = models.USBLog(pc_id=pc_id, timestamp=date, status=item.status, device_id=dev_id)
107 183
    db.add(db_log)
server/sql_app/main.py
1 1
import uvicorn
2 2
from sql_app.api.devices import device
3
from sql_app.api.devices_web import device_web
3 4
from sql_app.api.licenses import licenses
5
from sql_app.api.licenses_web import licenses_web
4 6
from sql_app.api.pcs import pcs
7
from sql_app.api.pcs_web import pcs_web
5 8
from sql_app.api.usb_logs import usblogs
9
from sql_app.api.usb_logs_web import usblogs_web
6 10
from sql_app.api.teams import teams
11
from sql_app.api.teams_web import teams_web
7 12
from fastapi import FastAPI
8 13

  
9 14

  
......
14 19
app.include_router(usblogs)
15 20
app.include_router(teams)
16 21

  
22
app.include_router(device_web)
23
app.include_router(licenses_web)
24
app.include_router(pcs_web)
25
app.include_router(teams_web)
26
app.include_router(usblogs_web)
27

  
17 28
'''
18 29
if __name__ == "__main__":
19 30
    uvicorn.run(app, host="192.168.0.22", port=8000)
server/templates/devices/devices.html
3 3
    <title>Devices Details</title>
4 4
</head>
5 5
<body>
6
<form action="" method="get">
7
  <label for="view">Choose view:</label>
8
  <select id="view" name="view" onchange="this.form.action=this.value;">
9
      <option value=""></option>
10
      <option value="/api/v1/logs-web">Logs</option>
11
      <option value="/api/v1/devices-web">Devices</option>
12
      <option value="/api/v1/teams-web">Teams</option>
13
      <option value="/api/v1/pcs-web">PCs</option>
14
  </select>
15
  <input type="submit" value="OK">
16
</form>
17
<form action="/api/v1/devices-web" method="post">
18
    <label for="lic">License:</label>
19
    <input id="lic" name="lic" type="text" list="licenses" value="" placeholder="all">
20
    <datalist id="licenses">
21
        {% for license in licenses %}
22
        <option value="{{license.name}}"></option>
23
        {% endfor %}
24
    </datalist>
25
  <input type="submit" value="Filter">
26
</form>
6 27
<table>
7 28
    <TR>
8 29
        <TH>ID</TH>
9 30
        <TH>Vendor ID</TH>
10 31
        <TH>Product ID</TH>
11 32
        <TH>Serial Number</TH>
33
        <TH>Licenses</TH>
12 34
    </TR>
13 35
    {% for device in devs %}
14 36
    <TR>
......
16 38
        <TD class="Vendor ID">{{device.vendor_id}}</TD>
17 39
        <TD class="Product ID">{{device.product_id}}</TD>
18 40
        <TD class="Serial Number">{{device.serial_number}}</TD>
41
        <TD class="License">
42
            {% for lic in device.licenses %}
43
                {{lic.licenses.name}}<BR>
44
            {% endfor %}
45
        </TD>
19 46
    </TR>
20 47
    {% endfor %}
21 48
</table>
server/templates/licenses/licenses.html
3 3
    <title>Licenses Details</title>
4 4
</head>
5 5
<body>
6
<form action="" method="get">
7
  <label for="view">Choose view:</label>
8
  <select id="view" name="view" onchange="this.form.action=this.value;">
9
      <option value=""></option>
10
      <option value="/api/v1/logs-web">Logs</option>
11
      <option value="/api/v1/devices-web">Devices</option>
12
      <option value="/api/v1/teams-web">Teams</option>
13
      <option value="/api/v1/pcs-web">PCs</option>
14
  </select>
15
  <input type="submit" value="OK">
16
</form>
6 17
<table>
7 18
    <TR>
8 19
        <TH>ID</TH>
server/templates/pcs/pcs.html
3 3
    <title>Pcs Details</title>
4 4
</head>
5 5
<body>
6
<form action="" method="get">
7
  <label for="view">Choose view:</label>
8
  <select id="view" name="view" onchange="this.form.action=this.value;">
9
      <option value=""></option>
10
      <option value="/api/v1/logs-web">Logs</option>
11
      <option value="/api/v1/devices-web">Devices</option>
12
      <option value="/api/v1/teams-web">Teams</option>
13
      <option value="/api/v1/pcs-web">PCs</option>
14
  </select>
15
  <input type="submit" value="OK">
16
</form>
6 17
<table>
7 18
    <TR>
8 19
        <TH>ID</TH>
9 20
        <TH>Username</TH>
10 21
        <TH>Hostname</TH>
22
        <TH>Team</TH>
11 23
    </TR>
12 24
    {% for pc in pcs %}
13 25
    <TR>
14 26
        <TD class="ID">{{pc.id}}</TD>
15 27
        <TD class="Vendor ID">{{pc.username}}</TD>
16 28
        <TD class="Product ID">{{pc.hostname}}</TD>
29
        {% if pc.team == None %}
30
            <TD class="Team">NONE</TD>
31
        {% else %}
32
            <TD class="Team">{{pc.team.name}}</TD>
33
        {% endif %}
17 34
    </TR>
18 35
    {% endfor %}
19 36
</table>
server/templates/teams/teams.html
3 3
    <title>Teams Details</title>
4 4
</head>
5 5
<body>
6
<form action="" method="get">
7
  <label for="view">Choose view:</label>
8
  <select id="view" name="view" onchange="this.form.action=this.value;">
9
      <option value=""></option>
10
      <option value="/api/v1/logs-web">Logs</option>
11
      <option value="/api/v1/devices-web">Devices</option>
12
      <option value="/api/v1/teams-web">Teams</option>
13
      <option value="/api/v1/pcs-web">PCs</option>
14
  </select>
15
  <input type="submit" value="OK">
16
</form>
6 17
<table>
7 18
    <TR>
8 19
        <TH>ID</TH>
server/templates/usb-logs/logs.html
3 3
    <title>Logs Details</title>
4 4
</head>
5 5
<body>
6
<form action="/api/v1/logs-web/" method="post">
7
  <label for="pc">PC:</label>
8
  <select id="pc" name="pc">
9
      <option value="all">all</option>
10
      {% for pc in pcs %}
11
    <option value={{pc.id}}>{{pc.username}}</option>
12
      {% endfor %}
6
<form action="" method="get">
7
  <label for="view">Choose view:</label>
8
  <select id="view" name="view" onchange="this.form.action=this.value;">
9
      <option value=""></option>
10
      <option value="/api/v1/logs-web">Logs</option>
11
      <option value="/api/v1/devices-web">Devices</option>
12
      <option value="/api/v1/teams-web">Teams</option>
13
      <option value="/api/v1/pcs-web">PCs</option>
13 14
  </select>
15
  <input type="submit" value="OK">
16
</form>
17
<form action="/api/v1/logs-web" method="post">
18
  <label for="pc">PC:</label>
19
  <input id="pc" name="pc" type="text" list="pcs" value="" placeholder="all">
20
    <datalist id="pcs">
21
        {% for pc in pcs %}
22
        <option value="{{pc.username}}"></option>
23
        {% endfor %}
24
    </datalist>
25
    <label for="team">Team:</label>
26
  <input id="team" name="team" type="text" list="teams" value="" placeholder="all">
27
    <datalist id="teams">
28
        {% for team in teams %}
29
        <option value="{{team.name}}"></option>
30
        {% endfor %}
31
    </datalist>
32
    <label for="lic">License:</label>
33
    <input id="lic" name="lic" type="text" list="licenses" value="" placeholder="all">
34
    <datalist id="licenses">
35
        {% for license in licenses %}
36
        <option value="{{license.name}}"></option>
37
        {% endfor %}
38
    </datalist>
14 39
  <input type="submit" value="Filter">
15 40
</form>
16 41
    <table>
......
18 43
        <TH>ID</TH>
19 44
        <TH>PC Username</TH>
20 45
        <TH>PC Hostname</TH>
46
        <TH>Team</TH>
21 47
        <TH>Timestamp</TH>
22 48
        <TH>Status</TH>
23 49
        <TH>Device Product ID</TH>
......
28 54
        <TD class="ID">{{log.id}}</TD>
29 55
        <TD class="Username">{{log.pc.username}}</TD>
30 56
        <TD class="Hostname">{{log.pc.hostname}}</TD>
57
        {% if log.pc.team == None %}
58
            <TD class="Team">NONE</TD>
59
        {% else %}
60
            <TD class="Team">{{log.pc.team.name}}</TD>
61
        {% endif %}
31 62
        <TD class="Timestamp">{{log.timestamp}}</TD>
32 63
        <TD class="Status">{{log.status}}</TD>
33 64
        <TD class="DeviceProductID">{{log.device.product_id}}</TD>
......
37 68
</table>
38 69
</body>
39 70
</html>
71

  

Také k dispozici: Unified diff