Skip to content

Commit

Permalink
parts datatable api now working with dummy data and made async
Browse files Browse the repository at this point in the history
  • Loading branch information
madeinoz67 committed May 24, 2021
1 parent 370e039 commit 91dd042
Show file tree
Hide file tree
Showing 19 changed files with 176 additions and 97 deletions.
24 changes: 9 additions & 15 deletions app/api/part_api.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import fastapi
from fastapi.param_functions import Depends

from app.schema.datatable import FormRequest
from app.schema.datatable import DataTableRequest, DataTableResponse
from app.services import part_service

api = fastapi.APIRouter()


@api.post("/api/part/table")
def table_datasource(request: FormRequest = Depends):
@api.post("/api/part/datatable")
async def table_datasource(request: DataTableRequest) -> DataTableResponse:
"""Parts Datatable Source
Returns:
Expand All @@ -17,14 +16,9 @@ def table_datasource(request: FormRequest = Depends):

draw = request.draw

# search_str = request.query_params["search[value]"]
# is_regex = bool(request.query_params["search[regex]"])
# start = int(request.query_params["start"])
# limit = int(request.query_params["length"])
data = part_service.latest_parts(limit=30)
return {
"draw": draw,
"recordsTotal": 100,
"recordsFiltered": 100,
"data": data,
}
data = await part_service.get_latest_parts(
start=request.start, limit=request.length
)
return DataTableResponse(
draw=draw, recordsTotal=100, recordsFiltered=100, data=data
)
6 changes: 5 additions & 1 deletion app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@

from app.api import part_api

app = fastapi.FastAPI()
app = fastapi.FastAPI(
title="Maker Hub",
description="Personal Hub for makers: Manage Parts, projects, ideas, documentation, parts and footprints etc",
version="2021.0.0-dev1",
)


def main():
Expand Down
67 changes: 45 additions & 22 deletions app/schema/datatable.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
from typing import List
from typing import List, Optional

from fastapi import Form
from pydantic import BaseModel

from app.schema.part import Part


class Search(BaseModel):
value: str = ""
regex: bool = False


class Order(BaseModel):
column: int = 1
column: int
dir: str = "asc"


class Column(BaseModel):
name: str = ""
data: str = ""
name: str
data: str
searchable: bool = True
orderable: bool = True
search: Search
Expand All @@ -26,27 +27,49 @@ class DataTableBase(BaseModel):
draw: int


class TableRequest(DataTableBase):
class DataTableRequest(DataTableBase):
start: int
length: int
search: Search
order: Order
columns: List[Column] = []
order: List[Order]
columns: List[Column]


class TableResponse(DataTableBase):
class DataTableResponse(DataTableBase):
recordsTotal: int
recordsFiltered: int
data: list
error: str


class FormRequest(BaseModel):
draw: int
start: int
length: int

def __init__(
self, draw: str = Form(...), start: int = Form(...), length: int = Form(...)
):
super().__init__(draw, start, length)
data: List[Part] = []
error: Optional[str] = None


# Example DataTable generated Query
# {
# "draw": 1,
# "columns": [
# {
# "data": "id",
# "name": "",
# "searchable": false,
# "orderable": false,
# "search": {"value": "", "regex": false},
# },
# {
# "data": "name",
# "name": "",
# "searchable": true,
# "orderable": true,
# "search": {"value": "", "regex": false},
# },
# {
# "data": "description",
# "name": "",
# "searchable": true,
# "orderable": true,
# "search": {"value": "", "regex": false},
# },
# ],
# "order": [{"column": 1, "dir": "asc"}],
# "start": 0,
# "length": 100,
# "search": {"value": "", "regex": false},
# }
13 changes: 8 additions & 5 deletions app/services/part_service.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
from typing import List
from app.schema.part import Part


def get_part_count() -> int:
async def get_part_count() -> int:
return 283


def get_total_stock() -> int:
async def get_total_stock() -> int:
return 1_000


def get_stock_value() -> int:
async def get_stock_value() -> int:
return 1_500


def get_latest_parts(start: int = 0, limit: int = 5) -> List:
async def get_latest_parts(
start: int = 0, limit: int = 5
) -> List: # TODO change return to List[Part] when implemented

start = max(0, start)
limit = max(0, limit)
Expand Down Expand Up @@ -521,4 +524,4 @@ def get_latest_parts(start: int = 0, limit: int = 5) -> List:
},
]

return data[start:limit]
return data[start : start + limit] # noqa: E203
4 changes: 2 additions & 2 deletions app/services/project_service.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from typing import List


def get_project_count() -> int:
async def get_project_count() -> int:
return 34


def get_latest_projects(start: int = 0, limit: int = 5) -> List:
async def get_latest_projects(start: int = 0, limit: int = 5) -> List:

start = max(0, start)
limit = max(0, limit)
Expand Down
4 changes: 2 additions & 2 deletions app/services/storage_service.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
def get_location_count() -> int:
async def get_location_count() -> int:
return 234


def get_locations_used() -> int:
async def get_locations_used() -> int:
return 230
12 changes: 9 additions & 3 deletions app/templates/parts/partslist.pt
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,21 @@
'select': {
'style': 'multi'
},
"lengthMenu": [[100, 30, 50, -1], [100, 30, 50, "All"]],
"lengthMenu": [[10, 30, 50, 100], [10, 30, 50, 100]],
"responsive": 'true',
'order': [[1, 'asc']],
"pagingType": "full_numbers",
serverSide: true,
ajax: {
url: '/api/part/table',
url: '/api/part/datatable',
type: 'POST',
datasource: 'data'
datasource: 'data',
dataType: 'json',
contentType: 'application/json',
processData: false, // avoid being transformed into a query string,
"data": function (d) {
return JSON.stringify(d);
}
},
columns: [
{ data: 'id' },
Expand Down
22 changes: 17 additions & 5 deletions app/viewmodels/home/index_viewmodel.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from starlette.requests import Request

from typing import List

from app.schema.part import Part
from app.services import part_service, project_service, storage_service
from app.viewmodels.shared.viewmodel import ViewModelBase

Expand All @@ -8,8 +11,17 @@ class IndexViewModel(ViewModelBase):
def __init__(self, request: Request):
super().__init__(request)

self.part_count: int = part_service.get_part_count()
self.location_count: int = storage_service.get_location_count()
self.project_count: int = project_service.get_project_count()
self.latest_parts = part_service.get_latest_parts(limit=7)
self.latest_projects = project_service.get_latest_projects(limit=7)
self.part_count: int = 0
self.location_count: int = 0
self.project_count: int = 0
self.latest_parts: List[Part] = []
self.latest_projects: List[
Part
] = [] # Todo: Change to correct Type once Project schema has been completed

async def load(self):
self.part_count = await part_service.get_part_count()
self.location_count = await storage_service.get_location_count()
self.project_count = await project_service.get_project_count()
self.latest_parts = await part_service.get_latest_parts(limit=7)
self.latest_projects = await project_service.get_latest_projects(limit=7)
5 changes: 4 additions & 1 deletion app/viewmodels/parts/partslist_viewmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ def __init__(self, request: Request):
super().__init__(request)

self.part_count: int = part_service.get_part_count()
self.parts = part_service.get_latest_parts(limit=30)

async def load(self):

self.part_count: int = await part_service.get_part_count()
6 changes: 6 additions & 0 deletions app/viewmodels/projects/projectslist_viewmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@
from app.services import project_service
from app.viewmodels.shared.viewmodel import ViewModelBase

from typing import List


class ProjectlistViewModel(ViewModelBase):
def __init__(self, request: Request):
super().__init__(request)

self.project_count: int = 0
self.projects: List = []

def load(self):
self.project_count: int = project_service.get_project_count()
self.projects = project_service.get_latest_projects(limit=30)
24 changes: 18 additions & 6 deletions app/viewmodels/reports/overview_viewmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,25 @@ def __init__(self, request: Request):
super().__init__(request)

# Parts Stats
self.total_parts: int = part_service.get_part_count()
self.total_stock: int = part_service.get_total_stock()
self.stock_value: float = part_service.get_stock_value()
self.total_parts: int = 0
self.total_stock: int = 0
self.stock_value: float = 0

# Location Stats
self.locations_total: int = storage_service.get_location_count()
self.locations_used: int = storage_service.get_locations_used()
self.locations_total: int = 0
self.locations_used: int = 0
# Project Stats
self.project_count: int = 0

async def load(self):
# Parts Stats
self.total_parts = await part_service.get_part_count()
self.total_stock = await part_service.get_total_stock()
self.stock_value = await part_service.get_stock_value()

# Location Stats
self.locations_total = await storage_service.get_location_count()
self.locations_used = await storage_service.get_locations_used()

# Project Stats
self.project_count: int = project_service.get_project_count()
self.project_count = await project_service.get_project_count()
5 changes: 4 additions & 1 deletion app/viewmodels/storage/storagelist_viewmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@ class StoragelistViewModel(ViewModelBase):
def __init__(self, request: Request):
super().__init__(request)

self.project_count: int = storage_service.get_location_count()
self.project_count: int = 0

async def load(self):
self.project_count = await storage_service.get_location_count()
3 changes: 2 additions & 1 deletion app/views/home.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

@router.get("/")
@template()
def index(request: Request):
async def index(request: Request):
vm = IndexViewModel(request)
await vm.load()
return vm.to_dict()


Expand Down
3 changes: 2 additions & 1 deletion app/views/parts.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

@router.get("/parts")
@template()
def partslist(request: Request):
async def partslist(request: Request):
vm = PartslistViewModel(request)
await vm.load()
return vm.to_dict()


Expand Down
3 changes: 2 additions & 1 deletion app/views/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

@router.get("/projects")
@template()
def projectlist(request: Request):
async def projectlist(request: Request):
vm = ProjectlistViewModel(request)
vm.load()
return vm.to_dict()


Expand Down
4 changes: 2 additions & 2 deletions app/views/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
from starlette.requests import Request

from app.viewmodels.reports.overview_viewmodel import OverviewViewModel
from app.viewmodels.shared.viewmodel import ViewModelBase

router = fastapi.APIRouter()


@router.get("/reports")
@template()
def overview(request: Request):
async def overview(request: Request):
vm = OverviewViewModel(request)
vm.load()
return vm.to_dict()
3 changes: 2 additions & 1 deletion app/views/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

@router.get("/storage")
@template()
def storagelist(request: Request):
async def storagelist(request: Request):
vm = StoragelistViewModel(request)
vm.load()
return vm.to_dict()


Expand Down
7 changes: 6 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
[flake8]
ignore = D401,D202,E226,E302,E41
max-line-length=120
exclude = migrations/*
exclude =
migrations/*
# TODO: remove these serivces once implemented
app/services/part_service.py
app/services/project_service.py
#
max-complexity = 10
Loading

0 comments on commit 91dd042

Please sign in to comment.