diff options
-rw-r--r-- | app/blueprints/admin/admin.py | 4 | ||||
-rw-r--r-- | app/blueprints/packages/editrequests.py | 20 | ||||
-rw-r--r-- | app/blueprints/packages/packages.py | 16 | ||||
-rw-r--r-- | app/blueprints/packages/releases.py | 8 | ||||
-rw-r--r-- | app/blueprints/packages/reviews.py | 10 | ||||
-rw-r--r-- | app/blueprints/packages/screenshots.py | 6 | ||||
-rw-r--r-- | app/blueprints/threads/__init__.py | 19 | ||||
-rw-r--r-- | app/models.py | 34 | ||||
-rw-r--r-- | app/templates/notifications/list.html | 16 | ||||
-rw-r--r-- | app/utils.py | 8 | ||||
-rw-r--r-- | migrations/versions/f612e293070a_.py | 43 |
11 files changed, 120 insertions, 64 deletions
diff --git a/app/blueprints/admin/admin.py b/app/blueprints/admin/admin.py index 5c63fb2..e4fc78b 100644 --- a/app/blueprints/admin/admin.py +++ b/app/blueprints/admin/admin.py @@ -107,8 +107,8 @@ def admin_page(): makeVCSRelease.apply_async((rel.id, "master"), task_id=rel.task_id) - msg = "{}: Release {} created".format(package.title, rel.title) - addNotification(package.maintainers, current_user, msg, rel.getEditURL()) + msg = "Release {} created".format(rel.title) + addNotification(package.maintainers, current_user, msg, rel.getEditURL(), package) db.session.commit() elif action == "cleanuploads": diff --git a/app/blueprints/packages/editrequests.py b/app/blueprints/packages/editrequests.py index 3dd6159..cc17af5 100644 --- a/app/blueprints/packages/editrequests.py +++ b/app/blueprints/packages/editrequests.py @@ -97,10 +97,10 @@ def create_edit_editrequest_page(package, id=None): wasChangeMade = True if wasChangeMade: - msg = "{}: Edit request #{} {}" \ - .format(package.title, erequest.id, "created" if id is None else "edited") - addNotification(package.maintainers, current_user, msg, erequest.getURL()) - addNotification(erequest.author, current_user, msg, erequest.getURL()) + msg = "Edit request #{} {}" \ + .format(erequest.id, "created" if id is None else "edited") + addNotification(package.maintainers, current_user, msg, erequest.getURL(), package) + addNotification(erequest.author, current_user, msg, erequest.getURL(), package) db.session.commit() return redirect(erequest.getURL()) else: @@ -140,9 +140,9 @@ def approve_editrequest_page(package, id): erequest.status = 1 erequest.applyAll(package) - msg = "{}: Edit request #{} merged".format(package.title, erequest.id) - addNotification(erequest.author, current_user, msg, erequest.getURL()) - addNotification(package.maintainers, current_user, msg, erequest.getURL()) + msg = "Edit request #{} merged".format(erequest.id) + addNotification(erequest.author, current_user, msg, erequest.getURL(), package) + addNotification(package.maintainers, current_user, msg, erequest.getURL(), package) db.session.commit() return redirect(package.getDetailsURL()) @@ -164,9 +164,9 @@ def reject_editrequest_page(package, id): else: erequest.status = 2 - msg = "{}: Edit request #{} rejected".format(package.title, erequest.id) - addNotification(erequest.author, current_user, msg, erequest.getURL()) - addNotification(package.maintainers, current_user, msg, erequest.getURL()) + msg = "Edit request #{} rejected".format(erequest.id) + addNotification(erequest.author, current_user, msg, erequest.getURL(), package) + addNotification(package.maintainers, current_user, msg, erequest.getURL(), package) db.session.commit() return redirect(package.getDetailsURL()) diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py index b765eae..3f26444 100644 --- a/app/blueprints/packages/packages.py +++ b/app/blueprints/packages/packages.py @@ -266,7 +266,7 @@ def create_edit(author=None, name=None): else: addNotification(package.maintainers, current_user, - "{} edited".format(package.title), package.getDetailsURL()) + "Edited {}".format(package.title), package.getDetailsURL(), package) form.populate_obj(package) # copy to row @@ -338,7 +338,7 @@ def approve(package): s.approved = True addNotification(package.maintainers, current_user, - "{} approved".format(package.title), package.getDetailsURL()) + "Approved {}".format(package.title), package.getDetailsURL(), package) db.session.commit() return redirect(package.getDetailsURL()) @@ -360,7 +360,7 @@ def remove(package): url = url_for("users.profile", username=package.author.username) addNotification(package.maintainers, current_user, - "{} deleted".format(package.title), url) + "Deleted {}".format(package.title), url, package) db.session.commit() flash("Deleted package", "success") @@ -374,7 +374,7 @@ def remove(package): package.approved = False addNotification(package.maintainers, current_user, - "{} unapproved".format(package.title), package.getDetailsURL()) + "Unapproved {}".format(package.title), package.getDetailsURL(), package) db.session.commit() flash("Unapproved package", "success") @@ -409,19 +409,19 @@ def edit_maintainers(package): for user in users: if not user in package.maintainers: addNotification(user, current_user, - "Added you as a maintainer of {}".format(package.title), package.getDetailsURL()) + "Added you as a maintainer of {}".format(package.title), package.getDetailsURL(), package) for user in package.maintainers: if user != package.author and not user in users: addNotification(user, current_user, - "Removed you as a maintainer of {}".format(package.title), package.getDetailsURL()) + "Removed you as a maintainer of {}".format(package.title), package.getDetailsURL(), package) package.maintainers.clear() package.maintainers.extend(users) package.maintainers.append(package.author) addNotification(package.author, current_user, - "Edited {} maintainers".format(package.title), package.getDetailsURL()) + "Edited {} maintainers".format(package.title), package.getDetailsURL(), package) db.session.commit() @@ -447,7 +447,7 @@ def remove_self_maintainers(package): package.maintainers.remove(current_user) addNotification(package.author, current_user, - "Removed themself as a maintainer of {}".format(package.title), package.getDetailsURL()) + "Removed themself as a maintainer of {}".format(package.title), package.getDetailsURL(), package) db.session.commit() diff --git a/app/blueprints/packages/releases.py b/app/blueprints/packages/releases.py index 33e8a1f..4c069f2 100644 --- a/app/blueprints/packages/releases.py +++ b/app/blueprints/packages/releases.py @@ -92,8 +92,8 @@ def create_release(package): makeVCSRelease.apply_async((rel.id, form["vcsLabel"].data), task_id=rel.task_id) - msg = "{}: Release {} created".format(package.title, rel.title) - addNotification(package.maintainers, current_user, msg, rel.getEditURL()) + msg = "Release {} created".format(rel.title) + addNotification(package.maintainers, current_user, msg, rel.getEditURL(), package) db.session.commit() return redirect(url_for("tasks.check", id=rel.task_id, r=rel.getEditURL())) @@ -112,8 +112,8 @@ def create_release(package): checkZipRelease.apply_async((rel.id, uploadedPath), task_id=rel.task_id) - msg = "{}: Release {} created".format(package.title, rel.title) - addNotification(package.maintainers, current_user, msg, rel.getEditURL()) + msg = "Release {} created".format(rel.title) + addNotification(package.maintainers, current_user, msg, rel.getEditURL(), package) db.session.commit() return redirect(url_for("tasks.check", id=rel.task_id, r=rel.getEditURL())) diff --git a/app/blueprints/packages/reviews.py b/app/blueprints/packages/reviews.py index a662f77..ee6e3a5 100644 --- a/app/blueprints/packages/reviews.py +++ b/app/blueprints/packages/reviews.py @@ -97,11 +97,11 @@ def review(package): notif_msg = None if was_new: - notif_msg = "New review '{}' on package {}".format(form.title.data, package.title) + notif_msg = "New review '{}'".format(form.title.data) else: - notif_msg = "Updated review '{}' on package {}".format(form.title.data, package.title) + notif_msg = "Updated review '{}'".format(form.title.data) - addNotification(package.maintainers, current_user, notif_msg, url_for("threads.view", id=thread.id)) + addNotification(package.maintainers, current_user, notif_msg, url_for("threads.view", id=thread.id), package) db.session.commit() @@ -129,8 +129,8 @@ def delete_review(package): thread.review = None - notif_msg = "Deleted review '{}' on package {}, comments were kept as a thread".format(thread.title, package.title) - addNotification(package.maintainers, current_user, notif_msg, url_for("threads.view", id=thread.id)) + notif_msg = "Deleted review '{}', comments were kept as a thread".format(thread.title) + addNotification(package.maintainers, current_user, notif_msg, url_for("threads.view", id=thread.id), package) db.session.delete(review) db.session.commit() diff --git a/app/blueprints/packages/screenshots.py b/app/blueprints/packages/screenshots.py index 9364469..40cf4d2 100644 --- a/app/blueprints/packages/screenshots.py +++ b/app/blueprints/packages/screenshots.py @@ -60,9 +60,9 @@ def create_screenshot(package, id=None): ss.approved = package.checkPerm(current_user, Permission.APPROVE_SCREENSHOT) db.session.add(ss) - msg = "{}: Screenshot added {}" \ - .format(package.title, ss.title) - addNotification(package.maintainers, current_user, msg, package.getDetailsURL()) + msg = "Screenshot added {}" \ + .format(ss.title) + addNotification(package.maintainers, current_user, msg, package.getDetailsURL(), package) db.session.commit() return redirect(package.getDetailsURL()) diff --git a/app/blueprints/threads/__init__.py b/app/blueprints/threads/__init__.py index ad58545..a4728a0 100644 --- a/app/blueprints/threads/__init__.py +++ b/app/blueprints/threads/__init__.py @@ -106,14 +106,8 @@ def view(id): if not current_user in thread.watchers: thread.watchers.append(current_user) - msg = None - if thread.package is None: - msg = "New comment on '{}'".format(thread.title) - else: - msg = "New comment on '{}' on package {}".format(thread.title, thread.package.title) - - - addNotification(thread.watchers, current_user, msg, url_for("threads.view", id=thread.id)) + msg = "New comment on '{}'".format(thread.title) + addNotification(thread.watchers, current_user, msg, url_for("threads.view", id=thread.id), thread.package) db.session.commit() return redirect(url_for("threads.view", id=id)) @@ -200,15 +194,12 @@ def new(): if is_review_thread: package.review_thread = thread - notif_msg = None + notif_msg = "New thread '{}'".format(thread.title) if package is not None: - notif_msg = "New thread '{}' on package {}".format(thread.title, package.title) - addNotification(package.maintainers, current_user, notif_msg, url_for("threads.view", id=thread.id)) - else: - notif_msg = "New thread '{}'".format(thread.title) + addNotification(package.maintainers, current_user, notif_msg, url_for("threads.view", id=thread.id), package) editors = User.query.filter(User.rank >= UserRank.EDITOR).all() - addNotification(editors, current_user, notif_msg, url_for("threads.view", id=thread.id)) + addNotification(editors, current_user, notif_msg, url_for("threads.view", id=thread.id), package) db.session.commit() diff --git a/app/models.py b/app/models.py index 3a9ddf4..acd427a 100644 --- a/app/models.py +++ b/app/models.py @@ -240,23 +240,31 @@ class UserEmailVerification(db.Model): user = db.relationship("User", foreign_keys=[user_id]) class Notification(db.Model): - id = db.Column(db.Integer, primary_key=True) - user_id = db.Column(db.Integer, db.ForeignKey("user.id")) - causer_id = db.Column(db.Integer, db.ForeignKey("user.id")) - user = db.relationship("User", foreign_keys=[user_id]) - causer = db.relationship("User", foreign_keys=[causer_id]) + id = db.Column(db.Integer, primary_key=True) + + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + user = db.relationship("User", foreign_keys=[user_id]) + + causer_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + causer = db.relationship("User", foreign_keys=[causer_id]) + + title = db.Column(db.String(100), nullable=False) + url = db.Column(db.String(200), nullable=True) + + package_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True) + package = db.relationship("Package", foreign_keys=[package_id]) - title = db.Column(db.String(100), nullable=False) - url = db.Column(db.String(200), nullable=True) + created_at = db.Column(db.DateTime, nullable=True, default=datetime.datetime.utcnow) - def __init__(self, us, cau, titl, ur): - if len(titl) > 100: + def __init__(self, user, causer, title, url, package=None): + if len(title) > 100: title = title[:99] + "…" - self.user = us - self.causer = cau - self.title = titl - self.url = ur + self.user = user + self.causer = causer + self.title = title + self.url = url + self.package = package class License(db.Model): diff --git a/app/templates/notifications/list.html b/app/templates/notifications/list.html index 61f884a..d250312 100644 --- a/app/templates/notifications/list.html +++ b/app/templates/notifications/list.html @@ -18,12 +18,26 @@ Notifications {% for n in current_user.notifications %} <a class="list-group-item list-group-item-action" href="{{ n.url }}"> <div class="row"> + {% if n.package %} + + <div class="col-sm-auto text-muted"> + <img + class="img-responsive" + style="max-height: 22px; max-width: 22px;" + src="{{ n.package.getThumbnailURL(1) }}" /> + + <span class="pl-2"> + {{ n.package.title }} + </span> + </div> + {% endif %} + <div class="col-sm"> {{ n.title}} </div> <div class="col-sm-auto text-muted text-right"> - <span class="pr-1">{{ n.causer.display_name }}</span> + <span class="pr-2">{{ n.causer.display_name }}</span> <img class="img-responsive user-photo img-thumbnail img-thumbnail-1" style="max-height: 22px;" diff --git a/app/utils.py b/app/utils.py index 618a4aa..5f47f75 100644 --- a/app/utils.py +++ b/app/utils.py @@ -189,18 +189,18 @@ def is_package_page(f): return decorated_function -def addNotification(target, causer, title, url): +def addNotification(target, causer, title, url, package=None): try: iter(target) for x in target: - addNotification(x, causer, title, url) + addNotification(x, causer, title, url, package) return except TypeError: pass if target.rank.atLeast(UserRank.NEW_MEMBER) and target != causer: - Notification.query.filter_by(user=target, causer=causer, title=title, url=url).delete() - notif = Notification(target, causer, title, url) + Notification.query.filter_by(user=target, causer=causer, title=title, url=url, package=package).delete() + notif = Notification(target, causer, title, url, package) db.session.add(notif) diff --git a/migrations/versions/f612e293070a_.py b/migrations/versions/f612e293070a_.py new file mode 100644 index 0000000..b451236 --- /dev/null +++ b/migrations/versions/f612e293070a_.py @@ -0,0 +1,43 @@ +"""empty message + +Revision ID: f612e293070a +Revises: 019da77ba02d +Create Date: 2020-07-10 23:32:02.465374 + +""" +from alembic import op +import sqlalchemy as sa +import datetime + +# revision identifiers, used by Alembic. +revision = 'f612e293070a' +down_revision = '019da77ba02d' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('notification', sa.Column('created_at', sa.DateTime(), nullable=True, server_default=datetime.datetime.utcnow().isoformat())) + op.add_column('notification', sa.Column('package_id', sa.Integer(), nullable=True)) + op.alter_column('notification', 'causer_id', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('notification', 'user_id', + existing_type=sa.INTEGER(), + nullable=False) + op.create_foreign_key(None, 'notification', 'package', ['package_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'notification', type_='foreignkey') + op.alter_column('notification', 'user_id', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('notification', 'causer_id', + existing_type=sa.INTEGER(), + nullable=True) + op.drop_column('notification', 'package_id') + # ### end Alembic commands ### |