lib.itmens/catalog/api.py

109 lines
2.6 KiB
Python
Raw Normal View History

from ninja import NinjaAPI
2022-12-17 23:03:19 -05:00
from .models import *
from .common import *
from .sites import *
from django.conf import settings
2022-12-17 23:03:19 -05:00
from datetime import date
from ninja import Schema
from typing import List, Optional
from django.utils.baseconv import base62
from django.shortcuts import render, get_object_or_404, redirect, reverse
from django.http import Http404
2022-12-29 23:57:02 -05:00
api = NinjaAPI(
title=settings.SITE_INFO["site_name"],
version="1.0.0",
description=f"{settings.SITE_INFO['site_name']} API <hr/><a href='{settings.APP_WEBSITE}'>Learn more</a>",
)
2022-12-17 23:03:19 -05:00
class ItemIn(Schema):
title: str
brief: str
class ItemOut(Schema):
uuid: str
title: str
brief: str
url: str
api_url: str
category: str
class EditionIn(ItemIn):
subtitle: str = None
orig_title: str = None
author: list[str]
translator: list[str]
language: str = None
pub_house: str = None
pub_year: int = None
pub_month: int = None
binding: str = None
price: str = None
pages: str = None
series: str = None
imprint: str = None
class EditionOut(ItemOut):
subtitle: str = None
orig_title: str = None
author: list[str]
translator: list[str]
language: str = None
pub_house: str = None
pub_year: int = None
pub_month: int = None
binding: str = None
price: str = None
pages: str = None
series: str = None
imprint: str = None
@api.post("/catalog/fetch", response=ItemOut)
2022-12-18 20:28:39 -05:00
def fetch_item(request, url: str):
2022-12-17 23:03:19 -05:00
site = SiteManager.get_site_by_url(url)
if not site:
return Http404()
resource = site.get_resource_ready()
if not resource:
return Http404()
return site.get_item()
@api.post("/book/")
def create_edition(request, payload: EditionIn):
edition = Edition.objects.create(**payload.dict())
return {"id": edition.uuid}
@api.get("/book/{uuid}/", response=EditionOut)
def get_edition(request, uuid: str):
edition = get_object_or_404(Edition, uid=base62.decode(uuid))
return edition
# @api.get("/book", response=List[EditionOut])
# def list_editions(request):
# qs = Edition.objects.all()
# return qs
@api.put("/book/{uuid}/")
def update_edition(request, uuid: str, payload: EditionIn):
edition = get_object_or_404(Item, uid=base62.decode(uuid))
for attr, value in payload.dict().items():
setattr(edition, attr, value)
edition.save()
return {"success": True}
@api.delete("/book/{uuid}/")
def delete_edition(request, uuid: str):
edition = get_object_or_404(Edition, uid=base62.decode(uuid))
edition.delete()
return {"success": True}