item_batch and item_transaction boilerplate only
This commit is contained in:
parent
6e4f8f9917
commit
a0aaf79f42
@ -8,7 +8,7 @@ from django.core.files.base import ContentFile
|
||||
from django.db import transaction
|
||||
from django.db.models import Q
|
||||
from django.db.models import QuerySet
|
||||
from fastapi import APIRouter, Depends, status, Query
|
||||
from fastapi import APIRouter, Depends, status, Query, Request
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from django_etebase import models
|
||||
@ -20,7 +20,7 @@ from .stoken_handler import filter_by_stoken_and_limit
|
||||
|
||||
User = get_user_model()
|
||||
collection_router = APIRouter(route_class=MsgpackRoute)
|
||||
default_queryset = Collection.objects.all()
|
||||
default_queryset: QuerySet = Collection.objects.all()
|
||||
|
||||
|
||||
Prefetch = t.Literal["auto", "medium"]
|
||||
@ -122,6 +122,19 @@ class CollectionIn(BaseModel):
|
||||
item: ItemIn
|
||||
|
||||
|
||||
class ItemDepIn(BaseModel):
|
||||
etag: str
|
||||
uid: str
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
|
||||
class ItemBatchIn(BaseModel):
|
||||
items: t.List[ItemIn]
|
||||
deps: t.Optional[ItemDepIn]
|
||||
|
||||
|
||||
@sync_to_async
|
||||
def list_common(
|
||||
queryset: QuerySet, user: User, stoken: t.Optional[str], limit: int, prefetch: Prefetch
|
||||
@ -155,6 +168,14 @@ async def list_multi(
|
||||
return response
|
||||
|
||||
|
||||
@collection_router.post("/list/")
|
||||
async def collection_list(
|
||||
req: Request,
|
||||
user: User = Depends(get_authenticated_user),
|
||||
):
|
||||
pass
|
||||
|
||||
|
||||
def process_revisions_for_item(item: models.CollectionItem, revision_data: CollectionItemRevisionOut):
|
||||
chunks_objs = []
|
||||
|
||||
@ -231,3 +252,30 @@ def get_collection(uid: str, user: User = Depends(get_authenticated_user), prefe
|
||||
obj = get_collection_queryset(user, default_queryset).get(uid=uid)
|
||||
ret = CollectionOut.from_orm_context(obj, Context(user, prefetch))
|
||||
return MsgpackResponse(ret)
|
||||
|
||||
|
||||
def item_bulk_common(data: ItemBatchIn, user: User, stoken: str, uid: str, validate_etag: bool):
|
||||
queryset = get_collection_queryset(user, default_queryset)
|
||||
with transaction.atomic(): # We need this for locking the collection object
|
||||
collection_object = queryset.select_for_update().get(uid=uid)
|
||||
if stoken is not None and stoken != collection_object.stoken:
|
||||
raise ValidationError("stale_stoken", "Stoken is too old", status_code=status.HTTP_409_CONFLICT)
|
||||
|
||||
|
||||
|
||||
def item_create():
|
||||
pass #
|
||||
|
||||
|
||||
@collection_router.post("/{uid}/item/transaction/")
|
||||
def item_transaction(
|
||||
uid: str, data: ItemBatchIn, stoken: t.Optional[str] = None, user: User = Depends(get_authenticated_user)
|
||||
):
|
||||
item_bulk_common(data, user, stoken, uid, validate_etag=True)
|
||||
|
||||
|
||||
@collection_router.post("/{uid}/item/batch/")
|
||||
def item_batch(
|
||||
uid: str, data: ItemBatchIn, stoken: t.Optional[str] = None, user: User = Depends(get_authenticated_user)
|
||||
):
|
||||
item_bulk_common(data, user, stoken, uid, validate_etag=False)
|
||||
|
Loading…
Reference in New Issue
Block a user