Mercurial > kallithea
changeset 7447:cd6c577ade97
model: remove UI notification feature
This commit is part of the removal of the UI notification feature from
Kallithea, which is not deemed useful in its current form. Only email
notifications are preserved.
author | Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> |
---|---|
date | Wed, 05 Dec 2018 21:27:58 +0100 |
parents | 2583ab8d9411 |
children | f5841b61a582 |
files | docs/api/models.rst kallithea/model/db.py kallithea/model/notification.py kallithea/tests/models/test_notifications.py |
diffstat | 4 files changed, 13 insertions(+), 213 deletions(-) [+] |
line wrap: on
line diff
--- a/docs/api/models.rst Wed Dec 05 21:21:39 2018 +0100 +++ b/docs/api/models.rst Wed Dec 05 21:27:58 2018 +0100 @@ -10,9 +10,6 @@ .. automodule:: kallithea.model.comment :members: -.. automodule:: kallithea.model.notification - :members: - .. automodule:: kallithea.model.permission :members:
--- a/kallithea/model/db.py Wed Dec 05 21:21:39 2018 +0100 +++ b/kallithea/model/db.py Wed Dec 05 21:27:58 2018 +0100 @@ -452,9 +452,6 @@ group_member = relationship('UserGroupMember', cascade='all') - notifications = relationship('UserNotification', cascade='all') - # notifications assigned to this user - user_created_notifications = relationship('Notification', cascade='all') # comments created by this user user_comments = relationship('ChangesetComment', cascade='all') # extra emails for this user @@ -2478,12 +2475,8 @@ ) -class Notification(Base, BaseDbModel): +class Notification(object): __tablename__ = 'notifications' - __table_args__ = ( - Index('notification_type_idx', 'type'), - _table_args_default_dict, - ) TYPE_CHANGESET_COMMENT = u'cs_comment' TYPE_MESSAGE = u'message' @@ -2492,70 +2485,9 @@ TYPE_PULL_REQUEST = u'pull_request' TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment' - notification_id = Column(Integer(), primary_key=True) - subject = Column(Unicode(512), nullable=False) - body = Column(UnicodeText(), nullable=False) - created_by = Column(Integer(), ForeignKey('users.user_id'), nullable=False) - created_on = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.now) - type_ = Column('type', Unicode(255), nullable=False) - - created_by_user = relationship('User') - notifications_to_users = relationship('UserNotification', cascade="all, delete-orphan") - - @property - def recipients(self): - return [x.user for x in UserNotification.query() - .filter(UserNotification.notification == self) - .order_by(UserNotification.user_id.asc()).all()] - - @classmethod - def create(cls, created_by, subject, body, recipients, type_=None): - if type_ is None: - type_ = Notification.TYPE_MESSAGE - - notification = cls() - notification.created_by_user = created_by - notification.subject = subject - notification.body = body - notification.type_ = type_ - notification.created_on = datetime.datetime.now() - - for recipient in recipients: - un = UserNotification() - un.notification = notification - un.user_id = recipient.user_id - # Mark notifications to self "pre-read" - should perhaps just be skipped - if recipient == created_by: - un.read = True - Session().add(un) - - Session().add(notification) - Session().flush() # assign notification.notification_id - return notification - - @property - def description(self): - from kallithea.model.notification import NotificationModel - return NotificationModel().make_description(self) - - -class UserNotification(Base, BaseDbModel): + +class UserNotification(object): __tablename__ = 'user_to_notification' - __table_args__ = ( - UniqueConstraint('user_id', 'notification_id'), - _table_args_default_dict, - ) - - user_id = Column(Integer(), ForeignKey('users.user_id'), primary_key=True) - notification_id = Column(Integer(), ForeignKey('notifications.notification_id'), primary_key=True) - read = Column(Boolean, nullable=False, default=False) - sent_on = Column(DateTime(timezone=False), nullable=True) # FIXME: not nullable? - - user = relationship('User') - notification = relationship('Notification') - - def mark_as_read(self): - self.read = True class Gist(Base, BaseDbModel):
--- a/kallithea/model/notification.py Wed Dec 05 21:21:39 2018 +0100 +++ b/kallithea/model/notification.py Wed Dec 05 21:27:58 2018 +0100 @@ -26,6 +26,7 @@ :license: GPLv3, see LICENSE.md for more details. """ +import datetime import logging import traceback @@ -36,7 +37,7 @@ import kallithea from kallithea.lib import helpers as h from kallithea.lib.utils2 import safe_unicode -from kallithea.model.db import Notification, User, UserNotification +from kallithea.model.db import Notification, User from kallithea.model.meta import Session log = logging.getLogger(__name__) @@ -88,14 +89,8 @@ ) #else: silently skip notification mails? - # TODO: inform user who are notified - notif = Notification.create( - created_by=created_by_obj, subject=subject, - body=body, recipients=recipients_objs, type_=type_ - ) - if not with_email: - return notif + return headers = {} headers['X-Kallithea-Notification-Type'] = type_ @@ -103,18 +98,19 @@ headers['References'] = ' '.join('<%s>' % x for x in email_kwargs['threading']) # this is passed into template + created_on = h.fmt_date(datetime.datetime.now()) html_kwargs = { 'subject': subject, 'body': h.render_w_mentions(body, repo_name), - 'when': h.fmt_date(notif.created_on), - 'user': notif.created_by_user.username, + 'when': created_on, + 'user': created_by_obj.username, } txt_kwargs = { 'subject': subject, 'body': body, - 'when': h.fmt_date(notif.created_on), - 'user': notif.created_by_user.username, + 'when': created_on, + 'user': created_by_obj.username, } html_kwargs.update(email_kwargs) @@ -134,131 +130,6 @@ tasks.send_email([rec.email], email_subject, email_txt_body, email_html_body, headers, author=created_by_obj) - return notif - - def delete(self, user, notification): - # we don't want to remove actual notification just the assignment - try: - notification = Notification.guess_instance(notification) - user = User.guess_instance(user) - if notification and user: - obj = UserNotification.query() \ - .filter(UserNotification.user == user) \ - .filter(UserNotification.notification - == notification) \ - .one() - Session().delete(obj) - return True - except Exception: - log.error(traceback.format_exc()) - raise - - def query_for_user(self, user, filter_=None): - """ - Get notifications for given user, filter them if filter dict is given - - :param user: - :param filter: - """ - user = User.guess_instance(user) - - q = UserNotification.query() \ - .filter(UserNotification.user == user) \ - .join((Notification, UserNotification.notification_id == - Notification.notification_id)) \ - .options(joinedload('notification')) \ - .options(subqueryload('notification.created_by_user')) \ - .order_by(Notification.created_on.desc()) - - if filter_: - q = q.filter(Notification.type_.in_(filter_)) - - return q - - def mark_read(self, user, notification): - try: - notification = Notification.guess_instance(notification) - user = User.guess_instance(user) - if notification and user: - obj = UserNotification.query() \ - .filter(UserNotification.user == user) \ - .filter(UserNotification.notification - == notification) \ - .one() - obj.read = True - return True - except Exception: - log.error(traceback.format_exc()) - raise - - def mark_all_read_for_user(self, user, filter_=None): - user = User.guess_instance(user) - q = UserNotification.query() \ - .filter(UserNotification.user == user) \ - .filter(UserNotification.read == False) \ - .join((Notification, UserNotification.notification_id == - Notification.notification_id)) - if filter_: - q = q.filter(Notification.type_.in_(filter_)) - - # this is a little inefficient but sqlalchemy doesn't support - # update on joined tables :( - for obj in q: - obj.read = True - - def get_unread_cnt_for_user(self, user): - user = User.guess_instance(user) - return UserNotification.query() \ - .filter(UserNotification.read == False) \ - .filter(UserNotification.user == user).count() - - def get_unread_for_user(self, user): - user = User.guess_instance(user) - return [x.notification for x in UserNotification.query() \ - .filter(UserNotification.read == False) \ - .filter(UserNotification.user == user).all()] - - def get_user_notification(self, user, notification): - user = User.guess_instance(user) - notification = Notification.guess_instance(notification) - - return UserNotification.query() \ - .filter(UserNotification.notification == notification) \ - .filter(UserNotification.user == user).scalar() - - def make_description(self, notification, show_age=True): - """ - Creates a human readable description based on properties - of notification object - """ - # alias - _n = notification - - if show_age: - return { - _n.TYPE_CHANGESET_COMMENT: _('%(user)s commented on changeset %(age)s'), - _n.TYPE_MESSAGE: _('%(user)s sent message %(age)s'), - _n.TYPE_MENTION: _('%(user)s mentioned you %(age)s'), - _n.TYPE_REGISTRATION: _('%(user)s registered in Kallithea %(age)s'), - _n.TYPE_PULL_REQUEST: _('%(user)s opened new pull request %(age)s'), - _n.TYPE_PULL_REQUEST_COMMENT: _('%(user)s commented on pull request %(age)s'), - }[notification.type_] % dict( - user=notification.created_by_user.username, - age=h.age(notification.created_on), - ) - else: - return { - _n.TYPE_CHANGESET_COMMENT: _('%(user)s commented on changeset at %(when)s'), - _n.TYPE_MESSAGE: _('%(user)s sent message at %(when)s'), - _n.TYPE_MENTION: _('%(user)s mentioned you at %(when)s'), - _n.TYPE_REGISTRATION: _('%(user)s registered in Kallithea at %(when)s'), - _n.TYPE_PULL_REQUEST: _('%(user)s opened new pull request at %(when)s'), - _n.TYPE_PULL_REQUEST_COMMENT: _('%(user)s commented on pull request at %(when)s'), - }[notification.type_] % dict( - user=notification.created_by_user.username, - when=h.fmt_date(notification.created_on), - ) - class EmailNotificationModel(object):
--- a/kallithea/tests/models/test_notifications.py Wed Dec 05 21:21:39 2018 +0100 +++ b/kallithea/tests/models/test_notifications.py Wed Dec 05 21:27:58 2018 +0100 @@ -53,7 +53,7 @@ assert '>hi there<' in html_body assert author.username == 'u1' with mock.patch.object(kallithea.lib.celerylib.tasks, 'send_email', send_email): - notification = NotificationModel().create(created_by=self.u1, + NotificationModel().create(created_by=self.u1, subject=u'subj', body=u'hi there', recipients=usrs) @@ -151,7 +151,7 @@ for desc, type_, body, kwargs in params: # desc is used as "global" variable - notification = NotificationModel().create(created_by=self.u1, + NotificationModel().create(created_by=self.u1, subject=u'unused', body=body, email_kwargs=kwargs, recipients=[self.u2], type_=type_)