""" 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() # ============================================================ # FORUM NOTIFICATIONS # ============================================================ def create_forum_reply_notification(topic_id, topic_title, replier_name, reply_id, subscriber_ids): """ Notify topic subscribers about a new reply. Args: topic_id: ID of the forum topic topic_title: Title of the topic replier_name: Name of the user who replied reply_id: ID of the new reply subscriber_ids: List of user IDs to notify Returns: Number of notifications created """ count = 0 for user_id in subscriber_ids: result = create_notification( user_id=user_id, title="Nowa odpowiedź na forum", message=f"{replier_name} odpowiedział w temacie: {topic_title[:50]}{'...' if len(topic_title) > 50 else ''}", notification_type='message', related_type='forum_reply', related_id=reply_id, action_url=f'/forum/{topic_id}#reply-{reply_id}' ) if result: count += 1 logger.info(f"Created {count} forum reply notifications for topic {topic_id}") return count def send_forum_reply_email(topic_id, topic_title, replier_name, reply_content, subscriber_emails): """ Send email notifications to forum topic subscribers about a new reply. Args: topic_id: ID of the forum topic topic_title: Title of the topic replier_name: Name of the user who replied reply_content: First 200 chars of the reply content subscriber_emails: List of dicts with 'email' and 'name' keys """ from email_service import send_email base_url = "https://nordabiznes.pl" topic_url = f"{base_url}/forum/{topic_id}" unsubscribe_url = f"{base_url}/forum/{topic_id}/unsubscribe" preview = reply_content[:200].strip() if len(reply_content) > 200: preview += "..." count = 0 for subscriber in subscriber_emails: subject = f"Nowa odpowiedz na forum: {topic_title[:60]}" body_text = f"""{replier_name} odpowiedzial w temacie: {topic_title} "{preview}" Zobacz pelna odpowiedz: {topic_url} --- Aby przestac obserwowac ten watek: {unsubscribe_url} Norda Biznes Partner - https://nordabiznes.pl """ from email_service import _email_v3_wrap content = f'''
Cześć {subscriber.get('name', '')}!
{replier_name} odpowiedział w temacie, który obserwujesz:
|
Temat {topic_title} |
|
{preview} |
| Zobacz odpowiedź → |
| Przestań obserwować ten wątek |