feat: Add notification for newly created ANs

This commit is contained in:
moanos [he/him] 2025-01-01 00:30:14 +01:00
parent b993621773
commit 3306f3e783
3 changed files with 13 additions and 2 deletions

View File

@ -1,3 +1,5 @@
import logging
from celery.app import shared_task from celery.app import shared_task
from django.utils import timezone from django.utils import timezone
from notfellchen.celery import app as celery_app from notfellchen.celery import app as celery_app
@ -5,6 +7,7 @@ from .mail import send_notification_email
from .tools.admin import clean_locations, deactivate_unchecked_adoption_notices, deactivate_404_adoption_notices from .tools.admin import clean_locations, deactivate_unchecked_adoption_notices, deactivate_404_adoption_notices
from .tools.misc import healthcheck_ok from .tools.misc import healthcheck_ok
from .models import Location, AdoptionNotice, Timestamp from .models import Location, AdoptionNotice, Timestamp
from .tools.search import notify_search_subscribers
def set_timestamp(key: str): def set_timestamp(key: str):
@ -40,6 +43,11 @@ def add_adoption_notice_location(pk):
Location.add_location_to_object(instance) Location.add_location_to_object(instance)
set_timestamp("add_adoption_notice_location") set_timestamp("add_adoption_notice_location")
@celery_app.task(name="commit.notify_subscribers")
def notify_subscribers(pk):
instance = AdoptionNotice.objects.get(pk=pk)
notify_search_subscribers(instance)
logging.info(f"Subscribers for AN {pk} have been notified")
@celery_app.task(name="tools.healthcheck") @celery_app.task(name="tools.healthcheck")
def task_healthcheck(): def task_healthcheck():

View File

@ -6,11 +6,13 @@ from ..forms import AdoptionNoticeSearchForm
from ..models import SearchSubscription, AdoptionNotice, AdoptionNoticeNotification, SexChoicesWithAll, Location from ..models import SearchSubscription, AdoptionNotice, AdoptionNoticeNotification, SexChoicesWithAll, Location
def notify_search_subscribers(adoption_notice: AdoptionNotice): def notify_search_subscribers(adoption_notice: AdoptionNotice, only_if_active : bool = True):
""" """
This functions checks for all search subscriptions if the new adoption notice fits the search. This functions checks for all search subscriptions if the new adoption notice fits the search.
If the new adoption notice fits the search subscription, it sends a notification to the user that created the search. If the new adoption notice fits the search subscription, it sends a notification to the user that created the search.
""" """
if only_if_active and not adoption_notice.is_active:
return
for search_subscription in SearchSubscription.objects.all(): for search_subscription in SearchSubscription.objects.all():
if search_subscription.adoption_notice_fits_search(adoption_notice): if search_subscription.adoption_notice_fits_search(adoption_notice):
notification_text = f"{_('Zu deiner Suche')} {search_subscription} wurde eine neue Vermittlung gefunden" notification_text = f"{_('Zu deiner Suche')} {search_subscription} wurde eine neue Vermittlung gefunden"

View File

@ -25,7 +25,7 @@ from .tools.geo import GeoAPI
from .tools.metrics import gather_metrics_data from .tools.metrics import gather_metrics_data
from .tools.admin import clean_locations, get_unchecked_adoption_notices, deactivate_unchecked_adoption_notices, \ from .tools.admin import clean_locations, get_unchecked_adoption_notices, deactivate_unchecked_adoption_notices, \
deactivate_404_adoption_notices deactivate_404_adoption_notices
from .tasks import add_adoption_notice_location from .tasks import add_adoption_notice_location, notify_subscribers
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from .tools.search import Search from .tools.search import Search
@ -219,6 +219,7 @@ def add_adoption_notice(request):
# Set correct status # Set correct status
if request.user.trust_level >= TrustLevel.MODERATOR: if request.user.trust_level >= TrustLevel.MODERATOR:
an_instance.set_active() an_instance.set_active()
notify_subscribers.delay_on_commit(an_instance.pk)
else: else:
an_instance.set_unchecked() an_instance.set_unchecked()