nordabiz/utils/notifications.py
Maciej Pienczyn ce7c78bda9 feat(notifications): Add notifications for releases and announcements
- notify_all_users_release(): Notify all users about new system version
- notify_all_users_announcement(): Notify all users about new announcement
- Auto-send notifications when admin publishes an announcement
- New admin endpoint POST /admin/notify-release for manual release notifications
- Category-specific icons for announcement notifications

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 14:22:44 +01:00

222 lines
6.5 KiB
Python

"""
Notification Helpers
====================
Functions for creating and managing user notifications.
"""
import logging
from database import SessionLocal, UserNotification, User
logger = logging.getLogger(__name__)
def create_notification(user_id, title, message, notification_type='info',
related_type=None, related_id=None, action_url=None):
"""
Create a notification for a user.
Args:
user_id: ID of the user to notify
title: Notification title
message: Notification message/body
notification_type: Type of notification (news, system, message, event, alert)
related_type: Type of related entity (company_news, event, message, etc.)
related_id: ID of the related entity
action_url: URL to navigate when notification is clicked
Returns:
UserNotification object or None on error
"""
db = SessionLocal()
try:
notification = UserNotification(
user_id=user_id,
title=title,
message=message,
notification_type=notification_type,
related_type=related_type,
related_id=related_id,
action_url=action_url
)
db.add(notification)
db.commit()
db.refresh(notification)
logger.info(f"Created notification for user {user_id}: {title}")
return notification
except Exception as e:
logger.error(f"Error creating notification: {e}")
db.rollback()
return None
finally:
db.close()
def create_news_notification(company_id, news_id, news_title):
"""
Create notification for company owner when their news is approved.
Args:
company_id: ID of the company
news_id: ID of the approved news
news_title: Title of the news
"""
db = SessionLocal()
try:
# Find users associated with this company
users = db.query(User).filter(
User.company_id == company_id,
User.is_active == True
).all()
for user in users:
create_notification(
user_id=user.id,
title="Nowa aktualnosc o Twojej firmie",
message=f"Aktualnosc '{news_title}' zostala zatwierdzona i jest widoczna na profilu firmy.",
notification_type='news',
related_type='company_news',
related_id=news_id,
action_url=f"/company/{company_id}"
)
finally:
db.close()
def create_message_notification(user_id, sender_name, message_id):
"""
Create notification when user receives a private message.
Args:
user_id: ID of the recipient
sender_name: Name of the sender
message_id: ID of the message
"""
create_notification(
user_id=user_id,
title="Nowa wiadomość prywatna",
message=f"Otrzymałeś nową wiadomość od {sender_name}.",
notification_type='message',
related_type='private_message',
related_id=message_id,
action_url=f"/wiadomosci/{message_id}"
)
def create_event_notification(user_id, event_title, event_id):
"""
Create notification for upcoming event reminder.
Args:
user_id: ID of the user to notify
event_title: Title of the event
event_id: ID of the event
"""
create_notification(
user_id=user_id,
title="Przypomnienie o wydarzeniu",
message=f"Zbliża się wydarzenie: {event_title}",
notification_type='event',
related_type='norda_event',
related_id=event_id,
action_url=f"/kalendarz/{event_id}"
)
def notify_all_users_release(version, highlights=None):
"""
Notify all active users about a new system release.
Args:
version: Version string (e.g., 'v1.17.0')
highlights: Optional list of key changes to include in notification
Returns:
Number of notifications created
"""
db = SessionLocal()
try:
# Get all active users
users = db.query(User).filter(User.is_active == True).all()
message = f"Wersja {version} jest już dostępna."
if highlights:
# Include first 2 highlights
message += " Nowości: " + ", ".join(highlights[:2])
if len(highlights) > 2:
message += f" (+{len(highlights) - 2} więcej)"
count = 0
for user in users:
result = create_notification(
user_id=user.id,
title=f"🚀 Nowa wersja systemu {version}",
message=message,
notification_type='system',
related_type='release',
related_id=None,
action_url='/release-notes'
)
if result:
count += 1
logger.info(f"Created {count} release notifications for version {version}")
return count
except Exception as e:
logger.error(f"Error creating release notifications: {e}")
return 0
finally:
db.close()
def notify_all_users_announcement(announcement_id, title, category=None):
"""
Notify all active users about a new announcement.
Args:
announcement_id: ID of the announcement
title: Title of the announcement
category: Optional category for context
Returns:
Number of notifications created
"""
db = SessionLocal()
try:
# Get all active users
users = db.query(User).filter(User.is_active == True).all()
# Category-specific icons
category_icons = {
'general': '📢',
'event': '📅',
'business_opportunity': '💼',
'member_news': '👥',
'partnership': '🤝'
}
icon = category_icons.get(category, '📢')
count = 0
for user in users:
result = create_notification(
user_id=user.id,
title=f"{icon} Nowe ogłoszenie w Aktualnościach",
message=title[:100] + ('...' if len(title) > 100 else ''),
notification_type='news',
related_type='announcement',
related_id=announcement_id,
action_url=f'/ogloszenia/{announcement_id}'
)
if result:
count += 1
logger.info(f"Created {count} announcement notifications for: {title[:50]}")
return count
except Exception as e:
logger.error(f"Error creating announcement notifications: {e}")
return 0
finally:
db.close()