Skip to content

Commit

Permalink
Improvements to & New Web Views/Jinja Templates
Browse files Browse the repository at this point in the history
Improvements to & New Web Views/Jinja Templates
  + Major improvements to existing web routes and templates
    + Tables to display recipe result history, note history, and more (to come)
  + Several new web routes and templates to support new functionality
    + Create new recipe
    + Update recipe
    + Update package
  • Loading branch information
MLBZ521 committed Jul 27, 2023
1 parent 83ed8f5 commit 683d209
Show file tree
Hide file tree
Showing 8 changed files with 1,063 additions and 347 deletions.
168 changes: 153 additions & 15 deletions pkgbot/api/views.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from datetime import datetime

from fastapi import APIRouter, Depends, Request, UploadFile
from fastapi.responses import HTMLResponse
from fastapi import APIRouter, Depends, Form, Request, UploadFile, status
from fastapi.responses import RedirectResponse, HTMLResponse
from fastapi.templating import Jinja2Templates

from pkgbot import api, config, core
# from pkgbot.db import models
from pkgbot.utilities import common as utility


Expand Down Expand Up @@ -59,16 +60,68 @@ async def package_history(request: Request):
async def get_package(request: Request):

pkg = await core.package.get({"id": request.path_params['id']})
return templates.TemplateResponse("package.html", { "request": request, "package": pkg })


@router.get("/edit/{id}", response_class=HTMLResponse)
async def edit(request: Request):

pkg = await core.package.get({"id": request.path_params['id']})

return templates.TemplateResponse("edit.html",
{ "request": request, "package": pkg })
notes = await core.package.get_note({ "package_id": pkg.pkg_name })
pkg_holds = await core.package.get_hold({ "package_id": pkg.pkg_name })

notes_table_headers = [ "Note", "Submitted By", "Time Stamp" ]
pkg_holds_table_headers = [ "Site", "State", "Time Stamp", "Submitted By" ]

return templates.TemplateResponse("package.html",
{
"request": request,
"package": pkg,
"notes": notes,
"notes_table_headers": notes_table_headers,
"pkg_holds": pkg_holds,
"pkg_holds_table_headers": pkg_holds_table_headers
})


@router.post("/package/{id}", response_class=HTMLResponse)
async def update_package(request: Request):

db_id = request.path_params.get("id")
await core.package.get({"id": db_id})

updates, pkg_note, site_tags = await parse_form(request)

await core.package.update({"id": db_id}, updates)

if pkg_note:
pkg_note["package_id"] = updates.get("pkg_name")
await core.package.create_note(pkg_note)

##### Need to setup
remove_site_tags = [ site for site in (request.state.user.site_access).split(", ") if site not in site_tags ]

for site in site_tags:
await core.package.create_hold({
"enabled": True,
"package_id": updates.get("pkg_name"),
"site": site,
"submitted_by": request.state.user.username
})
##### Determine which version to use...
# Maintains a single record for package/site combination...
# result, result_bool = await models.PackageHold.update_or_create(
# {
# "enabled": True,
# "package_id": updates.get("pkg_name"),
# "site": site,
# "submitted_by": request.state.user.username
# },
# site=site
# )

session_vars = { "action_result": "updated the recipe!" }

try:
request.state.pkgbot = session_vars
except:
request.state.pkgbot |= session_vars

redirect_url = request.url_for(name="get_package", **{"id": db_id})
return RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER)


@router.get("/recipes", response_class=HTMLResponse)
Expand All @@ -87,14 +140,99 @@ async def recipe_list(request: Request):
async def get_recipe(request: Request):

recipe = await core.recipe.get({"id": request.path_params['id']})
pkg = await core.recipe.get({"id": request.path_params['id']})
results = await core.recipe.get_result({"recipe_id": recipe.recipe_id})
notes = await core.recipe.get_note({"recipe_id": recipe.recipe_id})

notes_table_headers = [ "Note", "Submitted By", "Time Stamp" ]
results_table_headers = [ "Event", "Status", "Last Update", "Updated By", "Task ID", "Details" ]

return templates.TemplateResponse("recipe.html",
{ "request": request, "recipe": pkg })
{
"request": request,
"recipe": recipe,
"notes": notes,
"notes_table_headers": notes_table_headers,
"results": results,
"results_table_headers": results_table_headers
}
)


@router.post("/recipe/{id}", response_class=HTMLResponse)
async def update_recipe(request: Request):

db_id = request.path_params.get("id")
recipe, recipe_note, _ = await parse_form(request)

await core.recipe.update({"id": db_id}, recipe)

if recipe_note:
recipe_note["recipe_id"] = recipe.get("recipe_id")
await core.recipe.create_note(recipe_note)

redirect_url = request.url_for(name="get_recipe", **{"id": db_id})
return RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER)


@router.get("/create/recipe", response_class=HTMLResponse)
async def new_recipe(request: Request):

if request.state.user.get("full_admin"):
return templates.TemplateResponse("recipe_create.html", { "request": request })


@router.post("/create/recipe", response_class=HTMLResponse,
dependencies=[Depends(core.user.verify_admin)])
async def create_recipe(
request: Request):

recipe, recipe_note, _ = await parse_form(request)
results = await core.recipe.create(recipe)

if recipe_note:
recipe_note["recipe_id"] = recipe.get("recipe_id")
await core.recipe.create_note(recipe_note)

redirect_url = request.url_for(name="get_recipe", **{"id": results.id})
return RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER)


@router.post("/icons")
async def upload_icon(icon: UploadFile):

await utility.save_icon(icon)
return { "result": "Successfully uploaded icon", "filename": icon.filename }
return { "result": "Successfully uploaded icon", "filename": icon.filename }


async def parse_form(request):

form_submission = await request.form()
restricted_form_items = {
"recipe_id", "enabled", "pkg_only", "manual_only", "schedule", "pkg_name",
"packaged_date", "promoted_date", "last_update", "pkg_status"
}
form_items = restricted_form_items.union({ "note", "site_tag" })
note = {}
site_tags = []
updates = {}

for key, value in form_submission.multi_items():

if key not in form_items or (
key in restricted_form_items and not request.state.user.get("full_admin")
):
continue

elif key == "site_tag":
site_tags.append(value)

elif key == "note":
note = {
"note": value,
"submitted_by": request.state.user.username
}

else:
updates[key] = value

return updates, note, site_tags
Loading

0 comments on commit 683d209

Please sign in to comment.