from django.core.management.base import BaseCommand, CommandError from apps.follows import sync from apps.follows.models import FollowedPool from apps.library import e621 class Command(BaseCommand): help = ( "Fetch new posts for every followed pool: fills each feed, refreshes " "the card cover (latest image), pool name/count and unseen badges." ) def add_arguments(self, parser): parser.add_argument( "--user", help="Only sync follows belonging to this username " "(default: every user's follows).", ) parser.add_argument( "--limit", type=int, default=sync.FEED_LIMIT, help=f"Posts fetched per pool (default {sync.FEED_LIMIT}).", ) def handle(self, *args, **options): username = options.get("user") if username and sync.preferred_fetch_user(username) is None: raise CommandError(f"No such user: {username}") fetch_user = sync.preferred_fetch_user(username) follows = FollowedPool.objects.select_related("user").order_by( "pool_id", "user_id" ) if username: follows = follows.filter(user__username=username) follows = list(follows) grouped = {} for follow in follows: grouped.setdefault(follow.pool_id, []).append(follow) created = 0 for pool_id, group in grouped.items(): try: posts = sync.search_posts( fetch_user, f"pool:{pool_id}", options["limit"] ) except e621.E621Error as exc: raise CommandError(f"Aborted at pool #{pool_id}: {exc}") for follow in group: created += sync.sync_pool_follow( follow, fetch_user, posts=posts ) identity = getattr(fetch_user, "username", None) or "anonymous" self.stdout.write( self.style.SUCCESS( f"Synced {len(grouped)} pool(s) across {len(follows)} follow(s) " f"as {identity}: {created} new post(s)." ) )