Backend (new apps.follows): - FollowedTag/FollowedPool/FollowedPost models; per-user follows with unseen tracking, plus FollowCloud for the cached blacklist cloud. - Two periodic commands sharing one fetch path: sync_followed_tags and sync_followed_pools fetch each followed tag/pool's newest posts (one e621 search per unique follow), store unseen feed rows, refresh covers and pool metadata; both fall back to anonymous e621 access. - API: /api/follows/tags|pools (follow, unfollow, mark seen), a merged feed with per-follow filtering, and /api/follows/cloud/ which rebuilds the blacklisted-tag cloud in a daemon thread when its 10 min cache is stale (polling returns building/ready). - e621 client now supports anonymous reads; trimmed posts carry preview URLs for covers and feed tiles. Frontend: - /followed page: follow forms, cover cards with unseen badges and Mark seen, merged feed with filter/unseen toggle, and a blacklist cloud panel that polls while building. Followed nav entry added.
26 lines
759 B
Python
26 lines
759 B
Python
from django.urls import include, path
|
|
from rest_framework.routers import DefaultRouter
|
|
|
|
from .views import (
|
|
FollowCloudView,
|
|
FollowedFeedView,
|
|
FollowedPoolViewSet,
|
|
FollowedPostSeenView,
|
|
FollowedTagViewSet,
|
|
)
|
|
|
|
router = DefaultRouter()
|
|
router.register("follows/tags", FollowedTagViewSet, basename="followed-tag")
|
|
router.register("follows/pools", FollowedPoolViewSet, basename="followed-pool")
|
|
|
|
urlpatterns = [
|
|
path("", include(router.urls)),
|
|
path("follows/feed/", FollowedFeedView.as_view(), name="followed_feed"),
|
|
path("follows/cloud/", FollowCloudView.as_view(), name="followed_cloud"),
|
|
path(
|
|
"follows/posts/<int:post_id>/seen/",
|
|
FollowedPostSeenView.as_view(),
|
|
name="followed_post_seen",
|
|
),
|
|
]
|