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 - - - - - - - -
- - -
-
-
-
-
- + + + + + Oxpanel + + + + + + + + @@ -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,