Projekt

Obecné

Profil

« Předchozí | Další » 

Revize eaf8ace4

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

Added functionality for creating licenses and teams and connecting them to devices a PCs.

Zobrazit rozdíly:

server/requirements.txt
3 3
SQLAlchemy==1.4.32
4 4
uvicorn==0.17.6
5 5
psycopg2-binary==2.8.6
6
jinja2==3.1.1
6
jinja2==3.1.1
7
python-multipart==0.0.5
server/sql_app/api/devices_web.py
11 11
from fastapi.templating import Jinja2Templates
12 12

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

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

  
......
28 28
@device_web.get("/devices-web", response_class=HTMLResponse)
29 29
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
30 30
    devices = crud.get_devices(db, skip=skip, limit=limit)
31
    return templates.TemplateResponse("devices.html", {"request": request, "devs": devices})
31
    statuses = []
32
    for i in range(0, len(devices)):
33
        statuses.append(devices[i].logs[len(devices[i].logs)-1].status)
34
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
35
    return templates.TemplateResponse("devices.html", {"request": request, "devs": len(devices), "devices": devices,
36
                                                       "statuses": statuses, "licenses": licenses})
32 37

  
33 38

  
34 39
@device_web.post("/devices-web", response_class=HTMLResponse)
......
42 47
                def_devices.append(dev)
43 48
    if lic == "all":
44 49
        def_devices = devices
45
    return templates.TemplateResponse("devices.html", {"request": request, "devs": def_devices})
50
    statuses = []
51
    for i in range(0, len(def_devices)):
52
        statuses.append(def_devices[i].logs[len(def_devices[i].logs) - 1].status)
53
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
54
    return templates.TemplateResponse("devices.html", {"request": request, "devs": len(def_devices), "devices": def_devices,
55
                                                       "statuses": statuses, "licenses": licenses})
56

  
57

  
58
@device_web.get("/device-license/{device_id}", response_class=HTMLResponse)
59
async def connect_dev_lic(request: Request, device_id: int, db: Session = Depends(get_db)):
60
    device = crud.get_device(db, device_id)
61
    licenses = crud.get_licenses(db, 0, 100)
62
    return templates.TemplateResponse("devicelicense.html",
63
                                      {"request": request, "device": device, "licenses": licenses})
64

  
65

  
66
@device_web.post("/devices-web/{device_id}", response_class=HTMLResponse)
67
async def connect_post(request: Request, device_id: int, lic: str = Form(...), skip: int = 0, limit: int = 100,
68
                       db: Session = Depends(get_db)):
69
    crud.create_device_license(db, device_id, int(lic), datetime.now())
70
    devices = crud.get_devices(db, skip=skip, limit=limit)
71
    statuses = []
72
    for i in range(0, len(devices)):
73
        statuses.append(devices[i].logs[len(devices[i].logs) - 1].status)
74
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
75
    return templates.TemplateResponse("devices.html", {"request": request, "devs": len(devices), "devices": devices,
76
                                                       "statuses": statuses, "licenses": licenses})
server/sql_app/api/licenses_web.py
11 11
from fastapi.templating import Jinja2Templates
12 12

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

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

  
......
42 43
    db_license = crud.create_license(db, name, expdate)
43 44
    if db_license is None:
44 45
        print("something went wrong")
46
    devices = crud.get_devices(db, skip=skip, limit=limit)
47
    statuses = []
48
    for i in range(0, len(devices)):
49
        statuses.append(devices[i].logs[len(devices[i].logs) - 1].status)
45 50
    licenses = crud.get_licenses(db, skip=skip, limit=limit)
46
    return templates.TemplateResponse("licenses.html", {"request": request, "licenses": licenses})
51
    return device_templates.TemplateResponse("devices.html", {"request": request, "devs": len(devices), "devices": devices,
52
                                                       "statuses": statuses, "licenses": licenses})
server/sql_app/api/pcs_web.py
9 9
from fastapi.templating import Jinja2Templates
10 10

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

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

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

  
31

  
32
@pcs_web.get("/pc-team/{pc_id}", response_class=HTMLResponse)
33
async def connect_pc_team(request: Request, pc_id: int, db: Session = Depends(get_db)):
34
    pc = crud.get_pc(db, pc_id)
35
    teams = crud.get_teams(db, 0, 100)
36
    return templates.TemplateResponse("pcteam.html",
37
                                      {"request": request, "pc": pc, "teams": teams})
38

  
39

  
40
@pcs_web.post("/pcs-web/{pc_id}", response_class=HTMLResponse)
41
async def connect_post(request: Request, pc_id: int, team: str = Form(...), skip: int = 0, limit: int = 100,
42
                       db: Session = Depends(get_db)):
43
    old_pc = crud.update_pc(db, pc_id, team)
44
    pcs = crud.get_pcs(db, skip=skip, limit=limit)
45
    return templates.TemplateResponse("pcs.html", {"request": request, "pcs": pcs})
server/sql_app/api/teams_web.py
10 10
from fastapi.templating import Jinja2Templates
11 11

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

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

  
......
28 28
async def read_devices(request: Request, skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
29 29
    teams = crud.get_teams(db, skip=skip, limit=limit)
30 30
    return templates.TemplateResponse("teams.html", {"request": request, "teams": teams})
31

  
32

  
33
@teams_web.get("/team-create", response_class=HTMLResponse)
34
async def team_create_web(request: Request):
35
    return templates.TemplateResponse("team_create.html", {"request": request})
36

  
37

  
38
@teams_web.post("/teams-web", response_class=HTMLResponse)
39
def create_team(request: Request, name: str = Form(...), skip: int = 0, limit: int = 100,
40
                   db: Session = Depends(get_db)):
41
    team = crud.create_team(db, name)
42
    if team is None:
43
        print("something went wrong")
44
    teams = crud.get_teams(db, skip=skip, limit=limit)
45
    return templates.TemplateResponse("teams.html", {"request": request, "teams": teams})
server/sql_app/api/usb_logs.py
32 32
    print(crud.create_device_logs(db=db, item=log, dev_id=dev.id, pc_id=pc.id, date=dat))
33 33

  
34 34

  
35
@usblogs.post("/ld-logs", response_model=schemas.LDLog)
36
def create_ld_logs(log: schemas.LDTempBase, db: Session = Depends(get_db)):
37
    head_dev = crud.find_head_device(db, log.head_device)
38
    body_dev = crud.find_body_device(db, log.body_device)
39
    if head_dev is None:
40
        crud.create_head_device(db, log.head_device)
41
    if body_dev is None:
42
        crud.create_body_device(db, log.body_device)
43

  
44
    pc = crud.find_pc(db, log.username, log.hostname)
45
    if pc is None:
46
        pc = crud.create_pc(db=db, user=log.username, host=log.hostname)
47
    dat = datetime.strptime(log.timestamp, '%Y-%m-%d %H:%M:%S')
48
    print(crud.create_ld_logs(db=db, item=log, head_id=head_dev.id, body_id=body_dev.id, pc_id=pc.id, date=dat))
49

  
50

  
35 51
@usblogs.get("/logs", response_model=List[schemas.USBLog])
36 52
def read_logs(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
37 53
    items = crud.get_logs(db, skip=skip, limit=limit)
server/sql_app/api/usb_logs_web.py
10 10
from fastapi.templating import Jinja2Templates
11 11

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

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

  
server/sql_app/crud.py
134 134
    return db_team
135 135

  
136 136

  
137
def get_head_device(db: Session, head_id: int):
138
    return db.query(models.HeadDevice).filter(models.HeadDevice.id == head_id).first()
139

  
140

  
141
def get_head_devices(db: Session, skip: int = 0, limit: int = 100):
142
    return db.query(models.HeadDevice).offset(skip).limit(limit).all()
143

  
144

  
145
def find_head_device(db: Session, serial: schemas.HeadDeviceBase):
146
    return db.query(models.HeadDevice).filter(models.HeadDevice.serial_number == serial.serial_number).first()
147

  
148

  
149
def create_head_device(db: Session, log: schemas.HeadDeviceBase):
150
    db_head = models.HeadDevice(serial_number=log.serial_number)
151
    db.add(db_head)
152
    db.commit()
153
    db.refresh(db_head)
154
    return db_head
155

  
156

  
157
def get_body_device(db: Session, body_id: int):
158
    return db.query(models.BodyDevice).filter(models.BodyDevice.id == body_id).first()
159

  
160

  
161
def get_body_devices(db: Session, skip: int = 0, limit: int = 100):
162
    return db.query(models.BodyDevice).offset(skip).limit(limit).all()
163

  
164

  
165
def find_body_device(db: Session, serial: schemas.BodyDeviceBase):
166
    return db.query(models.BodyDevice).filter(models.BodyDevice.serial_number == serial.serial_number).first()
167

  
168

  
169
def create_body_device(db: Session, log: schemas.BodyDeviceBase):
170
    db_body = models.BodyDevice(serial_number=log.serial_number)
171
    db.add(db_body)
172
    db.commit()
173
    db.refresh(db_body)
174
    return db_body
175

  
176

  
177
def get_ld_logs(db: Session, skip: int = 0, limit: int = 100):
178
    return db.query(models.LDLog).offset(skip).limit(limit).all()
179

  
180

  
181
def create_ld_logs(db: Session, item: schemas.LDTempBase, head_id: int, body_id: int, pc_id: int, date: datetime):
182
    db_ld = models.LDLog(pc_id=pc_id, timestamp=date, status=item.status, head_id=head_id, body_id=body_id)
183
    db.add(db_ld)
184
    db.commit()
185
    db.refresh(db_ld)
186
    return db_ld
187

  
188

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

  
......
184 236
    db.commit()
185 237
    db.refresh(db_log)
186 238
    return db_log
187

  
server/sql_app/main.py
28 28
'''
29 29
if __name__ == "__main__":
30 30
    uvicorn.run(app, host="192.168.0.22", port=8000)
31
'''
31
'''
server/sql_app/models.py
63 63

  
64 64
    team = relationship("Team", back_populates="pcs")
65 65
    logs_pc = relationship("USBLog", back_populates="pc")
66
    ld_pc = relationship("LDLog", back_populates="ldpc")
66 67

  
67 68

  
68 69
class Team(Base):
......
71 72
    id = Column(Integer, primary_key=True, index=True)
72 73
    name = Column(String, index=True, nullable=False)
73 74
    pcs = relationship("PC", back_populates="team")
75

  
76

  
77
class HeadDevice(Base):
78
    __tablename__ = "head_devices"
79

  
80
    id = Column(Integer, primary_key=True, index=True)
81
    serial_number = Column(String, index=True, nullable=False)
82

  
83
    h_logs = relationship("LDLog", back_populates="head_device")
84

  
85

  
86
class BodyDevice(Base):
87
    __tablename__ = "body_devices"
88

  
89
    id = Column(Integer, primary_key=True, index=True)
90
    serial_number = Column(String, index=True, nullable=False)
91

  
92
    b_logs = relationship("LDLog", back_populates="body_device")
93

  
94

  
95
class LDLog(Base):
96
    __tablename__ = "ld_logs"
97

  
98
    id = Column(Integer, primary_key=True, index=True)
99
    pc_id = Column(Integer, ForeignKey("pc.id"))
100
    timestamp = Column(DateTime(timezone=True), server_default=func.now())
101
    status = Column(String, index=True, nullable=False)
102
    head_id = Column(Integer, ForeignKey("head_devices.id"))
103
    body_id = Column(Integer, ForeignKey("body_devices.id"))
104

  
105
    ldpc = relationship("PC", back_populates="ld_pc")
106
    head_device = relationship("HeadDevice", back_populates="h_logs")
107
    body_device = relationship("BodyDevice", back_populates="b_logs")
server/sql_app/schemas.py
58 58
        orm_mode = True
59 59

  
60 60

  
61
class LDLogBase(BaseModel):
62
    timestamp: datetime
63
    status: str
64

  
65

  
66
class LDLogCreate(LDLogBase):
67
    pass
68

  
69

  
70
class LDLog(LDLogCreate):
71
    id: int
72
    head_id: int
73
    body_id: int
74

  
75
    class Config:
76
        orm_mode = True
77

  
78

  
79
class BodyDeviceBase(BaseModel):
80
    serial_number: str
81

  
82

  
83
class BodyDeviceCreate(BodyDeviceBase):
84
    pass
85

  
86

  
87
class BodyDevice(BodyDeviceCreate):
88
    id: int
89
    logs: List[LDLog] = []
90

  
91
    class Config:
92
        orm_mode = True
93

  
94

  
95
class HeadDeviceBase(BaseModel):
96
    serial_number: str
97

  
98

  
99
class HeadDeviceCreate(HeadDeviceBase):
100
    pass
101

  
102

  
103
class HeadDevice(HeadDeviceCreate):
104
    id: int
105
    logs: List[LDLog] = []
106

  
107
    class Config:
108
        orm_mode = True
109

  
110

  
61 111
class PCBase(BaseModel):
62 112
    username: str
63 113
    hostname: str
......
127 177

  
128 178
    class Config:
129 179
        orm_mode = True
180

  
181

  
182
class LDTempBase(BaseModel):
183
    username: str
184
    hostname: str
185
    timestamp: str
186
    head_device: HeadDeviceBase
187
    body_device: BodyDeviceBase
188
    status: str
189

  
190

  
191
class LDTempCreate(LDTempBase):
192
    pass
193

  
194

  
195
class LDTemp(LDTempCreate):
196
    id: int
197
    head_id: int
198
    body_id: int
199

  
200
    class Config:
201
        orm_mode = True
server/templates/devices/devicelicense.html
1
<!DOCTYPE html>
2
<html lang="en">
3
<head>
4
    <meta charset="UTF-8">
5
    <title>Device License Connect</title>
6
</head>
7
<body>
8
<h6><p>Vendor ID: {{device.vendor_id}}</p>
9
    <p>Product ID: {{device.product_id}}</p>
10
    <p>Serial Number: {{device.serial_number}}</p>
11
</h6>
12
<form action="/api/v1/devices-web/{{device.id}}" method="post">
13
  <label for="lic">Licenses:</label>
14
  <select id="lic" name="lic">
15
      {% for license in licenses %}
16
    <option value={{license.id}}>{{license.name}}</option>
17
      {% endfor %}
18
  </select>
19
  <input type="submit" value="Connect">
20
</form>
21
</body>
22
</html>
server/templates/devices/devices.html
31 31
        <TH>Product ID</TH>
32 32
        <TH>Serial Number</TH>
33 33
        <TH>Licenses</TH>
34
        <TH>Status</TH>
34 35
    </TR>
35
    {% for device in devs %}
36
    {% for i in range(devs) %}
36 37
    <TR>
37
        <TD class="ID">{{device.id}}</TD>
38
        <TD class="Vendor ID">{{device.vendor_id}}</TD>
39
        <TD class="Product ID">{{device.product_id}}</TD>
40
        <TD class="Serial Number">{{device.serial_number}}</TD>
38
        <TD class="ID"><a href="/api/v1/device-license/{{devices[i].id}}">{{devices[i].id}}</a></TD>
39
        <TD class="Vendor ID">{{devices[i].vendor_id}}</TD>
40
        <TD class="Product ID">{{devices[i].product_id}}</TD>
41
        <TD class="Serial Number">{{devices[i].serial_number}}</TD>
41 42
        <TD class="License">
42
            {% for lic in device.licenses %}
43
            {% for lic in devices[i].licenses %}
43 44
                {{lic.licenses.name}}<BR>
44 45
            {% endfor %}
45 46
        </TD>
47
        <TD class="Status">{{statuses[i]}}</TD>
46 48
    </TR>
47 49
    {% endfor %}
50
    <TR>
51
        <TD class="ID"></TD>
52
        <TD class="Vendor ID"></TD>
53
        <TD class="Product ID"></TD>
54
        <TD class="Serial Number"></TD>
55
        <TD class="License">
56
            <form action="/api/v1/license-create" method="get">
57
                <input type="submit" value="Add">
58
            </form>
59
        </TD>
60
    </TR>
48 61
</table>
49 62
</body>
50 63
</html>
server/templates/pcs/pcs.html
23 23
    </TR>
24 24
    {% for pc in pcs %}
25 25
    <TR>
26
        <TD class="ID">{{pc.id}}</TD>
26
        <TD class="ID"><a href="/api/v1/pc-team/{{pc.id}}">{{pc.id}}</a></TD>
27 27
        <TD class="Vendor ID">{{pc.username}}</TD>
28 28
        <TD class="Product ID">{{pc.hostname}}</TD>
29 29
        {% if pc.team == None %}
server/templates/pcs/pcteam.html
1
<!DOCTYPE html>
2
<html lang="en">
3
<head>
4
    <meta charset="UTF-8">
5
    <title>PC Team connect</title>
6
</head>
7
<body>
8
<h6><p>Username: {{pc.username}}</p>
9
    <p>Hostname: {{pc.hostname}}</p>
10
</h6>
11
<form action="/api/v1/pcs-web/{{pc.id}}" method="post">
12
  <label for="team">Teams:</label>
13
  <select id="team" name="team">
14
      {% for team in teams %}
15
    <option value={{team.id}}>{{team.name}}</option>
16
      {% endfor %}
17
  </select>
18
  <input type="submit" value="Connect">
19
</form>
20
</body>
21
</html>
server/templates/teams/team_create.html
1
<!DOCTYPE html>
2
<html lang="en">
3
<head>
4
    <meta charset="UTF-8">
5
    <title>Create a Team</title>
6
</head>
7
<body>
8
<form action="/api/v1/teams-web" method="post">
9
  <label for="name">Name:</label><br>
10
  <input type="text" id="name" name="name"><br><br>
11
  <input type="submit" value="Submit">
12
</form>
13
</body>
14
</html>
server/templates/teams/teams.html
26 26
    </TR>
27 27
    {% endfor %}
28 28
</table>
29
<form action="/api/v1/team-create" method="get">
30
    <input type="submit" value="Add">
31
</form>
29 32
</body>
30 33
</html>

Také k dispozici: Unified diff