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 TicketSubscription
from todosrht.types import Event, EventType, EventNotification from todosrht.types import Event, EventType, EventNotification
from todosrht.types import Tracker, Ticket, TicketStatus, TicketAccess 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 todosrht.urls import tracker_url
from srht.config import cfg from srht.config import cfg
from srht.database import db from srht.database import db
from srht.flask import paginate_query, loginrequired from srht.flask import paginate_query, loginrequired
from srht.validation import Validation from srht.validation import Validation
from datetime import datetime from datetime import datetime
from sqlalchemy import and_
tracker = Blueprint("tracker", __name__) tracker = Blueprint("tracker", __name__)
@ -97,7 +98,14 @@ def return_tracker(tracker, access, **kwargs):
).one_or_none() ).one_or_none()
is_subscribed = bool(sub) 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") search = request.args.get("search")
tickets = tickets.order_by(Ticket.updated.desc()) tickets = tickets.order_by(Ticket.updated.desc())
if search: if search:

View File

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

View File

@ -51,14 +51,3 @@ class Ticket(Base):
view_list = sa.orm.relationship("TicketSeen") view_list = sa.orm.relationship("TicketSeen")
labels = sa.orm.relationship("Label", secondary="ticket_label") 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