Hashtag stats are only computed when a Post is edited or updated (#299)
This commit is contained in:
parent
26f64bfc06
commit
cf8c5476e6
|
@ -44,13 +44,18 @@ class HashtagAdmin(admin.ModelAdmin):
|
||||||
|
|
||||||
readonly_fields = ["created", "updated", "stats_updated"]
|
readonly_fields = ["created", "updated", "stats_updated"]
|
||||||
|
|
||||||
actions = ["force_execution"]
|
actions = ["force_state_outdated", "force_state_updated"]
|
||||||
|
|
||||||
@admin.action(description="Force Execution")
|
@admin.action(description="Force State: outdated")
|
||||||
def force_execution(self, request, queryset):
|
def force_state_outdated(self, request, queryset):
|
||||||
for instance in queryset:
|
for instance in queryset:
|
||||||
instance.transition_perform("outdated")
|
instance.transition_perform("outdated")
|
||||||
|
|
||||||
|
@admin.action(description="Force State: updated")
|
||||||
|
def force_state_updated(self, request, queryset):
|
||||||
|
for instance in queryset:
|
||||||
|
instance.transition_perform("updated")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Emoji)
|
@admin.register(Emoji)
|
||||||
class EmojiAdmin(admin.ModelAdmin):
|
class EmojiAdmin(admin.ModelAdmin):
|
||||||
|
|
|
@ -13,7 +13,7 @@ from stator.models import State, StateField, StateGraph, StatorModel
|
||||||
|
|
||||||
class HashtagStates(StateGraph):
|
class HashtagStates(StateGraph):
|
||||||
outdated = State(try_interval=300, force_initial=True)
|
outdated = State(try_interval=300, force_initial=True)
|
||||||
updated = State(try_interval=3600, attempt_immediately=False)
|
updated = State(externally_progressed=True)
|
||||||
|
|
||||||
outdated.transitions_to(updated)
|
outdated.transitions_to(updated)
|
||||||
updated.transitions_to(outdated)
|
updated.transitions_to(outdated)
|
||||||
|
@ -23,13 +23,16 @@ class HashtagStates(StateGraph):
|
||||||
"""
|
"""
|
||||||
Computes the stats and other things for a Hashtag
|
Computes the stats and other things for a Hashtag
|
||||||
"""
|
"""
|
||||||
|
from time import time
|
||||||
|
|
||||||
from .post import Post
|
from .post import Post
|
||||||
|
|
||||||
|
start = time()
|
||||||
|
|
||||||
posts_query = Post.objects.local_public().tagged_with(instance)
|
posts_query = Post.objects.local_public().tagged_with(instance)
|
||||||
total = await posts_query.acount()
|
total = await posts_query.acount()
|
||||||
|
|
||||||
today = timezone.now().date()
|
today = timezone.now().date()
|
||||||
# TODO: single query
|
|
||||||
total_today = await posts_query.filter(
|
total_today = await posts_query.filter(
|
||||||
created__gte=today,
|
created__gte=today,
|
||||||
created__lte=today + timedelta(days=1),
|
created__lte=today + timedelta(days=1),
|
||||||
|
@ -55,13 +58,9 @@ class HashtagStates(StateGraph):
|
||||||
instance.stats_updated = timezone.now()
|
instance.stats_updated = timezone.now()
|
||||||
await sync_to_async(instance.save)()
|
await sync_to_async(instance.save)()
|
||||||
|
|
||||||
|
print(f"Updated hashtag {instance.hashtag} in {time() - start:.5f} seconds")
|
||||||
return cls.updated
|
return cls.updated
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def handle_updated(cls, instance: "Hashtag"):
|
|
||||||
if instance.state_age > Config.system.hashtag_stats_max_age:
|
|
||||||
return cls.outdated
|
|
||||||
|
|
||||||
|
|
||||||
class HashtagQuerySet(models.QuerySet):
|
class HashtagQuerySet(models.QuerySet):
|
||||||
def public(self):
|
def public(self):
|
||||||
|
|
|
@ -13,7 +13,7 @@ from django.utils import text, timezone
|
||||||
|
|
||||||
from activities.models.emoji import Emoji
|
from activities.models.emoji import Emoji
|
||||||
from activities.models.fan_out import FanOut
|
from activities.models.fan_out import FanOut
|
||||||
from activities.models.hashtag import Hashtag
|
from activities.models.hashtag import Hashtag, HashtagStates
|
||||||
from activities.models.post_types import (
|
from activities.models.post_types import (
|
||||||
PostTypeData,
|
PostTypeData,
|
||||||
PostTypeDataDecoder,
|
PostTypeDataDecoder,
|
||||||
|
@ -503,9 +503,10 @@ class Post(StatorModel):
|
||||||
# Ensure hashtags
|
# Ensure hashtags
|
||||||
if self.hashtags:
|
if self.hashtags:
|
||||||
for hashtag in self.hashtags:
|
for hashtag in self.hashtags:
|
||||||
await Hashtag.objects.aget_or_create(
|
tag, _ = await Hashtag.objects.aget_or_create(
|
||||||
hashtag=hashtag,
|
hashtag=hashtag,
|
||||||
)
|
)
|
||||||
|
await tag.atransition_perform(HashtagStates.outdated)
|
||||||
|
|
||||||
### ActivityPub (outbound) ###
|
### ActivityPub (outbound) ###
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue