Add event tracking

This commit is contained in:
Drew DeVault 2020-03-25 19:17:53 -04:00
parent f0f753bfd3
commit 74d8068b44
3 changed files with 61 additions and 1 deletions

View File

@ -1,6 +1,7 @@
from flask import Blueprint, render_template, request, redirect, url_for
from hubsrht.projects import ProjectAccess, get_project
from hubsrht.services import git, lists
from hubsrht.types import Event, EventType
from hubsrht.types import Project, RepoType, SourceRepo, Visibility
from hubsrht.types import MailingList
from srht.config import get_origin
@ -22,8 +23,13 @@ def summary_GET(owner, project_name):
assert repo.repo_type != RepoType.hg # TODO
summary = git.get_readme(owner, repo.name)
events = (Event.query
.filter(Event.project_id == project.id)
.order_by(Event.created.desc())
.limit(2))
return render_template("project-summary.html", view="summary",
owner=owner, project=project, summary=summary)
owner=owner, project=project, summary=summary, events=events)
@projects.route("/projects/create")
@loginrequired
@ -140,6 +146,14 @@ def sources_git_new_POST(owner, project_name):
repo.description = git_repo["description"]
repo.repo_type = RepoType.git
db.session.add(repo)
db.session.flush()
event = Event()
event.event_type = EventType.source_repo_added
event.source_repo_id = repo.id
event.project_id = project.id
event.user_id = project.owner_id
db.session.add(event)
git.ensure_user_webhooks(owner, {
url_for("webhooks.git_repo_update"): ["repo:update", "repo:delete"],
@ -211,6 +225,14 @@ def mailing_lists_new_POST(owner, project_name):
ml.name = mailing_list["name"]
ml.description = mailing_list["description"]
db.session.add(ml)
db.session.flush()
event = Event()
event.event_type = EventType.mailing_list_added
event.mailing_list_id = ml.id
event.project_id = project.id
event.user_id = project.owner_id
db.session.add(event)
lists.ensure_mailing_list_webhooks(owner, list_name, {
url_for("webhooks.mailing_list_update"): ["list:update", "list:delete"],

View File

@ -10,6 +10,7 @@ class Visibility(Enum):
unlisted = "unlisted"
private = "private"
from hubsrht.types.event import Event, EventType
from hubsrht.types.project import Project
from hubsrht.types.sourcerepo import SourceRepo, RepoType
from hubsrht.types.mailinglist import MailingList

37
hubsrht/types/event.py Normal file
View File

@ -0,0 +1,37 @@
import sqlalchemy as sa
import sqlalchemy_utils as sau
from enum import Enum
from srht.database import Base
class EventType(Enum):
source_repo_added = "source_repo_added"
mailing_list_added = "mailing_list_added"
external_event = "external_event"
class Event(Base):
__tablename__ = "events"
id = sa.Column(sa.Integer, primary_key=True)
created = sa.Column(sa.DateTime, nullable=False)
project_id = sa.Column(sa.Integer, sa.ForeignKey("project.id"), nullable=False)
project = sa.orm.relationship("Project", backref=sa.orm.backref("events"))
"""The project implicated in this event"""
user_id = sa.Column(sa.Integer, sa.ForeignKey("user.id"), nullable=False)
user = sa.orm.relationship("User", backref=sa.orm.backref("events"))
"""The user implicated in this event"""
event_type = sa.Column(sau.ChoiceType(EventType, impl=sa.String()),
nullable=False)
source_repo_id = sa.Column(sa.Integer, sa.ForeignKey("source_repo.id"))
source_repo = sa.orm.relationship("SourceRepo")
"""The source repository implicated in this event, if applicable"""
mailing_list_id = sa.Column(sa.Integer, sa.ForeignKey("mailing_list.id"))
mailing_list = sa.orm.relationship("MailingList")
"""The mailing list 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