diff --git a/app/frontend/src/components/torrent/App.vue b/app/frontend/src/components/torrent/App.vue
index 09d123d..6d2efca 100644
--- a/app/frontend/src/components/torrent/App.vue
+++ b/app/frontend/src/components/torrent/App.vue
@@ -13,35 +13,47 @@
+
-
- Oxpanel
-
-
-
- Manage
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ Oxpanel
+
+
+
+
+
+
+
+
+
+ Manage
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -54,6 +66,7 @@ import Cookies from "js-cookie";
import TorrentList from "@/components/torrent/TorrentList.vue";
import UploadForm from "@/components/torrent/UploadForm.vue";
import Friend from "@/components/auth/Friend.vue";
+import UserStats from "@/components/torrent/UserStats.vue";
+
+
\ No newline at end of file
diff --git a/app/torrent/views.py b/app/torrent/views.py
index 8021148..c768c00 100644
--- a/app/torrent/views.py
+++ b/app/torrent/views.py
@@ -116,6 +116,10 @@ class TorrentViewSet(mixins.CreateModelMixin,
sub = SharedUser.objects.filter(torrent_id=OuterRef("pk"), user_id=user_id).values("date_created")
qs = qs.annotate(last_date=Coalesce(sub, "date_created")).order_by("-last_date")
+ search = self.request.query_params.get("search", None)
+ if search:
+ qs = qs.filter(name__icontains=search)
+
return qs
def create(self, request, *args, **kwargs):
diff --git a/app/user/admin.py b/app/user/admin.py
index ebaa3af..df4a846 100644
--- a/app/user/admin.py
+++ b/app/user/admin.py
@@ -32,14 +32,6 @@ class UserAdmin(BaseUserAdmin):
return filesizeformat(obj.size_used)
size_used.short_description = "Size used"
- def save_formset(self, request, form, formset, change):
- print("save_formset")
- return super().save_formset(request, form, formset, change)
-
- def save_model(self, request, obj, form, change):
- print("save_model")
- return super().save_model(request, obj, form, change)
-
@admin.register(Invitation)
diff --git a/app/user/views.py b/app/user/views.py
index 0e8cb18..29dcb58 100644
--- a/app/user/views.py
+++ b/app/user/views.py
@@ -8,6 +8,7 @@ from rest_framework.viewsets import ModelViewSet, GenericViewSet
from rest_framework import mixins
from rest_framework.decorators import action
from rest_framework.response import Response
+import shutil
from .models import User, FriendRequest, Invitation
from .forms import RegisterForm
@@ -92,6 +93,29 @@ class UserViewSet(mixins.RetrieveModelMixin,
return Response({"success": True, "message": f"The friend {friend.username} successfully removed"})
return Response({"success": False, "message": f"error"})
+ @action(methods=["get"], detail=False)
+ def user_stats(self, request):
+ stats = User.objects.filter(id=request.user.id).aggregate(
+ total_size=Sum("torrents__size"),
+ total_torrent=Count("torrents"),
+ total_shared_torrent=Count("torrents_shares")
+ )
+
+ disk_usage = shutil.disk_usage("/")
+
+ return Response({
+ "torrents_size": stats["total_size"],
+ "torrents_len": stats["total_torrent"],
+ "torrent_len_shared": stats["total_shared_torrent"],
+ "torrents_total_len": stats["total_torrent"] + stats["total_shared_torrent"],
+ "user_max_size": request.user.max_size,
+ "user_usage_percent": (stats["total_size"] / request.user.max_size) * 100,
+ "disk_total": disk_usage.total,
+ "disk_used": disk_usage.used,
+ "disk_free": disk_usage.free,
+ "disk_usage_percent": (disk_usage.used / disk_usage.total) * 100,
+ })
+
class FriendRequestViewSet(mixins.ListModelMixin,
mixins.DestroyModelMixin,