roundabout,
created on Thursday, 11 July 2024, 10:17:26 (1720693046),
received on Wednesday, 31 July 2024, 06:54:50 (1722408890)
Author identity: vlad <vlad.muntoiu@gmail.com>
89dc89e84ecc9e72467890c998227bc3e7d06bb6
app.py
@@ -1716,6 +1716,33 @@ def repository_settings_post(username, repository):
return flask.redirect(f"/{username}/{repository}/settings", 303)
@repositories.route("/<username>/<repository>/settings/delete", methods=["POST"])
def repository_settings_delete(username, repository):
if username != flask.session.get("username"):
flask.abort(401)
repo = db.session.get(Repo, f"/{username}/{repository}")
if not repo:
flask.abort(404)
user = db.session.get(User, flask.session.get("username"))
if not bcrypt.check_password_hash(user.password_hashed, flask.request.form.get("password")):
flask.flash(_("Incorrect password"), category="error")
flask.abort(401)
if repo.has_site:
celery_tasks.delete_site.delay(repo.route)
db.session.delete(repo)
db.session.commit()
shutil.rmtree(os.path.join(config.REPOS_PATH, username, repository))
return flask.redirect(f"/{username}", 303)
@app.errorhandler(404)
def e404(error):
return flask.render_template("errors/not-found.html"), 404
models.py
@@ -100,7 +100,7 @@ with (app.app_context()):
default_page_length = db.Column(db.SmallInteger, nullable=False, default=32, server_default="32")
max_post_nesting = db.Column(db.SmallInteger, nullable=False, default=3, server_default="3")
repositories = db.relationship("Repo", back_populates="owner")
repositories = db.relationship("Repo", back_populates="owner", cascade="all, delete-orphan")
followers = db.relationship("UserFollow", back_populates="followed", foreign_keys="[UserFollow.followed_username]")
follows = db.relationship("UserFollow", back_populates="follower", foreign_keys="[UserFollow.follower_username]")
email_change_requests = db.relationship("EmailChangeRequest", back_populates="user")
@@ -165,13 +165,20 @@ with (app.app_context()):
default_branch = db.Column(db.String(64), nullable=True, default="")
commits = db.relationship("Commit", back_populates="repo")
posts = db.relationship("Post", back_populates="repo")
comments = db.relationship("Comment", back_populates="repo")
repo_access = db.relationship("RepoAccess", back_populates="repo")
favourites = db.relationship("RepoFavourite", back_populates="repo")
heads = db.relationship("PullRequest", back_populates="head", foreign_keys="[PullRequest.head_route]")
bases = db.relationship("PullRequest", back_populates="base", foreign_keys="[PullRequest.base_route]")
commits = db.relationship("Commit", back_populates="repo", cascade="all, delete-orphan")
posts = db.relationship("Post", back_populates="repo", cascade="all, delete-orphan")
comments = db.relationship("Comment", back_populates="repo",
cascade="all, delete-orphan")
repo_access = db.relationship("RepoAccess", back_populates="repo",
cascade="all, delete-orphan")
favourites = db.relationship("RepoFavourite", back_populates="repo",
cascade="all, delete-orphan")
heads = db.relationship("PullRequest", back_populates="head",
foreign_keys="[PullRequest.head_route]",
cascade="all, delete-orphan")
bases = db.relationship("PullRequest", back_populates="base",
foreign_keys="[PullRequest.base_route]",
cascade="all, delete-orphan")
has_site = db.Column(db.SmallInteger, nullable=False, default=0, # 0 means no site, 1 means it's got a site, 2 means it's the user's primary site
server_default="0") # (the one accessible at username.localhost)
templates/repo.html
@@ -86,7 +86,7 @@
{% if logged_in_user %}
<a title="{% trans %}Mark as favourite{% endtrans %}" class="button" href="/{{ username }}/{{ repository }}/favourite">
{% if not is_favourite %}
{% trans %}Favourite{% endtrans %}
{% trans %}Add favourite{% endtrans %}
{% else %}
{% trans %}Remove favourite{% endtrans %}
{% endif %}
templates/repository/repo-settings.html
@@ -9,67 +9,78 @@
<x-frame style="--width: 896px;" class="flexible-space">
<x-vbox>
<article class="card">
<section class="card-main">
<form method="post">
<x-vbox>
<x-hbox>
<label>{% trans %}Visibility:{% endtrans %}</label>
<label>
<input type="radio" name="visibility" value="2" {% if repo_data.visibility == 2 %}checked{% endif %}>
{% trans %}Public{% endtrans %}
</label>
<label>
<input type="radio" name="visibility" value="1" {% if repo_data.visibility == 1 %}checked{% endif %}>
{% trans %}Unlisted{% endtrans %}
</label>
<label>
<input type="radio" name="visibility" value="0" {% if repo_data.visibility == 0 %}checked{% endif %}>
{% trans %}Private{% endtrans %}
</label>
</x-hbox>
<label for="description">
{% trans %}Description{% endtrans %}
<textarea id="description" name="description" rows="4">{% if repo_data.info %}{{ repo_data.info }}{% endif %}</textarea>
</label>
<label for="url">
{% trans %}Homepage{% endtrans %}
<input id="url" name="url" type="url" value="{% if repo_data.url %}{{ repo_data.url }}{% endif %}">
</label>
<label for="default-branch">
{% trans %}Default branch{% endtrans %}
<select id="default-branch" name="default_branch">
{% for branch in branches %}
<option value="{{ branch }}" {% if branch == repo_data.default_branch %}selected{% endif %}>{{ branch }}</option>
{% endfor %}
</select>
{% trans %}This is the branch the application will redirect to automatically if one is not specified.
Note that only branch names are supported, not other references like tags or commit hashes.{% endtrans %}
<section class="card-main vbox">
<form method="post" class="vbox">
<x-hbox>
<label>{% trans %}Visibility:{% endtrans %}</label>
<label>
<input type="radio" name="visibility" value="2" {% if repo_data.visibility == 2 %}checked{% endif %}>
{% trans %}Public{% endtrans %}
</label>
<label for="site-branch">
{% trans %}Site branch{% endtrans %}
<select id="site-branch" name="site_branch">
<option value="">{% trans %}No sites{% endtrans %}</option>
{% for branch in branches %}
<option value="{{ branch }}" {% if branch == repo_data.site_branch %}selected{% endif %}>{{ branch }}</option>
{% endfor %}
</select>
<label>
<input type="radio" name="visibility" value="1" {% if repo_data.visibility == 1 %}checked{% endif %}>
{% trans %}Unlisted{% endtrans %}
</label>
<label>
<input type="checkbox" name="primary_site" {% if repo_data.has_site == 2 %}checked{% endif %}>
{% trans %}Make this the primary site{% endtrans %}
<input type="radio" name="visibility" value="0" {% if repo_data.visibility == 0 %}checked{% endif %}>
{% trans %}Private{% endtrans %}
</label>
</x-hbox>
<label for="description">
{% trans %}Description{% endtrans %}
<textarea id="description" name="description" rows="4">{% if repo_data.info %}{{ repo_data.info }}{% endif %}</textarea>
</label>
<label for="url">
{% trans %}Homepage{% endtrans %}
<input id="url" name="url" type="url" value="{% if repo_data.url %}{{ repo_data.url }}{% endif %}">
</label>
<label for="default-branch">
{% trans %}Default branch{% endtrans %}
<select id="default-branch" name="default_branch">
{% for branch in branches %}
<option value="{{ branch }}" {% if branch == repo_data.default_branch %}selected{% endif %}>{{ branch }}</option>
{% endfor %}
</select>
{% trans %}This is the branch the application will redirect to automatically if one is not specified.
Note that only branch names are supported, not other references like tags or commit hashes.{% endtrans %}
</label>
<label for="site-branch">
{% trans %}Site branch{% endtrans %}
<select id="site-branch" name="site_branch">
<option value="">{% trans %}No sites{% endtrans %}</option>
{% for branch in branches %}
<option value="{{ branch }}" {% if branch == repo_data.site_branch %}selected{% endif %}>{{ branch }}</option>
{% endfor %}
</select>
</label>
<label>
<input type="checkbox" name="primary_site" {% if repo_data.has_site == 2 %}checked{% endif %}>
{% trans %}Make this the primary site{% endtrans %}
</label>
<p>
{% trans link=site_link, primary_link=primary_site_link %}
Host static sites for your projects, for free. The files in your site branch will be served at
{{ site_link }} or {{ primary_site_link }} if you make this the primary site.
{% endtrans %}
</p>
<p>
{% trans %}Even if this repository is private, the site will not have access control.{% endtrans %}
</p>
<button type="submit">{% trans %}Update{% endtrans %}</button>
</form>
{% if logged_in_user == username %}
<form action="/{{ username }}/{{ repository }}/settings/delete" method="post" class="vbox">
<h2>{% trans %}Delete repository{% endtrans %}</h2>
<p>
{% trans link=site_link, primary_link=primary_site_link %}
Host static sites for your projects, for free. The files in your site branch will be served at
{{ site_link }} or {{ primary_site_link }} if you make this the primary site.
{% endtrans %}
</p>
<p>
{% trans %}Even if this repository is private, the site will not have access control.{% endtrans %}
{% trans %}Deleting a repository will permanently remove its git database, forum, settings and other associated data. THIS CANNOT BE UNDONE IN ANY WAY!{% endtrans %}
</p>
<button type="submit">Update</button>
</x-vbox>
</form>
<label>
{% trans %}Account password{% endtrans %}
<input type="password" name="password" placeholder="{% trans %}Write your password to confirm deletion{% endtrans %}" required>
</label>
<button type="submit">{% trans %}Delete repository{% endtrans %}</button>
</form>
{% endif %}
</section>
</article>
</x-vbox>