Filter private events from events feed

This commit is contained in:
Gregory Mullen 2018-06-23 12:38:46 -07:00 committed by Drew DeVault
parent 9c94ff36a1
commit 047f5197f2
6 changed files with 126 additions and 31 deletions

View File

@ -11,7 +11,7 @@ def get_access(tracker, ticket):
return ticket.submitter_perms or tracker.default_submitter_perms
return tracker.default_user_perms
if ticket:
if ticket and ticket.anonymous_perms:
return ticket.anonymous_perms
return tracker.default_anonymous_perms

View File

@ -0,0 +1,93 @@
"""clear defaults from tickets to support tracker perms
Revision ID: cb9732f3364c
Revises: 6169a5600336
Create Date: 2017-12-08 00:11:44.296523
"""
# revision identifiers, used by Alembic.
revision = 'cb9732f3364c'
down_revision = '6169a5600336'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
Session = sessionmaker()
Base = declarative_base()
from enum import IntFlag
class TicketAccess(IntFlag):
none = 0
browse = 1
submit = 2
comment = 4
edit = 8
triage = 16
all = browse | submit | comment | edit | triage
import sqlalchemy.types as types
from srht.flagtype import FlagType
class Ticket(Base):
__tablename__ = 'ticket'
id = sa.Column(sa.Integer, primary_key=True)
scoped_id = sa.Column(sa.Integer)
tracker_id = sa.Column(sa.Integer, sa.ForeignKey("tracker.id"), nullable=False)
tracker = sa.orm.relationship("Tracker")
user_perms = sa.Column(FlagType(TicketAccess), nullable=True)
submitter_perms = sa.Column(FlagType(TicketAccess), nullable=True)
committer_perms = sa.Column(FlagType(TicketAccess), nullable=True)
anonymous_perms = sa.Column(FlagType(TicketAccess), nullable=True)
class Tracker(Base):
__tablename__ = 'tracker'
id = sa.Column(sa.Integer, primary_key=True)
next_ticket_id = sa.Column(sa.Integer, nullable=False, default=1)
default_user_perms = sa.Column(FlagType(TicketAccess), nullable=False)
default_submitter_perms = sa.Column(FlagType(TicketAccess), nullable=False)
default_committer_perms = sa.Column(FlagType(TicketAccess), nullable=False)
default_anonymous_perms = sa.Column(FlagType(TicketAccess), nullable=False)
def upgrade():
op.alter_column("ticket", "user_perms", nullable=True)
op.alter_column("ticket", "submitter_perms", nullable=True)
op.alter_column("ticket", "committer_perms", nullable=True)
op.alter_column("ticket", "anonymous_perms", nullable=True)
bind = op.get_bind()
session = sessionmaker()(bind=bind)
for ticket in session.query(Ticket):
if ticket.anonymous_perms == ticket.tracker.default_anonymous_perms:
ticket.anonymous_perms = None
if ticket.user_perms == ticket.tracker.default_user_perms:
ticket.user_perms = None
if ticket.submitter_perms == ticket.tracker.default_submitter_perms:
ticket.submitter_perms = None
if ticket.committer_perms == ticket.tracker.default_committer_perms:
ticket.committer_perms = None
session.commit()
def downgrade():
bind = op.get_bind()
session = sessionmaker()(bind=bind)
for ticket in session.query(Ticket):
ticket.anonymous_perms = ticket.tracker.default_anonymous_perms
ticket.user_perms = ticket.tracker.default_user_perms
ticket.submitter_perms = ticket.tracker.default_submitter_perms
ticket.committer_perms = ticket.tracker.default_committer_perms
session.commit()
op.alter_column("ticket", "user_perms", nullable=False)
op.alter_column("ticket", "submitter_perms", nullable=False)
op.alter_column("ticket", "committer_perms", nullable=False)
op.alter_column("ticket", "anonymous_perms", nullable=False)

View File

@ -1,6 +1,6 @@
from flask import Blueprint, render_template
from flask_login import current_user
from todosrht.access import get_tracker
from todosrht.access import get_tracker, get_access
from todosrht.types import Tracker, Event, EventNotification, EventType
from todosrht.types import User
from srht.config import cfg
@ -10,6 +10,19 @@ html = Blueprint('html', __name__)
meta_uri = cfg("network", "meta")
def collect_events(target, count):
events = []
for e in (EventNotification.query
.filter(EventNotification.user_id == target.id)
.order_by(EventNotification.created.desc())):
ticket = e.event.ticket
tracker = ticket.tracker
if get_access(tracker, ticket):
events.append(e.event)
if len(events) >= count:
break
return events
@html.route("/")
def index():
if not current_user:
@ -18,28 +31,20 @@ def index():
trackers = (Tracker.query
.filter(Tracker.owner_id == current_user.id)
.order_by(Tracker.updated.desc())).all()
events = [e.event for e in (EventNotification.query
.filter(EventNotification.user_id == current_user.id)
.order_by(EventNotification.created.desc())
.limit(10)).all()]
events = collect_events(current_user, 10)
return render_template("dashboard.html",
trackers=trackers,
tracker_list_msg="Your Trackers",
events=events,
EventType=EventType)
trackers=trackers,
tracker_list_msg="Your Trackers",
events=events,
EventType=EventType)
@html.route("/~<username>")
def user_GET(username):
print(username)
user = User.query.filter(User.username == username.lower()).first()
if not user:
abort(404)
trackers, _ = get_tracker(username, None)
# TODO: only show public events (or events the current user can see)
events = (Event.query
.filter(Event.user_id == user.id)
.order_by(Event.created.desc())
.limit(10)).all()
events = collect_events(user, 10)
r = requests.get(meta_uri + "/api/user/profile", headers={
"Authorization": "token " + user.oauth_token
}) # TODO: cache this
@ -48,9 +53,9 @@ def user_GET(username):
else:
profile = dict()
return render_template("dashboard.html",
user=user,
profile=profile,
trackers=trackers,
tracker_list_msg="Trackers",
events=events,
EventType=EventType)
user=user,
profile=profile,
trackers=trackers,
tracker_list_msg="Trackers",
events=events,
EventType=EventType)

View File

@ -169,6 +169,7 @@ def tracker_GET(owner, name):
abort(404)
return return_tracker(tracker, access)
def parse_html_perms(short, valid):
result = 0
for sub_perm in TicketAccess:

View File

@ -47,7 +47,7 @@
disabled />
{{ valid.summary("tracker_name") }}
</div>
<div class="form-group {{valid.cls("tracker_desc")}}">
<div class="form-group {{ valid.cls('tracker_desc') }}">
<label for="tracker_desc">Description</label>
<textarea
name="tracker_desc"

View File

@ -37,20 +37,16 @@ class Ticket(Base):
nullable=False,
default=TicketStatus.resolved)
user_perms = sa.Column(FlagType(TicketAccess),
default=TicketAccess.browse + TicketAccess.submit + TicketAccess.comment)
user_perms = sa.Column(FlagType(TicketAccess), nullable=True)
"""Permissions given to any logged in user"""
submitter_perms = sa.Column(FlagType(TicketAccess),
default=TicketAccess.browse + TicketAccess.edit + TicketAccess.comment)
submitter_perms = sa.Column(FlagType(TicketAccess), nullable=True)
"""Permissions granted to submitters for their own tickets"""
committer_perms = sa.Column(FlagType(TicketAccess),
default=TicketAccess.browse + TicketAccess.submit + TicketAccess.comment)
committer_perms = sa.Column(FlagType(TicketAccess), nullable=True)
"""Permissions granted to people who have authored commits in the linked git repo"""
anonymous_perms = sa.Column(FlagType(TicketAccess),
default=TicketAccess.browse)
anonymous_perms = sa.Column(FlagType(TicketAccess), nullable=True)
"""Permissions granted to anonymous (non-logged in) users"""
view_list = sa.orm.relationship("TicketSeen")