todo.sr.ht/todosrht/blueprints/html.py

138 lines
4.9 KiB
Python
Raw Normal View History

from flask import Blueprint, render_template, request, abort
2018-06-23 21:38:46 +02:00
from todosrht.access import get_tracker, get_access
2019-08-21 08:35:44 +02:00
from todosrht.tickets import get_participant_for_user
from todosrht.types import Tracker, Ticket, Event, EventNotification, EventType
2019-08-21 08:35:44 +02:00
from todosrht.types import User, Participant
2017-11-10 04:29:34 +01:00
from srht.config import cfg
2019-11-30 16:17:42 +01:00
from srht.oauth import current_user
from srht.flask import paginate_query, session
from sqlalchemy import and_, or_
2017-07-22 03:00:00 +02:00
html = Blueprint('html', __name__)
def filter_authorized_events(events):
events = (events
.join(Ticket, Ticket.id == Event.ticket_id)
.join(Tracker, Tracker.id == Ticket.tracker_id))
if current_user:
2019-08-21 08:35:44 +02:00
participant = get_participant_for_user(current_user)
events = (events.filter(
or_(
and_(
Ticket.submitter_perms != None,
2019-08-21 08:35:44 +02:00
Ticket.submitter_id == participant.id,
Ticket.submitter_perms > 0),
and_(
Ticket.user_perms != None,
Ticket.user_perms > 0),
and_(
Ticket.anonymous_perms != None,
Ticket.anonymous_perms > 0),
and_(
Ticket.submitter_perms == None,
2019-08-21 08:35:44 +02:00
Ticket.submitter_id == participant.id,
Tracker.default_submitter_perms > 0),
and_(
Ticket.user_perms == None,
Tracker.default_user_perms > 0),
and_(
Ticket.anonymous_perms == None,
Tracker.default_anonymous_perms > 0))))
else:
events = (events.filter(
or_(
and_(
Ticket.anonymous_perms != None,
Ticket.anonymous_perms > 0),
and_(
Ticket.anonymous_perms == None,
Tracker.default_anonymous_perms > 0))))
2018-06-23 21:38:46 +02:00
return events
2017-07-22 03:00:00 +02:00
@html.route("/")
def index():
2017-11-09 14:59:47 +01:00
if not current_user:
return render_template("index.html")
2017-11-10 04:29:34 +01:00
trackers = (Tracker.query
2018-07-11 14:21:20 +02:00
.filter(Tracker.owner_id == current_user.id)
.order_by(Tracker.updated.desc())
)
limit_trackers = 10
2018-07-11 14:21:20 +02:00
total_trackers = trackers.count()
trackers = trackers.limit(limit_trackers).all()
events = (Event.query
.join(EventNotification)
.filter(EventNotification.user_id == current_user.id)
.order_by(Event.created.desc()))
events = events.limit(10).all()
2018-07-11 14:21:20 +02:00
2018-12-13 04:48:43 +01:00
notice = session.get("notice")
if notice:
del session["notice"]
2017-11-09 14:59:47 +01:00
return render_template("dashboard.html",
2018-12-13 04:48:43 +01:00
trackers=trackers, notice=notice,
2018-06-23 21:38:46 +02:00
tracker_list_msg="Your Trackers",
2018-07-11 14:21:20 +02:00
more_trackers=total_trackers > limit_trackers,
2018-12-13 04:48:43 +01:00
events=events, EventType=EventType)
2017-11-10 04:23:02 +01:00
@html.route("/~<username>")
def user_GET(username):
user = User.query.filter(User.username == username.lower()).first()
if not user:
abort(404)
2018-07-11 14:02:48 +02:00
2018-07-11 14:21:20 +02:00
trackers = Tracker.query.filter(Tracker.owner_id == user.id)
if current_user and current_user != user:
trackers = trackers.filter(Tracker.default_user_perms > 0)
elif not current_user:
trackers = trackers.filter(Tracker.default_anonymous_perms > 0)
limit_trackers = 10
2018-07-11 14:21:20 +02:00
total_trackers = trackers.count()
trackers = (trackers
.order_by(Tracker.updated.desc())
.limit(limit_trackers)
).all()
# TODO: Join on stuff the user has explicitly been granted access to
events = (Event.query
2019-08-21 08:35:44 +02:00
.join(Participant, Event.participant_id == Participant.id)
.filter(Participant.user_id == user.id)
.order_by(Event.created.desc()))
if not current_user or current_user.id != user.id:
events = filter_authorized_events(events)
events = events.limit(10).all()
2018-07-11 14:02:48 +02:00
2017-11-10 04:23:02 +01:00
return render_template("dashboard.html",
2018-06-23 21:38:46 +02:00
user=user,
trackers=trackers,
tracker_list_msg="Trackers",
2018-07-11 14:21:20 +02:00
more_trackers=total_trackers > limit_trackers,
2018-06-23 21:38:46 +02:00
events=events,
EventType=EventType)
2018-07-11 14:21:20 +02:00
@html.route("/trackers/~<username>")
def trackers_for_user(username):
user = User.query.filter(User.username == username.lower()).first()
if not user:
abort(404)
trackers = Tracker.query.filter(Tracker.owner_id == user.id)
if current_user and current_user != user:
trackers = trackers.filter(Tracker.default_user_perms > 0)
elif not current_user:
trackers = trackers.filter(Tracker.default_anonymous_perms > 0)
search = request.args.get("search")
if search:
trackers = trackers.filter(or_(
Tracker.name.ilike("%" + search + "%"),
Tracker.description.ilike("%" + search + "%")))
trackers = trackers.order_by(Tracker.updated.desc())
trackers, pagination = paginate_query(trackers)
return render_template("trackers.html",
2019-02-13 20:14:00 +01:00
user=user, trackers=trackers, search=search, **pagination)