Add events for todo.sr.ht tickets

This commit is contained in:
Drew DeVault 2020-04-23 11:32:15 -04:00
parent 8cafac751f
commit 7c3bb9fc0f
5 changed files with 74 additions and 20 deletions

View File

@ -248,6 +248,9 @@ def delete_POST(owner, project_name, repo_id):
project.summary_repo_id = None
db.session.commit()
if repo.repo_type == RepoType.git:
git.unensure_repo_webhooks(repo)
db.session.delete(repo)
valid = Validation(request)

View File

@ -60,15 +60,11 @@ def git_repo(repo_id):
return "I don't recognize that repository.", 404
if event == "repo:post-update":
# XXX: This isn't right for Hg, but Hg doesn't have webhooks yet anyway
commit_sha = payload["refs"][0]["new"]["id"][:7]
commit_url = repo.url() + f"/commit/{commit_sha}"
commit_message = payload["refs"][0]["new"]["message"].split("\n")[0]
pusher_name = payload['pusher']['canonical_name']
if repo.repo_type == RepoType.git:
pusher_url = f"{_gitsrht}/{pusher_name}"
elif repo.repo_type == RepoType.hg:
pusher_url = f"{_hgsrht}/{pusher_name}"
pusher_url = f"{_gitsrht}/{pusher_name}"
repo_name = repo.owner.canonical_name + "/" + repo.name
pusher = current_app.oauth_service.lookup_user(payload['pusher']['name'])
@ -199,7 +195,37 @@ def todo_tracker(tracker_id):
return "I don't recognize this tracker.", 404
if event == "ticket:create":
raise NotImplementedError()
event = Event()
submitter = payload["submitter"]
if submitter["type"] == "user":
event.user_id = current_app.oauth_service.lookup_user(submitter['name']).id
# TODO: Move this to a hub.sr.ht user page
submitter_url = f"{_todosrht}/{submitter['canonical_name']}"
submitter_url = f"<a href='{submitter_url}'>{submitter['canonical_name']}</a>"
elif submitter["type"] == "email":
submitter_url = f"{submitter['name']}"
else:
submitter_url = f"{submitter['external_id']}"
event.event_type = EventType.external_event
event.tracker_id = tracker.id
event.project_id = tracker.project_id
ticket_id = payload["id"]
ticket_url = tracker.url() + f"/{ticket_id}"
ticket_subject = payload["title"]
event.external_source = "todo.sr.ht"
event.external_summary = (
f"<a href='{ticket_url}'>#{ticket_id}</a> " +
f"{ticket_subject}")
event.external_details = (
f"{submitter_url} filed ticket on " +
f"<a href='{tracker.url()}'>{tracker.name}</a>")
db.session.add(event)
db.session.commit()
return "Thanks!"
else:
raise NotImplementedError()

View File

@ -75,6 +75,10 @@ class GitService(SrhtService):
}
ensure_webhooks(user, f"{_gitsrht}/api/user/webhooks", config)
def ensure_user_webhooks(self, user):
config = { }
ensure_webhooks(user, f"{_gitsrht}/api/user/webhooks", config)
def ensure_repo_webhooks(self, repo):
config = {
origin + url_for("webhooks.git_repo", repo_id=repo.id):
@ -84,6 +88,12 @@ class GitService(SrhtService):
url = f"{_gitsrht}/api/{owner.canonical_name}/repos/{repo.name}/webhooks"
ensure_webhooks(owner, url, config)
def unensure_repo_webhooks(self, repo):
config = { }
owner = repo.owner
url = f"{_gitsrht}/api/{owner.canonical_name}/repos/{repo.name}/webhooks"
ensure_webhooks(owner, url, config)
class HgService(SrhtService):
def __init__(self):
super().__init__()
@ -132,6 +142,10 @@ class HgService(SrhtService):
}
ensure_webhooks(user, f"{_hgsrht}/api/user/webhooks", config)
def unensure_user_webhooks(self, user):
config = { }
ensure_webhooks(user, f"{_hgsrht}/api/user/webhooks", config)
class ListService(SrhtService):
def get_lists(self, user):
return get_results(f"{_listsrht}/api/lists", user)
@ -152,6 +166,12 @@ class ListService(SrhtService):
url = f"{_listsrht}/api/user/{owner.canonical_name}/lists/{mailing_list.name}/webhooks"
ensure_webhooks(owner, url, config)
def unensure_mailing_list_webhooks(self, mailing_list):
config = { }
owner = mailing_list.owner
url = f"{_listsrht}/api/user/{owner.canonical_name}/lists/{mailing_list.name}/webhooks"
ensure_webhooks(owner, url, config)
def create_list(self, user, valid):
name = valid.require("name")
description = valid.optional("description")
@ -197,6 +217,11 @@ class TodoService(SrhtService):
url = f"{_todosrht}/api/user/webhooks"
ensure_webhooks(user, url, config)
def unensure_user_webhooks(self, user):
config = { }
url = f"{_todosrht}/api/user/webhooks"
ensure_webhooks(user, url, config)
def ensure_tracker_webhooks(self, tracker):
config = {
origin + url_for("webhooks.todo_tracker", tracker_id=tracker.id):
@ -206,6 +231,12 @@ class TodoService(SrhtService):
url = f"{_todosrht}/api/user/{owner.canonical_name}/trackers/{tracker.name}/webhooks"
ensure_webhooks(owner, url, config)
def unensure_tracker_webhooks(self, tracker):
config = { }
owner = tracker.owner
url = f"{_todosrht}/api/user/{owner.canonical_name}/trackers/{tracker.name}/webhooks"
ensure_webhooks(owner, url, config)
def ensure_ticket_webhooks(self, tracker, ticket_id):
config = {
origin + url_for("webhooks.todo_ticket", tracker_id=tracker.id):
@ -215,6 +246,12 @@ class TodoService(SrhtService):
url = f"{_todosrht}/api/user/{owner.canonical_name}/trackers/{tracker.name}/tickets/{ticket_id}/webhooks"
ensure_webhooks(owner, url, config)
def unensure_ticket_webhooks(self, tracker, ticket_id):
config = { }
owner = tracker.owner
url = f"{_todosrht}/api/user/{owner.canonical_name}/trackers/{tracker.name}/tickets/{ticket_id}/webhooks"
ensure_webhooks(owner, url, config)
def create_tracker(self, user, valid):
name = valid.require("name")
description = valid.optional("description")

View File

@ -113,18 +113,6 @@
{% for event in events %}
{{ eventutil.event(event) }}
{% endfor %}
{#
<div class="event">
<a href="#">a7358194</a> <code>gen_temporary: fix (unlikely) buffer overflow</code>
<p><a href="#">Drew DeVault</a> pushed to <a href="#">~sircmpwn/scdoc</a> git</p>
<small class="text-muted">12 hours ago</small>
</div>
<div class="event">
<a href="#">#360</a> Support for Gmail tabs
<p>Comment from <a href="#">~j-james</a> on <a href="#">~sircmpwn/scdoc</a> todo</p>
<small class="text-muted">14 hours ago</small>
</div>
#}
<div class="view-more">
<a
href="{{url_for("projects.feed_GET",

View File

@ -10,7 +10,7 @@ class EventType(Enum):
external_event = "external_event"
class Event(Base):
__tablename__ = "events"
__tablename__ = "event"
id = sa.Column(sa.Integer, primary_key=True)
created = sa.Column(sa.DateTime, nullable=False)
@ -22,7 +22,7 @@ class Event(Base):
"""The project implicated in this event"""
user_id = sa.Column(sa.Integer,
sa.ForeignKey("user.id", ondelete="CASCADE"), nullable=False)
sa.ForeignKey("user.id", ondelete="CASCADE"))
user = sa.orm.relationship("User", backref=sa.orm.backref("events"),
cascade="all, delete")
"""The user implicated in this event"""