Add last_seen/new_updates icon to the ticket tracker list (added alembic)

This commit is contained in:
Gregory Mullen 2017-10-30 12:46:49 -07:00 committed by Drew DeVault
parent 0057db5631
commit f191ced8f2
7 changed files with 67 additions and 5 deletions

View File

@ -0,0 +1,26 @@
"""Add last view table
Revision ID: afece1d17451
Revises: 237974dd94c4
Create Date: 2017-10-30 12:38:47.769260
"""
# revision identifiers, used by Alembic.
revision = 'afece1d17451'
down_revision = '237974dd94c4'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table(
'ticket_seen',
sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id'), primary_key=True),
sa.Column('ticket_id', sa.Integer, sa.ForeignKey('ticket.id'), primary_key=True),
sa.Column('last_view', sa.DateTime, nullable=False, server_default=sa.sql.func.now())
)
def downgrade():
op.drop_table('ticket_seen')

View File

@ -8,7 +8,7 @@ from srht.config import cfg, cfgi, load_config
load_config("todo")
from srht.database import DbSession
db = DbSession(cfg("sr.ht", "connection-string"))
from todosrht.types import User, TicketAccess, TicketStatus, TicketResolution
from todosrht.types import User, TicketAccess, TicketStatus, TicketResolution, TicketSeen
db.init()
from srht.flask import SrhtFlask

View File

@ -4,7 +4,7 @@ from flask import Blueprint, render_template, request, url_for, abort, redirect
from flask import session
from flask_login import current_user
from todosrht.decorators import loginrequired
from todosrht.types import Tracker, User, Ticket, TicketStatus, TicketAccess
from todosrht.types import Tracker, User, Ticket, TicketStatus, TicketAccess, TicketSeen
from todosrht.types import TicketComment, TicketResolution
from srht.validation import Validation
from srht.database import db
@ -215,6 +215,12 @@ def ticket_GET(owner, name, ticket_id):
ticket, access = get_ticket(tracker, ticket_id)
if not ticket:
abort(404)
seen = TicketSeen.query.filter(TicketSeen.user_id==current_user.id, TicketSeen.ticket_id==ticket.id).one_or_none()
if not seen:
seen = TicketSeen(user_id=current_user.id, ticket_id=ticket.id)
seen.update()
db.session.add(seen)
db.session.commit()
return render_template("ticket.html",
tracker=tracker,
ticket=ticket,

View File

@ -95,8 +95,8 @@
<th></th>
<th>Title</th>
<th>Updated</th>
<th>Comments</th>
<th>Submitter</th>
<th></th>
</tr>
</thead>
<tbody>
@ -108,11 +108,15 @@
ticket_id=ticket.scoped_id)}}">#{{ticket.scoped_id}}</a></td>
<td>{{ ticket.title }}</td>
<td>{{ ticket.updated | date }}</td>
<td>{{ ticket.comments | length }}</td>
<td><a href="{{url_for(".ticket_GET",
owner="~" + tracker.owner.username,
name=tracker.name,
ticket_id=ticket.scoped_id)}}">{{ ticket.submitter.username }}</a></td>
{% if ticket.new_updates(current_user) %}
<td style="text-align: center">{{ ticket.comments | length }}&nbsp;<span class="fa fa-fw fa-comments-o"></span></td>
{% else %}
<td style="text-align: center">{{ ticket.comments | length }}&nbsp;<span class="fa fa-fw fa-comments"></span></td>
{% endif %}
</tr>
{% endfor %}
</tbody>

View File

@ -2,6 +2,7 @@ from .user import User
from .ticketaccess import TicketAccess
from .ticketstatus import TicketStatus, TicketResolution
from .tracker import Tracker
from .ticketseen import TicketSeen
from .ticket import Ticket
from .ticketsubscription import TicketSubscription
from .ticketcomment import TicketComment

View File

@ -1,7 +1,7 @@
import sqlalchemy as sa
from srht.database import Base
from srht.flagtype import FlagType
from todosrht.types import TicketAccess, TicketStatus, TicketResolution
from todosrht.types import TicketAccess, TicketStatus, TicketResolution, TicketSeen
class Ticket(Base):
__tablename__ = 'ticket'
@ -52,3 +52,12 @@ class Ticket(Base):
anonymous_perms = sa.Column(FlagType(TicketAccess),
default=TicketAccess.browse)
"""Permissions granted to anonymous (non-logged in) users"""
view_list = sa.orm.relationship("TicketSeen")
def new_updates(self, user):
seen = TicketSeen.query.filter(TicketSeen.user_id == user.id, TicketSeen.ticket_id == self.id).one_or_none()
if seen:
if seen.last_view >= self.updated:
return True
return False
return None

View File

@ -0,0 +1,16 @@
import sqlalchemy as sa
import sqlalchemy_utils as sau
from srht.database import Base
class TicketSeen(Base):
"""Stores the last time a user viewed this ticket. Calculates if comments have been seen."""
__tablename__ = 'ticket_seen'
user_id = sa.Column(sa.Integer, sa.ForeignKey('user.id'), primary_key=True)
ticket_id = sa.Column(sa.Integer, sa.ForeignKey('ticket.id'), primary_key=True)
last_view = sa.Column(sa.DateTime, nullable=False, server_default=sa.sql.func.now())
user = sa.orm.relationship("User")
ticket = sa.orm.relationship("Ticket")
def update(self):
self.last_view = sa.sql.func.now()