Performance.
This commit is contained in:
parent
a5aac9a337
commit
e06776d81d
@ -183,7 +183,7 @@ class Application(BaseApplication):
|
|||||||
self.router.add_view("/settings/repositories/index.html", RepositoriesIndexView)
|
self.router.add_view("/settings/repositories/index.html", RepositoriesIndexView)
|
||||||
self.router.add_view("/settings/repositories/create.html", RepositoriesCreateView)
|
self.router.add_view("/settings/repositories/create.html", RepositoriesCreateView)
|
||||||
self.router.add_view("/settings/repositories/repository/{name}/update.html", RepositoriesUpdateView)
|
self.router.add_view("/settings/repositories/repository/{name}/update.html", RepositoriesUpdateView)
|
||||||
self.router.add_view("/settings/repositories/respository/{name}/delete.html", RepositoriesDeleteView)
|
self.router.add_view("/settings/repositories/repository/{name}/delete.html", RepositoriesDeleteView)
|
||||||
self.webdav = WebdavApplication(self)
|
self.webdav = WebdavApplication(self)
|
||||||
self.git = GitApplication(self)
|
self.git = GitApplication(self)
|
||||||
self.add_subapp("/webdav", self.webdav)
|
self.add_subapp("/webdav", self.webdav)
|
||||||
|
@ -1,9 +1,21 @@
|
|||||||
from snek.system.service import BaseService
|
from snek.system.service import BaseService
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import shutil
|
||||||
|
|
||||||
class RepositoryService(BaseService):
|
class RepositoryService(BaseService):
|
||||||
mapper_name = "repository"
|
mapper_name = "repository"
|
||||||
|
|
||||||
|
async def delete(self, user_uid, name):
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
repository_path = (await self.services.user.get_repository_path(user_uid)).joinpath(name)
|
||||||
|
try:
|
||||||
|
await loop.run_in_executor(None, shutil.rmtree, repository_path)
|
||||||
|
except Exception as ex:
|
||||||
|
print(ex)
|
||||||
|
|
||||||
|
await super().delete(user_uid=user_uid, name=name)
|
||||||
|
|
||||||
|
|
||||||
async def exists(self, user_uid, name, **kwargs):
|
async def exists(self, user_uid, name, **kwargs):
|
||||||
kwargs["user_uid"] = user_uid
|
kwargs["user_uid"] = user_uid
|
||||||
kwargs["name"] = name
|
kwargs["name"] = name
|
||||||
@ -14,6 +26,9 @@ class RepositoryService(BaseService):
|
|||||||
if not repository_path.exists():
|
if not repository_path.exists():
|
||||||
repository_path.mkdir(parents=True)
|
repository_path.mkdir(parents=True)
|
||||||
repository_path = repository_path.joinpath(name)
|
repository_path = repository_path.joinpath(name)
|
||||||
|
repository_path = str(repository_path)
|
||||||
|
if not repository_path.endswith(".git"):
|
||||||
|
repository_path += ".git"
|
||||||
command = ['git', 'init', '--bare', repository_path]
|
command = ['git', 'init', '--bare', repository_path]
|
||||||
process = await asyncio.subprocess.create_subprocess_exec(
|
process = await asyncio.subprocess.create_subprocess_exec(
|
||||||
*command,
|
*command,
|
||||||
|
@ -64,7 +64,7 @@ class BaseMapper:
|
|||||||
for record in self.db.query(sql, *args):
|
for record in self.db.query(sql, *args):
|
||||||
yield dict(record)
|
yield dict(record)
|
||||||
|
|
||||||
async def delete(self, kwargs=None) -> int:
|
async def delete(self, **kwargs) -> int:
|
||||||
if not kwargs or not isinstance(kwargs, dict):
|
if not kwargs or not isinstance(kwargs, dict):
|
||||||
raise Exception("Can't execute delete with no filter.")
|
raise Exception("Can't execute delete with no filter.")
|
||||||
return self.table.delete(**kwargs)
|
return self.table.delete(**kwargs)
|
||||||
|
@ -1,20 +1,10 @@
|
|||||||
<!DOCTYPE html>
|
{% extends 'settings/index.html' %}
|
||||||
<html lang="en">
|
|
||||||
<head>
|
{% block header_text %}<h1><i class="fa-solid fa-trash-can"></i> Delete Repository</h1>{% endblock %}
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Delete Repository</title>
|
{% block main %}
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
|
||||||
<style>
|
<style>
|
||||||
body { font-family: sans-serif; margin: 2rem; }
|
|
||||||
.container { max-width: 400px; margin: 0 auto; }
|
|
||||||
.confirm-box {
|
|
||||||
background: #ffe5e8;
|
|
||||||
border: 1.5px solid #dc3545;
|
|
||||||
padding: 2rem;
|
|
||||||
border-radius: 10px;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 2rem;
|
|
||||||
}
|
|
||||||
.repo-name {
|
.repo-name {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
@ -22,9 +12,9 @@
|
|||||||
color: #dc3545;
|
color: #dc3545;
|
||||||
}
|
}
|
||||||
.actions {
|
.actions {
|
||||||
display: flex; gap: 1rem; justify-content: center; margin-top: 1.5rem;
|
display: flex; gap: 1rem; justify-content: left; margin-top: 1.5rem;
|
||||||
}
|
}
|
||||||
button, a {
|
button {
|
||||||
background: #dc3545; color: #fff;
|
background: #dc3545; color: #fff;
|
||||||
border: none; border-radius: 5px; padding: 0.6rem 1.2rem;
|
border: none; border-radius: 5px; padding: 0.6rem 1.2rem;
|
||||||
font-size: 1rem; cursor: pointer;
|
font-size: 1rem; cursor: pointer;
|
||||||
@ -39,25 +29,15 @@
|
|||||||
.confirm-box { padding: 1rem; }
|
.confirm-box { padding: 1rem; }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1><i class="fa-solid fa-trash-can"></i> Delete Repository</h1>
|
|
||||||
<div class="confirm-box">
|
|
||||||
<div>
|
|
||||||
<i class="fa-solid fa-triangle-exclamation" style="font-size:2rem; color:#dc3545;"></i>
|
|
||||||
</div>
|
|
||||||
<p>Are you sure you want to <strong>delete</strong> the following repository?</p>
|
<p>Are you sure you want to <strong>delete</strong> the following repository?</p>
|
||||||
<div class="repo-name"><i class="fa-solid fa-book"></i> my-first-repo</div>
|
<div class="repo-name"><i class="fa-solid fa-book"></i> {{ repository.name }}</div>
|
||||||
<form action="/repositories/delete" method="post" style="margin-top:1.5rem;">
|
<form method="post" style="margin-top:1.5rem;">
|
||||||
<input type="hidden" name="id" value="1">
|
<input type="hidden" name="name" value="{{ repository.name }}">
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button type="submit"><i class="fa-solid fa-trash"></i> Yes, delete</button>
|
<button type="submit"><i class="fa-solid fa-trash"></i> Yes, delete</button>
|
||||||
<a href="repositories.html" class="cancel"><i class="fa-solid fa-ban"></i> Cancel</a>
|
<button type="button" onclick="history.back()" class="cancel"><i class="fa-solid fa-arrow-left"></i> Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endblock %}
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@
|
|||||||
<a class="button edit" href="/settings/repositories/repository/{{ repo.name }}/update.html">
|
<a class="button edit" href="/settings/repositories/repository/{{ repo.name }}/update.html">
|
||||||
<i class="fa-solid fa-pen"></i> Edit
|
<i class="fa-solid fa-pen"></i> Edit
|
||||||
</a>
|
</a>
|
||||||
<a class="button delete" href="/settings/repositories/{{ repo.name }}/delete.html">
|
<a class="button delete" href="/settings/repositories/repository/{{ repo.name }}/delete.html">
|
||||||
<i class="fa-solid fa-trash"></i> Delete
|
<i class="fa-solid fa-trash"></i> Delete
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -62,7 +62,23 @@ class RepositoriesDeleteView(BaseFormView):
|
|||||||
|
|
||||||
async def get(self):
|
async def get(self):
|
||||||
|
|
||||||
return await self.render_template("settings/repositories/delete.html")
|
repository = await self.services.repository.get(
|
||||||
|
user_uid=self.session.get("uid"), name=self.request.match_info["name"]
|
||||||
|
)
|
||||||
|
if not repository:
|
||||||
|
return web.HTTPNotFound()
|
||||||
|
|
||||||
|
return await self.render_template("settings/repositories/delete.html", {"repository": repository.record})
|
||||||
|
|
||||||
|
async def post(self):
|
||||||
|
user_uid = self.session.get("uid")
|
||||||
|
name = self.request.match_info["name"]
|
||||||
|
repository = await self.services.repository.get(
|
||||||
|
user_uid=user_uid, name=name
|
||||||
|
)
|
||||||
|
if not repository:
|
||||||
|
return web.HTTPNotFound()
|
||||||
|
await self.services.repository.delete(user_uid=user_uid, name=name)
|
||||||
|
return web.HTTPFound("/settings/repositories/index.html")
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user