This commit is contained in:
@@ -99,6 +99,23 @@ class NotificationSeen(Base):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class NotificationUnsubscribe(Base):
|
||||||
|
"""Модель для хранения отписок пользователей от уведомлений по определенным thread_id."""
|
||||||
|
|
||||||
|
__tablename__ = "notification_unsubscribe"
|
||||||
|
|
||||||
|
author_id: Mapped[int] = mapped_column(ForeignKey("author.id"), nullable=False)
|
||||||
|
thread_id: Mapped[str] = mapped_column(String, nullable=False)
|
||||||
|
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
PrimaryKeyConstraint(author_id, thread_id),
|
||||||
|
Index("idx_notification_unsubscribe_author", "author_id"),
|
||||||
|
Index("idx_notification_unsubscribe_thread", "thread_id"),
|
||||||
|
{"extend_existing": True},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Notification(Base):
|
class Notification(Base):
|
||||||
__tablename__ = "notification"
|
__tablename__ = "notification"
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ def get_notifications_grouped(author_id: int, after: int = 0, limit: int = 10, o
|
|||||||
authors: List[NotificationAuthor], # List of authors involved in the thread.
|
authors: List[NotificationAuthor], # List of authors involved in the thread.
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
# TODO: use all stats
|
|
||||||
_total, _unread, notifications = query_notifications(author_id, after)
|
_total, _unread, notifications = query_notifications(author_id, after)
|
||||||
groups_by_thread = {}
|
groups_by_thread = {}
|
||||||
groups_amount = 0
|
groups_amount = 0
|
||||||
@@ -121,6 +120,7 @@ def get_notifications_grouped(author_id: int, after: int = 0, limit: int = 10, o
|
|||||||
shout_id = shout.get("id")
|
shout_id = shout.get("id")
|
||||||
author_id = shout.get("created_by")
|
author_id = shout.get("created_by")
|
||||||
thread_id = f"shout-{shout_id}"
|
thread_id = f"shout-{shout_id}"
|
||||||
|
|
||||||
with local_session() as session:
|
with local_session() as session:
|
||||||
author = session.query(Author).where(Author.id == author_id).first()
|
author = session.query(Author).where(Author.id == author_id).first()
|
||||||
shout = session.query(Shout).where(Shout.id == shout_id).first()
|
shout = session.query(Shout).where(Shout.id == shout_id).first()
|
||||||
@@ -154,7 +154,8 @@ def get_notifications_grouped(author_id: int, after: int = 0, limit: int = 10, o
|
|||||||
reply_id = reaction.get("reply_to")
|
reply_id = reaction.get("reply_to")
|
||||||
thread_id = f"shout-{shout_id}"
|
thread_id = f"shout-{shout_id}"
|
||||||
if reply_id and reaction.get("kind", "").lower() == "comment":
|
if reply_id and reaction.get("kind", "").lower() == "comment":
|
||||||
thread_id += f"{reply_id}"
|
thread_id = f"shout-{shout_id}::{reply_id}"
|
||||||
|
|
||||||
existing_group = groups_by_thread.get(thread_id)
|
existing_group = groups_by_thread.get(thread_id)
|
||||||
if existing_group:
|
if existing_group:
|
||||||
existing_group["seen"] = False
|
existing_group["seen"] = False
|
||||||
@@ -214,6 +215,10 @@ async def load_notifications(_: None, info: GraphQLResolveInfo, after: int, limi
|
|||||||
if author_id:
|
if author_id:
|
||||||
groups_list = get_notifications_grouped(author_id, after, limit)
|
groups_list = get_notifications_grouped(author_id, after, limit)
|
||||||
notifications = sorted(groups_list, key=lambda group: group.get("updated_at", 0), reverse=True)
|
notifications = sorted(groups_list, key=lambda group: group.get("updated_at", 0), reverse=True)
|
||||||
|
|
||||||
|
# Считаем реальное количество сгруппированных уведомлений
|
||||||
|
total = len(notifications)
|
||||||
|
unread = sum(1 for n in notifications if not n.get("seen", False))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error = str(e)
|
error = str(e)
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
|||||||
Reference in New Issue
Block a user