mirror of
https://github.com/jointakahe/takahe.git
synced 2024-11-21 23:01:00 +00:00
Add manual post pruning command
This commit is contained in:
parent
aa39ef0571
commit
87344b47b5
3 changed files with 50 additions and 0 deletions
0
activities/management/__init__.py
Normal file
0
activities/management/__init__.py
Normal file
0
activities/management/commands/__init__.py
Normal file
0
activities/management/commands/__init__.py
Normal file
50
activities/management/commands/pruneposts.py
Normal file
50
activities/management/commands/pruneposts.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
import datetime
|
||||
import sys
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.utils import timezone
|
||||
|
||||
from activities.models import Post
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Prunes posts that are old, not local and have no local interaction"
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument(
|
||||
"--number",
|
||||
"-n",
|
||||
type=int,
|
||||
default=5000,
|
||||
help="The maximum number of posts to prune at once",
|
||||
)
|
||||
|
||||
def handle(self, number: int, *args, **options):
|
||||
# Find a set of posts that match the initial criteria
|
||||
print(f"Running query to find up to {number} old posts...")
|
||||
posts = Post.objects.filter(
|
||||
local=False,
|
||||
created__lt=timezone.now()
|
||||
- datetime.timedelta(days=settings.SETUP.REMOTE_PRUNE_HORIZON),
|
||||
).exclude(interactions__identity__local=True)[:number]
|
||||
post_ids_and_uris = dict(posts.values_list("object_uri", "id"))
|
||||
print(f" found {len(post_ids_and_uris)}")
|
||||
|
||||
# Fetch all of their replies and exclude any that have local replies
|
||||
print("Excluding ones with replies...")
|
||||
replies = Post.objects.filter(
|
||||
in_reply_to__in=post_ids_and_uris.keys()
|
||||
).values_list("in_reply_to", flat=True)
|
||||
for reply in replies:
|
||||
if reply:
|
||||
del post_ids_and_uris[reply]
|
||||
|
||||
# Delete them
|
||||
print(f" down to {len(post_ids_and_uris)} to delete")
|
||||
number_deleted, _ = Post.objects.filter(
|
||||
id__in=post_ids_and_uris.values()
|
||||
).delete()
|
||||
print(f"Deleted {number_deleted} posts")
|
||||
if number_deleted == 0:
|
||||
sys.exit(1)
|
Loading…
Reference in a new issue