Fix project deletion

SQLAlchemy's internal cascade handling is the most miserable, broken
piece of shit I have ever had the displeasure of using. So we circumvent
it entirely and let the SQL server do the right thing.

A word of advice: don't use SQLAlchemy for new projects.
This commit is contained in:
Drew DeVault 2020-07-09 09:52:53 -04:00
parent 47d6ec09a1
commit 3c6f828df2
5 changed files with 16 additions and 6 deletions

View File

@ -157,8 +157,8 @@ def config_POST(owner, project_name):
@loginrequired @loginrequired
def delete_POST(owner, project_name): def delete_POST(owner, project_name):
owner, project = get_project(owner, project_name, ProjectAccess.write) owner, project = get_project(owner, project_name, ProjectAccess.write)
project.summary_repo_id = None session["notice"] = f"{project.name} has been deleted."
db.session.delete(project) db.engine.execute(f"DELETE FROM project WHERE id = {project.id}")
db.session.commit() db.session.commit()
return redirect(url_for("public.index")) return redirect(url_for("public.index"))

View File

@ -1,4 +1,4 @@
from flask import Blueprint, render_template, request from flask import Blueprint, render_template, request, session
from hubsrht.types import Project, Feature, Event, EventType, Visibility, User from hubsrht.types import Project, Feature, Event, EventType, Visibility, User
from srht.flask import paginate_query from srht.flask import paginate_query
from srht.oauth import current_user, loginrequired from srht.oauth import current_user, loginrequired
@ -9,6 +9,7 @@ public = Blueprint("public", __name__)
@public.route("/") @public.route("/")
def index(): def index():
if current_user: if current_user:
notice = session.pop("notice", None)
projects = (Project.query projects = (Project.query
.filter(Project.owner_id == current_user.id) .filter(Project.owner_id == current_user.id)
.order_by(Project.updated.desc()) .order_by(Project.updated.desc())
@ -19,14 +20,15 @@ def index():
.order_by(Event.created.desc()) .order_by(Event.created.desc())
.limit(2)).all() .limit(2)).all()
return render_template("dashboard.html", return render_template("dashboard.html",
projects=projects, EventType=EventType, events=events) projects=projects, EventType=EventType, events=events,
return render_template("new-user-dashboard.html") notice=notice)
return render_template("new-user-dashboard.html", notice=notice)
return render_template("index.html") return render_template("index.html")
@public.route("/getting-started") @public.route("/getting-started")
@loginrequired @loginrequired
def getting_started(): def getting_started():
return render_template("new-user-dashboard.html") return render_template("new-user-dashboard.html", notice=notice)
@public.route("/projects") @public.route("/projects")
def project_index(): def project_index():

View File

@ -4,6 +4,9 @@
<title>{{cfg("sr.ht", "site-name")}} dashboard</title> <title>{{cfg("sr.ht", "site-name")}} dashboard</title>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% if notice %}
<div class="alert alert-info">{{notice}}</div>
{% endif %}
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<p> <p>

View File

@ -3,6 +3,9 @@
<title>{{cfg("sr.ht", "site-name")}} dashboard</title> <title>{{cfg("sr.ht", "site-name")}} dashboard</title>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% if notice %}
<div class="alert alert-info">{{notice}}</div>
{% endif %}
<div class="row"> <div class="row">
<div class="col-md-10 offset-md-1" style="margin-top: 1rem; margin-bottom: 1rem;"> <div class="col-md-10 offset-md-1" style="margin-top: 1rem; margin-bottom: 1rem;">
<strong>Welcome to {{cfg("sr.ht", "site-name")}}!</strong> <strong>Welcome to {{cfg("sr.ht", "site-name")}}!</strong>

View File

@ -215,12 +215,14 @@
Delete project {{icon('caret-right')}} Delete project {{icon('caret-right')}}
</button> </button>
</div> </div>
{#
<div class="col-md-9"> <div class="col-md-9">
<label class="checkbox"> <label class="checkbox">
<input type="checkbox" name="delete-resources" /> <input type="checkbox" name="delete-resources" />
Permanently delete project resources (repos, mailing lists, etc) Permanently delete project resources (repos, mailing lists, etc)
</label> </label>
</div> </div>
#}
</div> </div>
</form> </form>
</div> </div>