Implement tracker management

This commit is contained in:
Drew DeVault 2020-04-02 10:26:04 -04:00
parent c866a9f4ed
commit 6456c0a7bf
7 changed files with 111 additions and 22 deletions

View File

@ -91,3 +91,59 @@ def new_POST(owner, project_name):
return redirect(url_for("projects.summary_GET",
owner=owner.canonical_name, project_name=project.name))
@trackers.route("/<owner>/<project_name>/trackers/manage")
@loginrequired
def manage_GET(owner, project_name):
owner, project = get_project(owner, project_name, ProjectAccess.write)
trackers = (Tracker.query
.filter(Tracker.project_id == project.id)
.order_by(Tracker.updated.desc()))
terms = request.args.get("search")
search_error = None
try:
trackers = search_by(trackers, terms,
[Tracker.name, Tracker.description])
except ValueError as ex:
search_error = str(ex)
trackers, pagination = paginate_query(trackers)
return render_template("trackers-manage.html", view="tickets",
owner=owner, project=project, trackers=trackers,
search=terms, search_error=search_error,
**pagination)
@trackers.route("/<owner>/<project_name>/trackers/delete/<int:tracker_id>")
@loginrequired
def delete_GET(owner, project_name, tracker_id):
owner, project = get_project(owner, project_name, ProjectAccess.write)
tracker = (Tracker.query
.filter(Tracker.id == tracker_id)
.filter(Tracker.project_id == project.id)).one_or_none()
if not tracker:
abort(404)
return render_template("resource-delete.html", view="tickets",
owner=owner, project=project, resource=tracker,
resource_type="ticket tracker")
@trackers.route("/<owner>/<project_name>/trackers/delete/<int:tracker_id>",
methods=["POST"])
@loginrequired
def delete_POST(owner, project_name, tracker_id):
owner, project = get_project(owner, project_name, ProjectAccess.write)
tracker = (Tracker.query
.filter(Tracker.id == tracker_id)
.filter(Tracker.project_id == project.id)).one_or_none()
if not tracker:
abort(404)
db.session.delete(tracker)
valid = Validation(request)
delete_remote = valid.optional("delete-remote") == "on"
if delete_remote:
todo.delete_tracker(owner, tracker.name)
db.session.commit()
return redirect(url_for("projects.summary_GET",
owner=owner.canonical_name, project_name=project.name))

View File

@ -121,6 +121,12 @@ class TodoService(SrhtService):
raise Exception(r.json())
return r.json()
def delete_tracker(self, user, tracker_name):
r = self.session.delete(f"{_todosrht}/api/trackers/{tracker_name}",
headers=get_authorization(user))
if r.status_code != 204:
raise Exception(r.text)
def ensure_user_webhooks(self, user):
config = {
origin + url_for("webhooks.tracker"): ["tracker:update", "tracker:delete"]

View File

@ -1,17 +1,5 @@
{% extends "layout.html" %}
{% block body %}
<div class="header-tabbed">
<div class="container">
{% include 'project-nav.html' %}
</div>
</div>
{% if project.description %}
<div class="header-extension">
<div class="container">
{{ project.description }}
</div>
</div>
{% endif %}
{% extends "project-base.html" %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-md-12 event-list">
@ -20,7 +8,7 @@
<input
name="search"
type="text"
placeholder="Search repositories"
placeholder="Search mailing lists"
class="form-control{% if search_error %} is-invalid{% endif %}"
value="{{ search if search else "" }}" />
{% if search_error %}
@ -32,7 +20,7 @@
<h4>
<a
href="{{mailing_list.url()}}"
>~{{owner.username}}/{{mailing_list.name}}</a>
>{{mailing_list.owner.canonical_name}}/{{mailing_list.name}}</a>
</h4>
{% if mailing_list.description %}
{{ mailing_list.description | md }}

View File

@ -5,7 +5,7 @@
<h4>
<a
href="{{mailing_list.url()}}"
>~{{owner.username}}/{{mailing_list.name}}</a>
>{{tracker.owner.canonical_name}}/{{mailing_list.name}}</a>
</h4>
{% if mailing_list.description %}
{{ mailing_list.description | md }}

View File

@ -3,7 +3,7 @@
{% for repo in sources %}
<div class="event">
<h4>
<a href="{{repo.url()}}">~{{repo.owner.username}}/{{repo.name}}</a>
<a href="{{repo.url()}}">{{repo.owner.canonical_name}}/{{repo.name}}</a>
<small class="pull-right">
{{ repo.repo_type.value }}
</small>

View File

@ -0,0 +1,41 @@
{% extends "project-base.html" %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-md-12 event-list">
<h3>Manage mailing lists</h3>
<form>
<input
name="search"
type="text"
placeholder="Search trackers"
class="form-control{% if search_error %} is-invalid{% endif %}"
value="{{ search if search else "" }}" />
{% if search_error %}
<div class="invalid-feedback">{{ search_error }}</div>
{% endif %}
</form>
{% for tracker in trackers %}
<div class="event">
<h4>
<a
href="{{tracker.url()}}"
>{{tracker.owner.canonical_name}}/{{tracker.name}}</a>
</h4>
{% if tracker.description %}
{{ tracker.description | md }}
{% endif %}
<a
class="btn btn-danger"
href="{{url_for("trackers.delete_POST",
owner=project.owner.canonical_name,
project_name=project.name,
tracker_id=tracker.id)}}"
>Remove tracker {{icon('caret-right')}}</a>
</div>
{% endfor %}
{{pagination()}}
</div>
</div>
</div>
{% endblock %}

View File

@ -18,11 +18,9 @@
project_name=project.name)}}"
class="btn btn-primary btn-block"
>Add tracker&nbsp;{{icon('caret-right')}}</a>
{#
<a
href="{{url_for("tracker.manage_GET",
href="{{url_for("trackers.manage_GET",
owner=owner.canonical_name, project_name=project.name)}}"
class="btn btn-default btn-block"
>Manage sources&nbsp;{{icon('caret-right')}}</a>
#}
>Manage trackers&nbsp;{{icon('caret-right')}}</a>
{% endblock %}