Implement bug tracker addition

This commit is contained in:
Drew DeVault 2020-04-02 09:24:29 -04:00
parent b98a88e47f
commit ae7768cc70
7 changed files with 100 additions and 3 deletions

View File

@ -19,3 +19,53 @@ def new_GET(owner, project_name):
trackers = sorted(trackers, key=lambda r: r["updated"], reverse=True)
return render_template("tracker-new.html", view="new-resource",
owner=owner, project=project, trackers=trackers)
@trackers.route("/<owner>/<project_name>/trackers/new", methods=["POST"])
@loginrequired
def new_POST(owner, project_name):
owner, project = get_project(owner, project_name, ProjectAccess.write)
valid = Validation(request)
if "create" in valid:
assert False # TODO
else:
tracker_name = None
for field in valid.source:
if field.startswith("existing-"):
tracker_name = field[len("existing-"):]
break
if not tracker_name:
search = valid.optional("search")
trackers = todo.get_trackers(owner)
# TODO: Search properly
tracker = filter(lambda r: search.lower() in r["name"].lower(), trackers)
tracker = sorted(trackers, key=lambda r: r["updated"], reverse=True)
return render_template("tracker-new.html", view="new-resource",
owner=owner, project=project, trackers=trackers,
search=search)
remote_tracker = todo.get_tracker(owner, tracker_name)
tracker = Tracker()
tracker.remote_id = remote_tracker["id"]
tracker.project_id = project.id
tracker.owner_id = owner.id
tracker.name = remote_tracker["name"]
tracker.description = remote_tracker["description"]
db.session.add(tracker)
db.session.flush()
event = Event()
event.event_type = EventType.tracker_added
event.tracker_id = tracker.id
event.project_id = project.id
event.user_id = project.owner_id
db.session.add(event)
todo.ensure_user_webhooks(owner)
todo.ensure_tracker_webhooks(owner, tracker.name)
db.session.commit()
return redirect(url_for("projects.summary_GET",
owner=owner.canonical_name, project_name=project.name))

View File

@ -48,3 +48,17 @@ def mailing_list():
raise NotImplementedError()
elif event == "patchset:received":
raise NotImplementedError()
@csrf_bypass
@webhooks.route("/webhooks/tracker", methods=["POST"])
def tracker():
event = request.headers.get("X-Webhook-Event")
payload = json.loads(request.data.decode("utf-8"))
if event == "tracker:update":
raise NotImplementedError()
elif event == "tracker:delete":
raise NotImplementedError()
elif event == "ticket:create":
raise NotImplementedError()
else:
raise NotImplementedError()

View File

@ -121,6 +121,13 @@ class TodoService(SrhtService):
raise Exception(r.json())
return r.json()
def ensure_user_webhooks(self, user):
config = {
origin + url_for("webhooks.tracker"): ["tracker:update", "tracker:delete"]
}
url = f"{_todosrht}/api/user/webhooks"
ensure_webhooks(user, url, config)
def ensure_tracker_webhooks(self, user, tracker_name):
config = {
origin + url_for("webhooks.tracker"): ["ticket:create"]

View File

@ -15,6 +15,14 @@
<p>New mailing list added</p>
<small class="text-muted">{{event.created | date}}</small>
</div>
{% elif event.event_type == EventType.tracker_added %}
<div class="event">
<a
href="{{event.tracker.url()}}"
>{{event.tracker.owner.canonical_name}}/{{event.tracker.name}}</a>
<p>New ticket tracker added</p>
<small class="text-muted">{{event.created | date}}</small>
</div>
{% else %}
TODO: implement event type {{event.event_type}}
{% endif %}

View File

@ -28,6 +28,11 @@
project_name=project.name), "mailing lists")}}
</li>
{% endif %}
{% if any(project.trackers) %}
<li class="nav-item">
{{link("#", "tickets")}}
</li>
{% endif %}
{# TODO
<li class="nav-item">
<a
@ -37,9 +42,6 @@
<li class="nav-item">
{{link("#", "documentation")}}
</li>
<li class="nav-item">
{{link("#", "tickets")}}
</li>
#}
{% if view == "summary" and current_user and current_user.id == owner.id %}
<li class="flex-grow-1"></li>

View File

@ -57,6 +57,15 @@
{% endif %}
</li>
<li>
{% if any(project.trackers) %}
{{icon('check', cls='text-success')}}
Add bug trackers
<br />
<small class="text-muted">
You can see the list of your ticket trackers by clicking
"tickets" on the project navigation.
</small>
{% else %}
{{icon('plus-square', cls='text-info')}}
<a
href="{{url_for("trackers.new_GET",
@ -67,6 +76,7 @@
Bug trackers give you a place to organize your tasks and record
known defects.
</small>
{% endif %}
</li>
</ul>
</div>

View File

@ -6,6 +6,7 @@ from srht.database import Base
class EventType(Enum):
source_repo_added = "source_repo_added"
mailing_list_added = "mailing_list_added"
tracker_added = "tracker_added"
external_event = "external_event"
class Event(Base):
@ -36,6 +37,11 @@ class Event(Base):
mailing_list = sa.orm.relationship("MailingList", cascade="all, delete")
"""The mailing list implicated in this event, if applicable"""
tracker_id = sa.Column(sa.Integer,
sa.ForeignKey("tracker.id", ondelete="CASCADE"))
tracker = sa.orm.relationship("Tracker", cascade="all, delete")
"""The ticket tracker implicated in this event, if applicable"""
external_source = sa.Column(sa.Unicode) # e.g. "lists.sr.ht"
external_summary = sa.Column(sa.Unicode) # markdown
external_details = sa.Column(sa.Unicode) # markdown