Make use of filters to make code more readable

This commit is contained in:
Ivan Habunek 2018-11-17 20:21:55 +01:00 committed by Drew DeVault
parent 92f3d2a9a1
commit dc0de33664
14 changed files with 108 additions and 170 deletions

View File

@ -1,4 +1,3 @@
from jinja2.utils import Markup
from srht.config import cfg
from srht.database import DbSession
from srht.flask import SrhtFlask
@ -28,8 +27,11 @@ class TodoApp(SrhtFlask):
self.add_template_filter(filters.label_badge)
self.add_template_filter(urls.label_search_url)
self.add_template_filter(urls.ticket_edit_url)
self.add_template_filter(urls.ticket_url)
self.add_template_filter(urls.tracker_labels_url)
self.add_template_filter(urls.tracker_url)
self.add_template_filter(urls.user_url)
meta_client_id = cfg("todo.sr.ht", "oauth-client-id")
meta_client_secret = cfg("todo.sr.ht", "oauth-client-secret")

View File

@ -1,5 +1,5 @@
import re
from flask import Blueprint, render_template, request, url_for, abort, redirect
from flask import Blueprint, render_template, request, abort, redirect
from flask_login import current_user
from srht.database import db
from srht.flask import loginrequired
@ -69,16 +69,14 @@ def enable_notifications(owner, name, ticket_id):
).one_or_none()
if sub:
return redirect(url_for(".ticket_GET",
owner=owner, name=name, ticket_id=ticket.scoped_id))
return redirect(ticket_url(ticket))
sub = TicketSubscription()
sub.ticket_id = ticket.id
sub.user_id = current_user.id
db.session.add(sub)
db.session.commit()
return redirect(url_for(".ticket_GET",
owner=owner, name=name, ticket_id=ticket.scoped_id))
return redirect(ticket_url(ticket))
@ticket.route("/<owner>/<name>/<int:ticket_id>/disable_notifications", methods=["POST"])
@loginrequired
@ -97,13 +95,11 @@ def disable_notifications(owner, name, ticket_id):
).one_or_none()
if not sub:
return redirect(url_for(".ticket_GET",
owner=owner, name=name, ticket_id=ticket.scoped_id))
return redirect(ticket_url(ticket))
db.session.delete(sub)
db.session.commit()
return redirect(url_for(".ticket_GET",
owner=owner, name=name, ticket_id=ticket.scoped_id))
return redirect(ticket_url(ticket))
@ticket.route("/<owner>/<name>/<int:ticket_id>/comment", methods=["POST"])
@loginrequired
@ -195,10 +191,7 @@ def ticket_edit_POST(owner, name, ticket_id):
ticket.description = desc
db.session.commit()
return redirect(url_for("ticket.ticket_GET",
owner=tracker.owner.canonical_name(),
name=name,
ticket_id=ticket.scoped_id))
return redirect(ticket_url(ticket))
@ticket.route("/<owner>/<name>/<int:ticket_id>/add_label", methods=["POST"])
@loginrequired
@ -249,10 +242,7 @@ def ticket_add_label(owner, name, ticket_id):
db.session.add(event)
db.session.commit()
return redirect(url_for("ticket.ticket_GET",
owner=tracker.owner.canonical_name(),
name=name,
ticket_id=ticket_id))
return redirect(ticket_url(ticket))
@ticket.route("/<owner>/<name>/<int:ticket_id>/remove_label/<int:label_id>",
methods=["POST"])
@ -285,7 +275,4 @@ def ticket_remove_label(owner, name, ticket_id, label_id):
db.session.delete(ticket_label)
db.session.commit()
return redirect(url_for("ticket.ticket_GET",
owner=tracker.owner.canonical_name(),
name=name,
ticket_id=ticket_id))
return redirect(ticket_url(ticket))

View File

@ -11,6 +11,7 @@ from todosrht.types import TicketSubscription
from todosrht.types import Event, EventType, EventNotification
from todosrht.types import Tracker, Ticket, TicketStatus, TicketAccess
from todosrht.types import Label, TicketLabel
from todosrht.urls import tracker_url
from srht.config import cfg
from srht.database import db
from srht.flask import paginate_query, loginrequired
@ -81,9 +82,7 @@ def create_POST():
owner=current_user.username,
name=name))
return redirect(url_for(".tracker_GET",
owner=current_user.canonical_name(),
name=name))
return redirect(tracker_url(tracker))
def return_tracker(tracker, access, **kwargs):
another = session.get("another") or False
@ -137,14 +136,14 @@ def enable_notifications(owner, name):
).one_or_none()
if sub:
return redirect(url_for(".tracker_GET", owner=owner, name=name))
return redirect(tracker_url(tracker))
sub = TicketSubscription()
sub.tracker_id = tracker.id
sub.user_id = current_user.id
db.session.add(sub)
db.session.commit()
return redirect(url_for(".tracker_GET", owner=owner, name=name))
return redirect(tracker_url(tracker))
@tracker.route("/<owner>/<name>/disable_notifications", methods=["POST"])
@loginrequired
@ -160,11 +159,11 @@ def disable_notifications(owner, name):
).one_or_none()
if not sub:
return redirect(url_for(".tracker_GET", owner=owner, name=name))
return redirect(tracker_url(tracker))
db.session.delete(sub)
db.session.commit()
return redirect(url_for(".tracker_GET", owner=owner, name=name))
return redirect(tracker_url(tracker))
def parse_html_perms(short, valid):
result = 0
@ -219,7 +218,7 @@ def configure_POST(owner, name):
tracker.description = desc
db.session.commit()
return redirect(url_for(".tracker_GET", owner=owner, name=name))
return redirect(tracker_url(tracker))
@tracker.route("/<owner>/<name>/configure")

View File

@ -1,6 +1,6 @@
from jinja2.utils import Markup, escape
from srht.flask import icon, csrf_token
from todosrht.urls import label_search_url, label_remove_url
from todosrht import urls
def label_badge(label, cls="", remove_from_ticket=None):
@ -17,10 +17,10 @@ def label_badge(label, cls="", remove_from_ticket=None):
html_class = escape(f"label {cls}".strip())
style = f"color: {color}; background-color: {bg_color}"
search_url = label_search_url(label)
search_url = urls.label_search_url(label)
if remove_from_ticket:
remove_url = label_remove_url(label, remove_from_ticket)
remove_url = urls.label_remove_url(label, remove_from_ticket)
remove_form = f"""
<form method="POST" action="{remove_url}">
{csrf_token()}

View File

@ -50,13 +50,9 @@
<div class="tracker-list">
{% for tracker in trackers %}
<h4>
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/<a
href="{{ url_for("tracker.tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
>{{tracker.name}}</a>
<a href="{{ tracker.owner|user_url }}"
>{{ tracker.owner }}</a>/<a href="{{ tracker|tracker_url }}"
>{{ tracker.name }}</a>
</h4>
<span class="text-muted">Last active {{ tracker.updated | date }}</span>
{% endfor %}

View File

@ -13,15 +13,10 @@
<div class="col-md-12 header-tabbed vertical">
<h2>
<span class="d-block d-md-inline">
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/<a
href="{{ url_for("tracker.tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
>{{tracker.name}}</a>/#{{ticket.scoped_id}}<span
class="d-none d-md-inline"
>:</span>
<a href="{{ tracker.owner|user_url }}"
>{{ tracker.owner }}</a>/<a href="{{ tracker|tracker_url }}"
>{{ tracker.name }}</a>/#{{ ticket.scoped_id }}<span
class="d-none d-md-inline">:</span>
</span>
<span class="d-block d-md-inline">
{{ticket.title}}
@ -29,17 +24,10 @@
</h2>
<ul class="nav nav-tabs">
<li class="nav-item">
<a href="{{ url_for(".ticket_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name,
ticket_id=ticket.scoped_id) }}"
class="nav-link">view</a>
<a href="{{ ticket|ticket_url }}" class="nav-link">view</a>
</li>
<li class="nav-item">
<a href="{{ url_for(".ticket_edit_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name,
ticket_id=ticket.scoped_id) }}"
<a href="{{ ticket|ticket_edit_url }}"
class="nav-link active">edit</a>
</li>
</ul>
@ -74,11 +62,9 @@
{{valid.summary("description")}}
</div>
<div class="pull-right">
<a href="{{ url_for(".ticket_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name,
ticket_id=ticket.scoped_id) }}" class="btn btn-default"
>Cancel</a>
<a href="{{ ticket|ticket_url }}" class="btn btn-default">
Cancel
</a>
<button
type="submit"
class="btn btn-primary"

View File

@ -2,43 +2,32 @@
{% for event in events %}
<div class="event">
<h4>
<a href="{{ url_for("ticket.ticket_GET",
owner=event.ticket.tracker.owner.canonical_name(),
name=event.ticket.tracker.name,
ticket_id=event.ticket.scoped_id) }}">
<a href="{{ event.ticket|ticket_url }}">
#{{event.ticket.scoped_id}}
</a> {{ event.ticket.title }}
<small class="pull-right">{{ event.created | date }}</small>
</h4>
<p>
{% if EventType.created in event.event_type %}
Ticket created by
<a href="/~{{ event.ticket.submitter.username }}">
~{{ event.ticket.submitter.username }}
Ticket created by <a href="{{ event.ticket.submitter|user_url }}">
{{ event.ticket.submitter }}
</a>
{% elif EventType.comment in event.event_type %}
Comment by
<a href="/~{{ event.comment.submitter.username }}">
~{{ event.comment.submitter.username }}
Comment by <a href="{{ event.comment.submitter|user_url }}">
{{ event.comment.submitter }}
</a>
{% elif EventType.label_added in event.event_type %}
{{ event.label|label_badge(cls="small") }} added by
<a href="/~{{ event.user.username }}">
~{{ event.user.username }}
</a>
<a href="{{ event.user|user_url }}">{{ event.user }}</a>
{% elif EventType.label_removed in event.event_type %}
{{ event.label|label_badge(cls="small") }} removed by
<a href="/~{{ event.user.username }}">
~{{ event.user.username }}
</a>
<a href="{{ event.user|user_url }}">{{ event.user }}</a>
{% endif %}
on <a href="{{ url_for("html.user_GET",
username=event.ticket.tracker.owner.username) }}"
>{{event.ticket.tracker.owner.canonical_name()}}</a>/<a
href="{{ url_for("tracker.tracker_GET",
owner=event.ticket.tracker.owner.canonical_name(),
name=event.ticket.tracker.name) }}"
>{{event.ticket.tracker.name}}</a>
{% with tracker=event.ticket.tracker %}
on <a href="{{ tracker.owner|user_url }}"
>{{ tracker.owner }}</a>/<a href="{{ tracker|tracker_url }}"
>{{ tracker.name }}</a>
{% endwith %}
</p>
<blockquote>
{% if event.comment %}

View File

@ -13,15 +13,10 @@
<div class="col-md-12">
<h2 style="margin: 0;">
<span class="d-block d-md-inline">
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/<a
href="{{ url_for("tracker.tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
>{{tracker.name}}</a>/#{{ticket.scoped_id}}<span
class="d-none d-md-inline"
>:</span>
<a href="{{ tracker.owner|user_url }}"
>{{ tracker.owner }}</a>/<a href="{{ tracker|tracker_url }}"
>{{ tracker.name }}</a>/#{{ ticket.scoped_id }}<span
class="d-none d-md-inline">:</span>
</span>
<span class="d-block d-md-inline">
{{ticket.title}}
@ -36,18 +31,12 @@
<div class="col-md-12 header-tabbed" style="border: none; margin: 0;">
<ul class="nav nav-tabs">
<li class="nav-item">
<a href="{{ url_for(".ticket_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name,
ticket_id=ticket.scoped_id) }}"
<a href="{{ ticket|ticket_url }}"
class="nav-link active">view</a>
</li>
{% if TicketAccess.edit in access %}
<li class="nav-item">
<a href="{{ url_for(".ticket_edit_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name,
ticket_id=ticket.scoped_id) }}"
<a href="{{ ticket|ticket_edit_url }}"
class="nav-link">edit</a>
</li>
{% endif %}
@ -111,10 +100,9 @@
</dd>
<dt class="col-md-3">Submitter</dt>
<dd class="col-md-9">
<a
href="{{url_for("html.user_GET",
username=ticket.submitter.username)}}"
>~{{ ticket.submitter.username }}</a>
<a href="{{ ticket.submitter|user_url }}">
{{ ticket.submitter }}
</a>
</dd>
<dt class="col-md-3">Submitted</dt>
<dd class="col-md-9">{{ ticket.created | date }}</dd>
@ -178,9 +166,8 @@
{% for event in ticket.events %}
{% if event.event_type != EventType.created %}
<h4>
<a href="{{url_for("html.user_GET",
username=event.user.username)}}">
~{{ event.user.username }}
<a href="{{ event.user|user_url }}">
{{ event.user }}
</a>
<span class="pull-right">
<small>{{ event.created | date }}</small>

View File

@ -33,18 +33,14 @@
<div class="row">
<div class="col-md-12 header-tabbed">
<h2>
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/{{tracker.name}}
<a href="{{ tracker.owner|user_url }}">{{ tracker.owner }}</a
>/{{ tracker.name }}
</h2>
<ul class="nav nav-tabs">
<li class="nav-item">
<a
class="nav-link"
href="{{ url_for("tracker.tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
>{{icon('caret-left')}} back</a>
<a class="nav-link" href="{{ tracker|tracker_url }}">
{{icon('caret-left')}} back
</a>
</li>
<li class="nav-item d-none d-sm-block">
<a class="nav-link active" href="{{url_for(".configure_GET",
@ -144,13 +140,9 @@
</div>
{{ valid.summary() }}
<span class="pull-right">
<a
href="{{ url_for(
".tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
class="btn btn-default"
>Cancel</a>
<a href="{{ tracker|tracker_url }}" class="btn btn-default">
Cancel
</a>
<button type="submit" class="btn btn-primary">
Save {{icon("caret-right")}}
</button>

View File

@ -13,25 +13,18 @@
<div class="row">
<div class="col-md-12 header-tabbed">
<h2>
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/{{tracker.name}}
<a href="{{ tracker.owner|user_url }}">{{ tracker.owner }}</a
>/{{ tracker.name }}
</h2>
<ul class="nav nav-tabs">
<li class="nav-item">
<a
class="nav-link"
href="{{ url_for("tracker.tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
>{{icon('caret-left')}} back</a>
<a class="nav-link" href="{{ tracker|tracker_url }}">
{{icon('caret-left')}} back
</a>
</li>
<li class="nav-item">
<a class="nav-link active"
href="{{url_for(".tracker_labels_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name
)}}">labels</a>
href="{{ tracker|tracker_labels_url }}">labels</a>
</li>
</ul>
</div>

View File

@ -11,17 +11,13 @@
<div class="row">
<div class="col-md-12 header-tabbed">
<h2>
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/{{tracker.name}}
<a href="{{ tracker.owner|user_url }}">{{ tracker.owner }}</a
>/{{ tracker.name }}
</h2>
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link {{ "active" if not search else "" }}"
href="{{url_for(".tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name
)}}">open tickets</a>
href="{{ tracker|tracker_url }}">open tickets</a>
</li>
<li class="nav-item">
<a class="nav-link {{
@ -38,10 +34,7 @@
{% endif %}
<li class="nav-item">
<a class="nav-link"
href="{{url_for(".tracker_labels_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name
)}}">labels</a>
href="{{ tracker|tracker_labels_url }}">labels</a>
</li>
{% if current_user and current_user.id == tracker.owner_id %}
<li class="nav-item d-none d-sm-block">
@ -145,10 +138,8 @@
<div class="ticket-list">
{% for ticket in tickets %}
<div class="id">
<a href="{{url_for("ticket.ticket_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name,
ticket_id=ticket.scoped_id)}}">#{{ticket.scoped_id}}</a></div>
<a href="{{ ticket|ticket_url }}">#{{ticket.scoped_id}}</a>
</div>
<div class="title">
{{ ticket.title }}
<span class="pull-right">
@ -159,9 +150,9 @@
</div>
<div class="updated">{{ ticket.updated | date }}</div>
<div class="submitter">
<a href="{{url_for("html.user_GET",
username=ticket.submitter.username)}}"
>~{{ ticket.submitter.username }}</a>
<a href="{{ ticket.submitter|user_url }}">
{{ ticket.submitter }}
</a>
</div>
{% if ticket.new_updates(current_user) %}
<div class="comments">

View File

@ -4,11 +4,8 @@
<div class="row">
<div class="col-md-4">
<h2>
<a href="{{url_for("html.user_GET", username=user.username)}}">
~{{ user.username }}
</a>
<a href="{{ user|user_url }}">{{ user }}</a>
</h2>
{% if profile.get("location") %}
<p>{{profile["location"]}}</p>
{% endif %}
@ -37,13 +34,9 @@
{% for tracker in trackers %}
<div class="event">
<h4>
<a href="{{ url_for("html.user_GET",
username=tracker.owner.username) }}"
>{{tracker.owner.canonical_name()}}</a>/<a
href="{{ url_for("tracker.tracker_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name) }}"
>{{tracker.name}}</a>
<a href="{{ user|user_url }}"
>{{ user }}</a>/<a href="{{ tracker|tracker_url }}"
>{{ tracker.name }}</a>
</h4>
<span class="text-muted">
Last active {{ tracker.updated | date }}

View File

@ -28,3 +28,5 @@ class User(Base):
def get_id(self):
return self.username
def __str__(self):
return self.canonical_name()

View File

@ -6,6 +6,11 @@ def tracker_url(tracker):
owner=tracker.owner.canonical_name(),
name=tracker.name)
def tracker_labels_url(tracker):
return url_for("tracker.tracker_labels_GET",
owner=tracker.owner.canonical_name(),
name=tracker.name)
def ticket_url(ticket, comment=None):
ticket_url = url_for("ticket.ticket_GET",
owner=ticket.tracker.owner.canonical_name(),
@ -17,6 +22,12 @@ def ticket_url(ticket, comment=None):
return ticket_url
def ticket_edit_url(ticket):
return url_for("ticket.ticket_edit_GET",
owner=ticket.tracker.owner.canonical_name(),
name=ticket.tracker.name,
ticket_id=ticket.scoped_id)
def label_search_url(label):
"""Return the URL to the tracker page listing all tickets which have the
label applied."""
@ -24,10 +35,20 @@ def label_search_url(label):
tracker_url(label.tracker),
unicode_urlencode(label.name))
def label_add_url(label, ticket):
"""Return the URL to remove a label from a ticket."""
return url_for("ticket.ticket_add_label",
owner=ticket.tracker.owner.canonical_name(),
name=ticket.tracker.name,
ticket_id=ticket.scoped_id)
def label_remove_url(label, ticket):
"""Return the URL to remove a label from an ticket."""
"""Return the URL to add a label to a ticket."""
return url_for("ticket.ticket_remove_label",
owner=ticket.tracker.owner.canonical_name(),
name=ticket.tracker.name,
ticket_id=ticket.scoped_id,
label_id=label.id,)
label_id=label.id)
def user_url(user):
return url_for("html.user_GET", username=user.username)