From e35fea8cf016b9efe89bc3c7e2b90213ed0d0933 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 26 Jan 2026 05:25:39 +0000 Subject: [PATCH] admin dashboard --- core/__pycache__/admin.cpython-311.pyc | Bin 10508 -> 10941 bytes core/admin.py | 7 +- core/templates/admin/index.html | 295 ++++++++++++++++++ .../dashboard_stats.cpython-311.pyc | Bin 0 -> 3343 bytes core/templatetags/dashboard_stats.py | 49 +++ locale/ar/LC_MESSAGES/django.mo | Bin 23343 -> 23944 bytes locale/ar/LC_MESSAGES/django.po | 62 +++- 7 files changed, 399 insertions(+), 14 deletions(-) create mode 100644 core/templates/admin/index.html create mode 100644 core/templatetags/__pycache__/dashboard_stats.cpython-311.pyc create mode 100644 core/templatetags/dashboard_stats.py diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 39feadc3cd2cd2335ddb279ac3d84c9db9562797..3e79ad82033b7e090bab6c6bb09897a306c54916 100644 GIT binary patch delta 1749 zcmbW1U2Gdg5P)y}m)MPCW9NsMV!Mfx$mFktHZ%kYM+n*n>V&vWQ&Tuy?G3r;{KM|q zNz)=5se-7Al$K4XB7{^V)Kc+OEZ#sWNQesMAwdDElcK%>;)S3hgm_}+oHU{0iM9OQ z?(EF$?C#7ijD2y^eZ%c`NznfOv#5T1%l(7BWW^!0`yGIHq^lB@k|Zr9Ez~+mlD4#U zUYaCn%SC6>J}=FZq$43kZHDLh0@rhylbo{QbVkj_Q#*dpmks_nzF!0^ldIAN3$ND+ z47S^K_{c33H@X|jBiu!A7wcz`i6>}W`g zKo3^i`Q7#GU#kz6k8atl_7Sor{U3^)W7YQz_+>+gX8}k$w`Nk3$K+)3xqqYE7 zo>elG9YNWk=ye?`p|asBCZg!4S-Kb@h=W|(ba13Yr0Neq9 zQ-@YP_ZW=lT1FKHTQ@VSm(J#MOqUfdr+5+XhW`R6OPl`C$H_JSk#&FNC)aa?#6(A3 zm+LUhF+@nbQg@mhu6$ParG=alGoIB!)&+9IHwCVgbXtal$*7#Gxop(B8*lZfF&`h~ z!nC;P?Itf(Zh038nGnOi5a|+%Z>$?PY1j%(-&wN@tRlx0=>14qTJzVxnb(^opLqYosI=0{x|e zDMnzevSx%IF#|B1FU+QBUWX%MvpBYLow0K`J%_*u*?EK+n0?PFmOyF{%HD)8w*&Bs zx9>O)!@0<)rs$I*7Hr%{Gm5I2v1Tf-KDJ^BmO%mT#0MYdMI1nZrRu&xFr_B0lY_~4Nj*R168*e}7O1WkDUNdg}EsBf8=zGa2_D`Yufk_Dfp$oT0d zck0z8PT6N>)v6V>pt#$SJ~{$ZSPqd#6y6~P1KtPNc>lhQ5B=Dk-k8Q$jCa0CjHB}e zViKSQ*q9p&?;RE&L-rm8CA*-qIO9989jUvon@riFb#*Ay5VRc8Q|2e$PPwV zo0L1U6FzL6Qy4MI8}%AQIf1kM^_8nU1S8dZ+G{={YF%lfy7#*l2st8ti;YD_F&kn) z^mTtpM%_mD4+@zRQ~Tb0E`z+;piCyN7+g0@QwO7JacJ;S{F$5)zYcyy*2T%8 zsT*}qMl=w36j(1}6(GZBua{}Vfp#&5wx2tUas2HdE+d+VeE==E*HN|(f+Un(gD(#P zpjuUJcl9cmtz5}AoQilDj|;Uw6!jXZuUYik6}M;jiIQ%C6YNm}KCB0kK|yJ!m=-(x zOXQ~LS9NkrTvwmQ=FsJ9bn!#~4`c=g_j)r8vJ6)&YMXG*UMwPUmVj&QH!%73^t5NBQP_&i@@{1aJLvXnPDO97UF`K$Yv%mq>SyJr82c`UDrr^ z!|~ppYL{Qc35ZYJW_E>;qIf&9HgXQt8N>)8hw!fHCXNt~#cJ+jSm)#1{L~iMaEIzP z)oD$JEjZm}$6BN9+o`aJIBEB$qAzE-mj25 Isof+00T8V*Qvd(} diff --git a/core/admin.py b/core/admin.py index b16cdd3..c579958 100644 --- a/core/admin.py +++ b/core/admin.py @@ -23,6 +23,11 @@ class ProfileInline(admin.StackedInline): class CustomUserAdmin(UserAdmin): inlines = (ProfileInline,) + def get_inline_instances(self, request, obj=None): + if not obj: + return list() + return super(CustomUserAdmin, self).get_inline_instances(request, obj) + class ParcelAdmin(admin.ModelAdmin): list_display = ('tracking_number', 'shipper', 'carrier', 'price', 'status', 'payment_status', 'created_at') list_filter = ('status', 'payment_status', 'created_at') @@ -166,4 +171,4 @@ admin.site.register(Country, CountryAdmin) admin.site.register(Governate) admin.site.register(City) admin.site.register(PlatformProfile, PlatformProfileAdmin) -admin.site.register(Testimonial, TestimonialAdmin) \ No newline at end of file +admin.site.register(Testimonial, TestimonialAdmin) diff --git a/core/templates/admin/index.html b/core/templates/admin/index.html new file mode 100644 index 0000000..fe1ab63 --- /dev/null +++ b/core/templates/admin/index.html @@ -0,0 +1,295 @@ +{% extends "admin/index.html" %} +{% load i18n static dashboard_stats %} + +{% block extrastyle %} +{{ block.super }} + + +{% endblock %} + +{% block content %} +{% get_dashboard_stats as stats %} + +
+ + +
+
+
+ {% trans "Total Revenue" %} +
💰
+
+
{{ stats.total_revenue|floatform:2 }} OMR
+
+ +
+
+ {% trans "Total Parcels" %} +
📦
+
+
{{ stats.total_parcels }}
+
+ {{ stats.delivered_parcels }} Delivered +
+
+ +
+
+ {% trans "Active Drivers" %} +
🚚
+
+
{{ stats.drivers_count }}
+
+ +
+
+ {% trans "Pending Orders" %} +
+
+
{{ stats.pending_parcels }}
+
+
+ + +
+
+

{% trans "Shipments Overview (Last 7 Days)" %}

+ +
+ +
+

{% trans "Recent Activity" %}

+
    + {% for parcel in stats.recent_parcels %} +
  • +
    + {{ parcel.shipper.username|slice:":1"|upper }} +
    +
    +
    {% trans "New Parcel" %} #{{ parcel.tracking_number|slice:":8" }}...
    +
    {{ parcel.created_at|timesince }} {% trans "ago" %}
    +
    + + {{ parcel.get_status_display }} + +
  • + {% empty %} +
  • {% trans "No recent activity." %}
  • + {% endfor %} +
+
+
+ +
+ + +{{ block.super }} + + + + +{% endblock %} \ No newline at end of file diff --git a/core/templatetags/__pycache__/dashboard_stats.cpython-311.pyc b/core/templatetags/__pycache__/dashboard_stats.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03b1a63aa36cb821c2208c598cbe7bc9c0bf68f7 GIT binary patch literal 3343 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 K)}_NoeD+^K*lU6S delta 6366 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 syyop9^46v8^-WKo7wAiC)31