Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 54840605

Přidáno uživatelem Matěj Zeman před více než 2 roky(ů)

First api implementation. Lacks postgresql connection and web templates

Zobrazit rozdíly:

server/sql_app/crud.py
1
from sqlalchemy.orm import Session
2

  
3
from . import models, schemas
4

  
5

  
6
def get_device(db: Session, device_id: int):
7
    return db.query(models.Device).filter(models.Device.id == device_id).first()
8

  
9
def get_devices(db: Session, skip: int = 0, limit: int = 100):
10
    return db.query(models.Device).offset(skip).limit(limit).all()
11

  
12

  
13
def create_device(db: Session, device: schemas.DeviceCreate):
14
    db_device = models.Device(vendor_id=device.vendor_id, product_id=device.product_id)
15
    db.add(db_device)
16
    db.commit()
17
    db.refresh(db_device)
18
    return db_device
19

  
20

  
21
def get_logs(db: Session, skip: int = 0, limit: int = 100):
22
    return db.query(models.USBLog).offset(skip).limit(limit).all()
23

  
24
def get_log(db: Session, device_id: int, skip: int=0, limit: int=100):
25
    return db.query(models.USBLog).filter(models.USBLog.device_id == device_id).offset(skip).limit(limit).all()
26

  
27
def create_device_logs(db: Session, item: schemas.USBLogCreate, dev_id: int):
28
    db_log = models.USBLog(**item.dict(), device_id=dev_id)
29
    db.add(db_log)
30
    db.commit()
31
    db.refresh(db_log)
32
    return db_log
33

  
server/sql_app/database.py
1
from sqlalchemy import create_engine
2
from sqlalchemy.ext.declarative import declarative_base
3
from sqlalchemy.orm import sessionmaker
4

  
5
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
6

  
7
engine = create_engine(
8
    SQLALCHEMY_DATABASE_URL
9
)
10
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
11

  
12
Base = declarative_base()
13

  
server/sql_app/main.py
1
from typing import List
2

  
3
from fastapi import Depends, FastAPI, HTTPException
4
from sqlalchemy.orm import Session
5

  
6
from . import crud, models, schemas
7
from .database import SessionLocal, engine
8

  
9
models.Base.metadata.create_all(bind=engine)
10

  
11

  
12
app = FastAPI()
13
    
14
# Dependency
15
def get_db():
16
    db = SessionLocal()
17
    try:
18
        yield db
19
    finally:
20
        db.close()
21

  
22

  
23
@app.post("/device/", response_model=schemas.Device)
24
def create_device(device: schemas.DeviceCreate, db: Session = Depends(get_db)):
25
    return crud.create_device(db=db, device=device)
26

  
27
@app.get("/devices/", response_model=List[schemas.Device])
28
def read_devices(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
29
    devices = crud.get_devices(db, skip=skip, limit=limit)
30
    return devices
31

  
32

  
33
@app.get("/device/{device_id}", response_model=schemas.Device)
34
def read_device(device_id: int, db: Session = Depends(get_db)):
35
    db_device = crud.get_device(db, device_id=device_id)
36
    if db_device is None:
37
        raise HTTPException(status_code=404, detail="Device not found")
38
    return db_device
39

  
40

  
41
@app.post("/api/v1/logs/{device_id}/", response_model=schemas.USBLog)
42
def create_device_logs(device_id: int, log: schemas.USBLogCreate, db: Session = Depends(get_db)):
43
    return crud.create_device_logs(db=db, item=log, dev_id=device_id)
44

  
45

  
46
@app.get("/logs/", response_model=List[schemas.USBLog])
47
def read_logs(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
48
    items = crud.get_logs(db, skip=skip, limit=limit)
49
    return items
50

  
51
@app.get("/logs/{device_id}", response_model=List[schemas.USBLog])
52
def read_log(device_id: int, db: Session = Depends(get_db)):
53
    db_log = crud.get_log(db, device_id=device_id)
54
    if db_log is None:
55
        raise HTTPException(status_code=404, detail="Logs not found")
56
    return db_log
57

  
server/sql_app/models.py
1
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
2
from sqlalchemy.orm import relationship
3

  
4
from .database import Base
5

  
6

  
7
class Device(Base):
8
    __tablename__ = "usb_devices"
9

  
10
    id = Column(Integer, primary_key=True, index=True)
11
    vendor_id = Column(Integer, index=True, nullable=False)
12
    product_id = Column(Integer, index=True, nullable=False)
13

  
14
    logs = relationship("USBLog", back_populates="device")
15

  
16

  
17
class USBLog(Base):
18
    __tablename__ = "usb_logs"
19

  
20
    id = Column(Integer, primary_key=True, index=True)
21
    username = Column(String, index=True, nullable=False)
22
    hostname = Column(String, index=True, nullable=False)
23
    timestamp = Column(String, index=True, nullable=False)
24
    status = Column(String, index=True, nullable=False)
25
    device_id = Column(Integer, ForeignKey("usb_devices.id"))
26

  
27
    device = relationship("Device", back_populates="logs")
28

  
server/sql_app/schemas.py
1
from typing import List, Optional
2

  
3
from pydantic import BaseModel
4

  
5

  
6
class USBLogBase(BaseModel):
7
    username: str
8
    hostname: str
9
    timestamp: str
10
    status: str
11

  
12

  
13
class USBLogCreate(USBLogBase):
14
    pass
15

  
16

  
17
class USBLog(USBLogBase):
18
    id: int
19
    device_id: int
20

  
21
    class Config:
22
        orm_mode = True
23
        
24
class DeviceBase(BaseModel):
25
    vendor_id: int
26
    product_id: int
27

  
28

  
29
class DeviceCreate(DeviceBase):
30
    pass
31

  
32

  
33
class Device(DeviceBase):
34
    id: int
35
    logs: List[USBLog] = []
36
    class Config:
37
        orm_mode = True
38

  

Také k dispozici: Unified diff