Filter private events from events feed
This commit is contained in:
parent
9c94ff36a1
commit
047f5197f2
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue