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.
This commit is contained in:
Ivan Habunek 2018-11-20 13:46:33 +01:00 committed by Drew DeVault
parent dc0de33664
commit c7ed6615da
3 changed files with 12 additions and 15 deletions

View File

@ -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:

View File

@ -136,7 +136,7 @@
</form>
{% if len(tickets) %}
<div class="ticket-list">
{% for ticket in tickets %}
{% for ticket, seen in tickets %}
<div class="id">
<a href="{{ ticket|ticket_url }}">#{{ticket.scoped_id}}</a>
</div>
@ -154,7 +154,7 @@
{{ ticket.submitter }}
</a>
</div>
{% if ticket.new_updates(current_user) %}
{% if seen and seen.last_view >= ticket.updated %}
<div class="comments">
{{icon("comments-o")}}
{{ ticket.comments | length }}

View File

@ -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