From c7ed6615dae2a47cb439da77d2d3d492b1b123c8 Mon Sep 17 00:00:00 2001 From: Ivan Habunek Date: Tue, 20 Nov 2018 13:46:33 +0100 Subject: [PATCH] Load seen time in the same query as tickets Use left join to load related TicketSeen objects along with Tickets instead of doing a query per ticket when rendering. --- todosrht/blueprints/tracker.py | 12 ++++++++++-- todosrht/templates/tracker.html | 4 ++-- todosrht/types/ticket.py | 11 ----------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/todosrht/blueprints/tracker.py b/todosrht/blueprints/tracker.py index ac44096..5ae5d2d 100644 --- a/todosrht/blueprints/tracker.py +++ b/todosrht/blueprints/tracker.py @@ -10,13 +10,14 @@ from todosrht.search import apply_search from todosrht.types import TicketSubscription from todosrht.types import Event, EventType, EventNotification from todosrht.types import Tracker, Ticket, TicketStatus, TicketAccess -from todosrht.types import Label, TicketLabel +from todosrht.types import Label, TicketLabel, TicketSeen from todosrht.urls import tracker_url from srht.config import cfg from srht.database import db from srht.flask import paginate_query, loginrequired from srht.validation import Validation from datetime import datetime +from sqlalchemy import and_ tracker = Blueprint("tracker", __name__) @@ -97,7 +98,14 @@ def return_tracker(tracker, access, **kwargs): ).one_or_none() is_subscribed = bool(sub) - tickets = Ticket.query.filter(Ticket.tracker_id == tracker.id) + tickets = (db.session + .query(Ticket, TicketSeen) + .filter(Ticket.tracker_id == tracker.id) + .outerjoin(TicketSeen, and_( + TicketSeen.ticket_id == Ticket.id, + TicketSeen.user == current_user, + ))) + search = request.args.get("search") tickets = tickets.order_by(Ticket.updated.desc()) if search: diff --git a/todosrht/templates/tracker.html b/todosrht/templates/tracker.html index f347461..72513c1 100644 --- a/todosrht/templates/tracker.html +++ b/todosrht/templates/tracker.html @@ -136,7 +136,7 @@ {% if len(tickets) %}
- {% for ticket in tickets %} + {% for ticket, seen in tickets %} @@ -154,7 +154,7 @@ {{ ticket.submitter }}
- {% if ticket.new_updates(current_user) %} + {% if seen and seen.last_view >= ticket.updated %}
{{icon("comments-o")}} {{ ticket.comments | length }} diff --git a/todosrht/types/ticket.py b/todosrht/types/ticket.py index 33d26ba..464d8d2 100644 --- a/todosrht/types/ticket.py +++ b/todosrht/types/ticket.py @@ -51,14 +51,3 @@ class Ticket(Base): view_list = sa.orm.relationship("TicketSeen") labels = sa.orm.relationship("Label", secondary="ticket_label") - - def new_updates(self, user): - if not user: - return None - seen = (TicketSeen.query - .filter(TicketSeen.user_id == user.id, - TicketSeen.ticket_id == self.id) - .one_or_none()) - if seen: - return seen.last_view >= self.updated - return None