server: poolpost nearby implementation
This commit is contained in:
parent
8088ff3bbe
commit
fd2ca001af
3 changed files with 97 additions and 3 deletions
37
doc/API.md
37
doc/API.md
|
@ -975,6 +975,43 @@ data.
|
||||||
|
|
||||||
Retrieves information about posts that are before or after an existing post.
|
Retrieves information about posts that are before or after an existing post.
|
||||||
|
|
||||||
|
## Getting pools around post
|
||||||
|
- **Request**
|
||||||
|
|
||||||
|
`GET /post/<id>/pools-nearby`
|
||||||
|
|
||||||
|
- **Output**
|
||||||
|
|
||||||
|
```json5
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"pool": <pool>,
|
||||||
|
"firstPost": <first-post>,
|
||||||
|
"lastPost": <last-post>,
|
||||||
|
"nextPost": <next-post>,
|
||||||
|
"previousPost": <previous-post>
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Field meaning**
|
||||||
|
|
||||||
|
- `<pool>`: The associated [micro pool resource](#micro-pool).
|
||||||
|
- `firstPost`: A [micro post resource](#micro-post) that displays the first post in the pool.
|
||||||
|
- `lastPost`: A [micro post resource](#micro-post) that displays the last post in the pool.
|
||||||
|
- `nextPost`: A [micro post resource](#micro-post) that displays the next post in the pool.
|
||||||
|
- `prevPost`: A [micro post resource](#micro-post) that displays the previous post in the pool.
|
||||||
|
|
||||||
|
- **Errors**
|
||||||
|
|
||||||
|
- the post does not exist
|
||||||
|
- privileges are too low
|
||||||
|
|
||||||
|
- **Description**
|
||||||
|
|
||||||
|
Retrieves extra information about any pools that the post is in.
|
||||||
|
|
||||||
## Deleting post
|
## Deleting post
|
||||||
- **Request**
|
- **Request**
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,10 @@ from szurubooru import db, errors, model, rest, search
|
||||||
from szurubooru.func import (
|
from szurubooru.func import (
|
||||||
auth,
|
auth,
|
||||||
favorites,
|
favorites,
|
||||||
mime,
|
|
||||||
posts,
|
posts,
|
||||||
scores,
|
scores,
|
||||||
serialization,
|
serialization,
|
||||||
snapshots,
|
snapshots,
|
||||||
tags,
|
|
||||||
versions,
|
versions,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -283,6 +281,19 @@ def get_posts_around(
|
||||||
ctx, post_id, lambda post: _serialize_post(ctx, post)
|
ctx, post_id, lambda post: _serialize_post(ctx, post)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@rest.routes.get("/post/(?P<post_id>[^/]+)/pools-nearby/?")
|
||||||
|
def get_pools_around(
|
||||||
|
ctx: rest.Context, params: Dict[str, str]
|
||||||
|
) -> rest.Response:
|
||||||
|
auth.verify_privilege(ctx.user, "posts:list")
|
||||||
|
auth.verify_privilege(ctx.user, "posts:view")
|
||||||
|
auth.verify_privilege(ctx.user, "pools:list")
|
||||||
|
_search_executor_config.user = ctx.user
|
||||||
|
post = _get_post(params)
|
||||||
|
results = posts.get_pools_nearby(post)
|
||||||
|
return posts.serialize_pool_posts_nearby(results)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@rest.routes.post("/posts/reverse-search/?")
|
@rest.routes.post("/posts/reverse-search/?")
|
||||||
def get_posts_by_image(
|
def get_posts_by_image(
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import hmac
|
import hmac
|
||||||
import logging
|
import logging
|
||||||
|
from collections import namedtuple
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Any, Callable, Dict, List, Optional, Tuple
|
from typing import Any, Callable, Dict, List, Optional, Tuple
|
||||||
|
|
||||||
|
@ -15,7 +16,6 @@ from szurubooru.func import (
|
||||||
pools,
|
pools,
|
||||||
scores,
|
scores,
|
||||||
serialization,
|
serialization,
|
||||||
snapshots,
|
|
||||||
tags,
|
tags,
|
||||||
users,
|
users,
|
||||||
util,
|
util,
|
||||||
|
@ -968,3 +968,49 @@ def search_by_image(image_content: bytes) -> List[Tuple[float, model.Post]]:
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
PoolPostsNearby = namedtuple('PoolPostsNearby', 'pool first_post prev_post next_post last_post')
|
||||||
|
def get_pools_nearby(
|
||||||
|
post: model.Post
|
||||||
|
) -> List[PoolPostsNearby]:
|
||||||
|
response = []
|
||||||
|
pools = post.pools
|
||||||
|
|
||||||
|
for pool in pools:
|
||||||
|
prev_post_id = None
|
||||||
|
next_post_id = None
|
||||||
|
break_loop = False
|
||||||
|
|
||||||
|
for pool_post in pools.posts:
|
||||||
|
next_post_id = pool_post.post_id
|
||||||
|
|
||||||
|
if break_loop == True:
|
||||||
|
break
|
||||||
|
|
||||||
|
if post.id == pool_post.post_id:
|
||||||
|
break_loop = True
|
||||||
|
|
||||||
|
prev_post_id = pool_post.post_id
|
||||||
|
|
||||||
|
resp_entry = PoolPostsNearby(
|
||||||
|
pool=pool,
|
||||||
|
first_post=pool.posts[0].post_id,
|
||||||
|
last_post=pool.posts[-1].post_id,
|
||||||
|
prev_post=next_post_id,
|
||||||
|
next_post=prev_post_id,
|
||||||
|
)
|
||||||
|
response.append(resp_entry)
|
||||||
|
return response
|
||||||
|
|
||||||
|
def serialize_pool_posts_nearby(
|
||||||
|
nearby: List[PoolPostsNearby]
|
||||||
|
) -> Optional[rest.Response]:
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"pool": pools.serialize_pool(entry.pool),
|
||||||
|
"firstPost": serialize_micro_post(try_get_post_by_id(entry.first_post)),
|
||||||
|
"lastPost": serialize_micro_post(try_get_post_by_id(entry.last_post)),
|
||||||
|
"prevPost": serialize_micro_post(try_get_post_by_id(entry.prev_post)),
|
||||||
|
"nextPost": serialize_micro_post(try_get_post_by_id(entry.first_post)),
|
||||||
|
} for entry in nearby
|
||||||
|
]
|
||||||
|
|
Reference in a new issue