diff --git a/blueprints/community/classifieds/routes.py b/blueprints/community/classifieds/routes.py index 79ff23c..3c4cc83 100644 --- a/blueprints/community/classifieds/routes.py +++ b/blueprints/community/classifieds/routes.py @@ -14,6 +14,13 @@ from database import SessionLocal, Classified, ClassifiedRead, ClassifiedInteres from sqlalchemy import desc from utils.helpers import sanitize_input from utils.decorators import member_required +from utils.notifications import ( + create_classified_question_notification, + create_classified_answer_notification, + create_classified_interest_notification, + send_classified_question_email, + send_classified_answer_email, +) @bp.route('/', endpoint='classifieds_index') @@ -309,6 +316,16 @@ def toggle_interest(classified_id): ) db.add(interest) db.commit() + + # Notify classified author (in-app only) + if classified.author_id != current_user.id: + try: + interested_name = current_user.name or current_user.email.split('@')[0] + create_classified_interest_notification( + classified_id, classified.title, interested_name, classified.author_id) + except Exception as e: + logger.warning(f"Failed to send classified interest notification: {e}") + return jsonify({ 'success': True, 'interested': True, @@ -399,6 +416,20 @@ def ask_question(classified_id): db.add(question) db.commit() + # Notify classified author (in-app + email) + if classified.author_id != current_user.id: + questioner_name = current_user.name or current_user.email.split('@')[0] + try: + create_classified_question_notification( + classified_id, classified.title, questioner_name, classified.author_id) + author = db.query(User).filter(User.id == classified.author_id).first() + if author and author.email and author.notify_email_messages != False: + send_classified_question_email( + classified_id, classified.title, questioner_name, content, + author.email, author.name or author.email.split('@')[0]) + except Exception as e: + logger.warning(f"Failed to send classified question notification: {e}") + return jsonify({ 'success': True, 'message': 'Pytanie dodane', @@ -456,6 +487,20 @@ def answer_question(classified_id, question_id): question.answered_at = datetime.now() db.commit() + # Notify question author (in-app + email) + if question.author_id != current_user.id: + answerer_name = current_user.name or current_user.email.split('@')[0] + try: + create_classified_answer_notification( + classified_id, classified.title, answerer_name, question.author_id) + q_author = db.query(User).filter(User.id == question.author_id).first() + if q_author and q_author.email and q_author.notify_email_messages != False: + send_classified_answer_email( + classified_id, classified.title, answerer_name, answer, + q_author.email, q_author.name or q_author.email.split('@')[0]) + except Exception as e: + logger.warning(f"Failed to send classified answer notification: {e}") + return jsonify({ 'success': True, 'message': 'Odpowiedź dodana', diff --git a/utils/notifications.py b/utils/notifications.py index 65833bb..7d971df 100644 --- a/utils/notifications.py +++ b/utils/notifications.py @@ -341,6 +341,173 @@ Norda Biznes Partner - https://nordabiznes.pl return count +# ============================================================ +# B2B CLASSIFIEDS NOTIFICATIONS +# ============================================================ + +def create_classified_question_notification(classified_id, classified_title, questioner_name, author_id): + """Notify classified author that someone asked a question.""" + return create_notification( + user_id=author_id, + title="Nowe pytanie do ogłoszenia B2B", + message=f"{questioner_name} zadał pytanie do ogłoszenia: {classified_title[:50]}{'...' if len(classified_title) > 50 else ''}", + notification_type='message', + related_type='classified_question', + related_id=classified_id, + action_url=f'/tablica/{classified_id}' + ) + + +def create_classified_answer_notification(classified_id, classified_title, answerer_name, questioner_id): + """Notify question author that the classified owner answered.""" + return create_notification( + user_id=questioner_id, + title="Odpowiedź na Twoje pytanie B2B", + message=f"{answerer_name} odpowiedział na Twoje pytanie w ogłoszeniu: {classified_title[:50]}{'...' if len(classified_title) > 50 else ''}", + notification_type='message', + related_type='classified_answer', + related_id=classified_id, + action_url=f'/tablica/{classified_id}' + ) + + +def create_classified_interest_notification(classified_id, classified_title, interested_name, author_id): + """Notify classified author that someone is interested.""" + return create_notification( + user_id=author_id, + title="Ktoś zainteresował się Twoim ogłoszeniem", + message=f"{interested_name} wyraził zainteresowanie ogłoszeniem: {classified_title[:50]}{'...' if len(classified_title) > 50 else ''}", + notification_type='message', + related_type='classified_interest', + related_id=classified_id, + action_url=f'/tablica/{classified_id}' + ) + + +def send_classified_question_email(classified_id, classified_title, questioner_name, question_content, author_email, author_name): + """Send email to classified author about a new question.""" + from email_service import send_email, _email_v3_wrap + + base_url = "https://nordabiznes.pl" + classified_url = f"{base_url}/tablica/{classified_id}" + + preview = question_content[:200].strip() + if len(question_content) > 200: + preview += "..." + + subject = f"Nowe pytanie do ogłoszenia: {classified_title[:60]}" + + body_text = f"""{questioner_name} zadał pytanie do Twojego ogłoszenia: {classified_title} + +"{preview}" + +Zobacz i odpowiedz: {classified_url} + +--- +Norda Biznes Partner - https://nordabiznes.pl +""" + + content = f''' +
Cześć {author_name}!
+{questioner_name} zadał pytanie do Twojego ogłoszenia na tablicy B2B:
+ +|
+ Ogłoszenie +{classified_title} + |
|
+ {preview} + |
| + Zobacz pytanie i odpowiedz → + |
Cześć {questioner_name}!
+{answerer_name} odpowiedział na Twoje pytanie w ogłoszeniu:
+ +|
+ Ogłoszenie +{classified_title} + |
|
+ {preview} + |
| + Zobacz odpowiedź → + |