mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 04:20:17 +02:00
58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
from typing import TYPE_CHECKING
|
|
|
|
from django.db import models
|
|
|
|
from allianceauth.admin_status.hooks import (
|
|
Announcement,
|
|
get_all_applications_announcements,
|
|
)
|
|
from allianceauth.services.hooks import get_extension_logger
|
|
|
|
if TYPE_CHECKING:
|
|
from .models import ApplicationAnnouncement
|
|
|
|
logger = get_extension_logger(__name__)
|
|
|
|
class ApplicationAnnouncementManager(models.Manager):
|
|
|
|
def sync_and_return(self):
|
|
"""
|
|
Checks all hooks if new notifications need to be created.
|
|
Return all notification objects after
|
|
"""
|
|
logger.info("Syncing announcements")
|
|
current_announcements = get_all_applications_announcements()
|
|
self._delete_obsolete_announcements(current_announcements)
|
|
self._store_new_announcements(current_announcements)
|
|
|
|
return self.all()
|
|
|
|
def _delete_obsolete_announcements(self, current_announcements: list[Announcement]):
|
|
"""Deletes all announcements stored in the database that aren't retrieved anymore"""
|
|
hashes = [announcement.get_hash() for announcement in current_announcements]
|
|
self.exclude(announcement_hash__in=hashes).delete()
|
|
|
|
def _store_new_announcements(self, current_announcements: list[Announcement]):
|
|
"""Stores a new database object for new application announcements"""
|
|
|
|
for current_announcement in current_announcements:
|
|
try:
|
|
announcement = self.get(announcement_hash=current_announcement.get_hash())
|
|
except self.model.DoesNotExist:
|
|
self.create_from_announcement(current_announcement)
|
|
else:
|
|
# if exists update the text only
|
|
if announcement.announcement_text != current_announcement.announcement_text:
|
|
announcement.announcement_text = current_announcement.announcement_text
|
|
announcement.save()
|
|
|
|
def create_from_announcement(self, announcement: Announcement) -> "ApplicationAnnouncement":
|
|
"""Creates from the Announcement dataclass"""
|
|
return self.create(
|
|
application_name=announcement.application_name,
|
|
announcement_number=announcement.announcement_number,
|
|
announcement_text=announcement.announcement_text,
|
|
announcement_url=announcement.announcement_url,
|
|
announcement_hash=announcement.get_hash(),
|
|
)
|