From e5357909b3ffb023edfb664ed92597ee65f52746 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 1 Feb 2026 07:34:23 +0000 Subject: [PATCH] Fix duplicate date range dropdowns in Admin --- config/__pycache__/settings.cpython-311.pyc | Bin 9823 -> 9904 bytes config/settings.py | 3 +- core/__pycache__/admin.cpython-311.pyc | Bin 22363 -> 22143 bytes core/admin.py | 5 +- staticfiles/css/custom_v2.css | 359 ++++++++++++++++++ temp_jazzmin_base.html | 386 ++++++++++++++++++++ 6 files changed, 747 insertions(+), 6 deletions(-) create mode 100644 staticfiles/css/custom_v2.css create mode 100644 temp_jazzmin_base.html diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index a6dee05271e8c6dc60d54dc579aa6301e35d4de9..01499dd7f7c353ee5987d2ae38eb2bf9bbacb0e6 100644 GIT binary patch delta 1247 zcmZ9I?{8C87{|{!?X7n!o$YOBmu+-ggfz(Lk1>=18}3Kfl@-u+WZBg@>z=c6VQaB1 zOfhDdnD_&K6c6B(F{_D^2r-)b&cqicyd#*#gro^k`42oVeW&M~g~Z&O+|T`<=lML( z?d@OLACI@)^7&ekxPHUy)>iaNTL=E(r|2K9A{;W~v;_`d^de*?2%@et%9Ab}f#L56 zLbt`eeVIvzF#<;&#(*&PJFMqnblYN=NSNJn`(0x&&VF|HJUsy^$NaO7*-7@NXP8mV z?@GfId*nGhbkJdB=mE!$AvpFfa#+)Jh;3=9u0!--nLyTj&e1;(Cs?niCvy^BaBMr` zFkgfjhcQftA$L~&OJx_#nj=L5r`Y?Rxjvu69ChrPmtPkc1JfLbm&^%x*-XKLImt$F zZ>yQ6>2ido>+S4U9Ay7uW8DJ*n!bT<5_77k(X=3eSIj93!6LlMFy!Gi!6iiiD)O>o z0Zxl-srnf>3o8X8&a2=OEEbSp3C_Wag$r2Z*P#p*Sb!=RaDLNWz?Q6D03#wEYhVbz zp@!a6yeRay^VqtUI{$2lv zV4dCbCiJ3}9-Vb{%-L^uyhm`> z*1Do36wJ+z&Su6ZGuc#bF*kd1W;C6$_wMY+MAPm0$S*kHZ6h2##-&!?X-9iYSPxI( z1`2ZBzScKS){`O9bo(1dl)FTH=_h)D`|nfT1!n_ zf_++xsc}Ep{%<6)yaVKi-0av2hqPAEv^F@bwL`DgL45g@)}S6tmg&LC#pE4!l6kC- z<$*&FK0=QrtuwCZK}HFVXq{06MQRWnU_@g3lVD*S ziXg@~Bw#R#BbfOqI1NeYg%qeToRK3q%ByEUtzfsapfZk#rgMVlS$tFsyg)n!%f>P` zxB^!p1lQm?n-F5xjg0j<*1Fg^Z$gN*-x5p9<}nuioe+Dr4f7a*l1T}G|k3wgbs7I7~|iZkm9P#fRad8nK&;$FfY zq>oI7vMwKW@PdjIH65T%?k=Rb(tGG)?&MvS6Z^@Rs#UFgyNdU<)79MTk+N(eK)u|3 ze6~s(xcm7iKW*e5K#FH#U~(W^x|*)>leX&C6)SQMf6h~pTjI&NJ+vS582X1SDxoKg I>FQ$q7v*X@FaQ7m diff --git a/config/settings.py b/config/settings.py index 0e89088..14def59 100644 --- a/config/settings.py +++ b/config/settings.py @@ -293,7 +293,6 @@ JAZZMIN_SETTINGS = { "default_icon_children": "fas fa-circle", "related_modal_active": False, "custom_css": "css/custom_v2.css", - "custom_js": "js/admin_date_range_dropdown.js", "use_google_fonts_cdn": True, "show_ui_builder": False, "language_chooser": True, @@ -331,4 +330,4 @@ REST_FRAMEWORK = { 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], -} \ No newline at end of file +} diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a2adaf499905a6adca95dde5dbcfb7d05525df65..7edfd23509d2002b6c0226ff8c00b0c1ccc3f364 100644 GIT binary patch delta 3779 zcma)8du)@}70NL5Bdhf3!?0{bOClHVL+Bf^V9(O53Cgb?P=IwWWKUb3a2K z&cr??Ki_-qIp>~p&*R?TU1tAzo!Nh6w`XVI_jh(AeEF2Um>s@aS;UNNa4DQ;g^QLM zGB##}oG)aA3b^q#V@Ad${MWx-wQ{Wx*NQkBTu%IsI!P-=nkz+H$m9zAp5^Kz$4bdl zhCJ>^at%0I^-%Nq)o{B!AB4eao1!%m&C4@+?P~@!1ON4pWy}ywu~~WD|HGEWS3aH% zHW||lfkWvuFVErik5}jAcHZ!KHdtUv+tthG@fEX0xtrJXzrZ+s5ML^{iHAZm0PMFxW1c z*U+#Ho^=#widckKz-?O@YlgqsTFN_d$!`!{#IcZ|8$qQwx!pp_t%tsxs-h|)+Yydt z+;QZcJotgbcgyM%&2T#B{9dWVq?saNHKApy!*MReTIAL8`*|V|jz+>!jz4Nbi3Yjq zH;EovvY)j&Ws;oR+ZAJzBY0h4w=TMTd8*RbZ~r*<1-+ri{$ zt&vJh!y=+;w&1Xuhz$j3BA!O^Svq#3?&#kGFc2JOK;NF@y0-CGk}xjLq*=M36^XLqp-{lHh<6?dMc60gC!KjC+58`RyyW z7?(_0zK#@2^Q8^vXsR1YBl19e51#SWZ{Ic$a``Of@4&t5T&siSx1I z=~nU4I7MAi13~q<)5$;itdxl#S6*z^T_jbcSvBga^eCT7(-RlrXd)1o{;IFTZ>p-$ zw=b${ndLp?-6nnx_0@j%7VNEF%&x=9>Q37<{qSLRSsj_KPMu@Q;?uNK!5kLHL;J5l z-J%!K+Utu-^U`x1?k#fJ#!y_85FCVgH48RVzUT$iNF$1pphFRd2*@o#JBlL&M-kL% zxqXa?1PU!&hS8dZnUhCuSu2yT)=V(HA0JEBF1f<2luZ6C@eF*lbg`LQsqn#qW$V~E z*t6^kdnK7$>oOFsM7m~)?HlC5gsPeODCUMLw!_*wmv`!PWPa(VpUSOIP;RUeF0?se zvM!H(0I$}y>0R!8PT}eLKlGAf@mJEGxj!th;W~*hLa?2H-1cWq%bhofD*KJxEfc4d zHV<;Z$52cDste5a4he(^d~joR$n3-6*kbs1iyJx{=N&olXgNZoB7#DKA%X#dL4qiO z+&o4j*^Q@H2dUL%1dUXLwCcEz#IefWh?3YJ6GOcswm%G)+w8d`)JTC0x^Vv@LZp&WQ3ZJzspKZU3Hh*NlmbGCt$n{=Ju4qP#)&KTq zdc<0ZopIffhw)0)%sT_lKsZ1%Vds=1dg}0Gbj9_t;b32 zRkO4P=^{|K{g?@cl>irV3ZQ-cw|XhRg%K&JkTO8C)5X6(%p)O{V-l~Ty{6ks?MTR) zn=8Z2;AyYKXHG}^wj;E$er3&@ePxkWT?v(dUcEB)C~|__mR9P;d>E&iLvSS&i$=bh zvQ3!L=DDl;E{WgGz)HKGEZgvxR6XCt_tj6?ad>~D7xCW4tqXHdgO)R-j0Qqjuk^r4 ze?nzLa8m_7KPEO|8-%Nyb}n_G)R@tIpda5}cG8ed8d7&r+GTEoh7K=V3A;LcDF3w% z=k}Qwq>z2>AX)rda?=_UA&womUu2Vi@|+IQs*R>IZ&Hy(G=dtq*Ads-Ru(9o{mbXt zg!IqW;3N$MjqrJ=N7vv4Pgh?}0TS_@hYyATkBWAZl^2y^+SnwBOBBNQyGnbArN?iX z9qC#A+2yr~4}gTSFT!V=<05qgEnwTcNH@m?&71Go&!TqBP!BPj1y8pNbF8`hW%df( z?mkie@k7@zCXf2yC# zOP3O&?W+lm2kI~Gd4Q{)AQb%0AUQDm%LFw*C)k{ix6 j;&W^BP%JbY;Vq&Kx5mE=bujr(-yN2GciS0*yp{e7f1Yb8 delta 4017 zcma)9dr*|u72msWSe7-s77%b*o+|=^fD#2=LGi^)OfgRC=5xObtSr0aev2BWRgxi! zwpQaYkJjeV{$Zy{tfrgVKl+$SGnr{RozeE6(9d?#>6pxP+Dy%3Y$ks+J?DPBTN2Uh(JXyI@^r)X!J&mQ+a@!ZHkD`FsdHo0dnU zkbC&1R8ci^z!a!RzGi)awX(SgewK-Y7fjrAfT^YfW|bj}S@(8|__!KB8tYUNe6JE4 z=G!CD1Q$I43%utjhid1xTn`FPE&R+{ol~8n5N0UeRkxP^jlq0~$ zj*W$)f~J)ORRn=~$cKpYlwB?a;NbRxq$e%N?AvL%3%-{Ax?Qq&g2PqJs-VKPidDik zS9{qWIU{=@{=5~81GX`xU!s%Tm$q*xfz6debVG@0KanI6%&2&!X|SluvBNQq_=cntpD;sd8= z3mVz!`J;t(Ls9lmSsmQS-qqBG9HNLI8$oxBD4LQ;2qPSIl5|uNu}ExKw~z6}NL&>| z(4AAvLNJ9~bi2vQn~21mMm5YI`TCZi5f-)reFcS#ae}Uu4Du|YsxF`~Jh64HOrp1m8r^-5OU! zcqB9w;Zar79ZEP6iN`cSDPUBTDfsIJl9q~hlc{rizc76=wr3sl!S=e4eimHaNVU9&K4R;c-EIC)1M8>g98J>QM z$}sK^)#t$98nfB^aJO-*jcT9=p4yrR1M5C`gzSksWYjhk5!iKeiSQ%=8I_?4*p^ti zPE^@cq&*u>DRJg3QY0tKrNv84E7)J)ji&vW5w_-Cj6DW@Evs^+R@o7C# zb>$9p3!c;e-p10?>Oe(0hGmQ>P&~}9dRT@P;g;U)l zxT3~m(I@9Rgdmgmulidge#?aQ_3NbQ{AjMUZ{cIl!G5|Kgsm2s1u&rQ<`;*(*nqLGVe z1ohCqbKK}?E_iF_aO1rfu#iSbf2syAX&`8W?p>vZ1}`Lb?LCo?M11h!TOq__Vmryo z>&m=jY!$>M3WzmbzJy{4) ztCm*p_2f(Erm?s>5#{Zo6Yb-#NxPVI@113<8B4okS`IJ9KOySpi%a(8hXc=>t+a{% E0#~(xwEzGB diff --git a/core/admin.py b/core/admin.py index 3a39b62..aa3aeed 100644 --- a/core/admin.py +++ b/core/admin.py @@ -18,9 +18,6 @@ from django.template.loader import render_to_string import weasyprint from django.db.models import Sum -class DropdownDateRangeFilter(DateRangeFilter): - pass - class ProfileInline(admin.StackedInline): model = Profile can_delete = False @@ -104,7 +101,7 @@ class ParcelAdmin(admin.ModelAdmin): list_filter = ( 'status', 'payment_status', - ('created_at', DropdownDateRangeFilter), + ('created_at', DateRangeFilter), ) search_fields = ('tracking_number', 'shipper__username', 'receiver_name', 'carrier__username') actions = ['export_as_csv', 'print_parcels', 'export_pdf'] diff --git a/staticfiles/css/custom_v2.css b/staticfiles/css/custom_v2.css new file mode 100644 index 0000000..1601100 --- /dev/null +++ b/staticfiles/css/custom_v2.css @@ -0,0 +1,359 @@ +/* masarX Custom Styles */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@600;700&display=swap'); + +:root { + --primary-dark: #1A1A1D; + --accent-orange: #FF922B; + --soft-cloud: #F8F9FA; + --slate-blue: #4D96FF; + --glass-bg: rgba(255, 255, 255, 0.1); +} + +body { + font-family: 'Inter', sans-serif; + background-color: var(--soft-cloud); + color: var(--primary-dark); +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'Outfit', sans-serif; + font-weight: 700; +} + +.hero-section { + background: linear-gradient(135deg, var(--primary-dark) 0%, #2D2D30 100%); + padding: 100px 0; + color: white; + position: relative; + overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -50px; + right: -50px; + width: 200px; + height: 200px; + background: var(--accent-orange); + filter: blur(80px); + opacity: 0.2; +} + +.glass-card { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 20px; + padding: 30px; +} + +.btn-masarx-primary { + background-color: var(--accent-orange); + color: white; + border: none; + padding: 12px 30px; + border-radius: 12px; + font-weight: 600; + transition: all 0.3s ease; +} + +.btn-masarx-primary:hover { + background-color: #E87E1B; + transform: translateY(-2px); + color: white; +} + +.tracking-input { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + color: white; + border-radius: 12px 0 0 12px; + padding: 15px 20px; +} + +.tracking-input:focus { + background: rgba(255, 255, 255, 0.15); + border-color: var(--accent-orange); + box-shadow: none; + color: white; +} + +.feature-icon { + width: 60px; + height: 60px; + background: var(--accent-orange); + border-radius: 15px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 20px; + color: white; + font-size: 24px; +} + +.parcel-status-badge { + padding: 8px 16px; + border-radius: 50px; + font-size: 14px; + font-weight: 600; +} + +.status-pending { background: #FFE8CC; color: #D9480F; } +.status-picked_up { background: #E3FAFC; color: #0B7285; } +.status-in_transit { background: #E7F5FF; color: #1864AB; } +.status-delivered { background: #EBFBEE; color: #2B8A3E; } + +/* Chat Widget */ +#masar-chat-widget { + position: fixed; + bottom: 90px; + right: 20px; + width: 350px; + height: 500px; + z-index: 9999; + display: flex; + flex-direction: column; +} + +#masar-chat-toggle { + position: fixed; + bottom: 20px; + right: 20px; + width: 60px; + height: 60px; + border-radius: 50%; + z-index: 9999; + box-shadow: 0 4px 12px rgba(0,0,0,0.15); + background-color: var(--accent-orange); + color: white; + border: none; + transition: transform 0.2s; +} + +#masar-chat-toggle:hover { + transform: scale(1.05); +} + +/* RTL Support for Chat */ +[dir="rtl"] #masar-chat-widget { + right: auto; + left: 20px; +} +[dir="rtl"] #masar-chat-toggle { + right: auto; + left: 20px; +} + +.typing-dots span { + display: inline-block; + width: 8px; + height: 8px; + background-color: #adb5bd; + border-radius: 50%; + margin: 0 2px; + animation: typing 1s infinite; +} +.typing-dots span:nth-child(2) { animation-delay: 0.2s; } +.typing-dots span:nth-child(3) { animation-delay: 0.4s; } + +@keyframes typing { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-5px); } +} + +/* --- Admin Panel Customizations --- */ + +/* Fix: Prevent accidental file dialog open when clicking labels for logos/favicons */ +body.model-platformprofile label[for="id_logo"], +body.model-platformprofile label[for="id_favicon"], +body.model-platformprofile label[for="id_admin_panel_logo"] { + pointer-events: none; + cursor: default; +} + +/* Improve Admin Form Spacing */ +.form-row { + padding: 15px 10px; + border-bottom: 1px solid #f0f0f0; +} + +/* --- Fix Admin Search Box & Filter Layout --- */ + +/* Target the search form container in Jazzmin/AdminLTE */ +#changelist-search .input-group { + display: flex !important; + flex-wrap: nowrap !important; + max-width: 300px !important; +} + +/* Make the input field take available space */ +#changelist-search input[type="text"] { + flex-grow: 1 !important; + width: auto !important; +} + +/* Ensure the button stays inline */ +#changelist-search button[type="submit"], +#changelist-search .btn { + white-space: nowrap !important; +} + +/* Force filters to sit nicely in a row */ +.filter-wrapper .form-group, +.filter-wrapper select, +.filter-wrapper .select2-container { + margin-bottom: 0 !important; + display: inline-block !important; + width: auto !important; +} + +/* Fix for Date Range Inputs if they appear */ +.admindatefilter .controls { + display: inline-flex !important; + align-items: center !important; +} + +/* --- Search Box RTL/LTR Border Radius Handling --- */ + +/* LTR (Default) */ +.masar-search-input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.masar-search-btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +/* RTL Override for Search Box */ +[dir="rtl"] .masar-search-input { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +[dir="rtl"] .masar-search-btn { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +/* --- Admin Panel RTL Sidebar Override (Agresive) --- */ + +/* We use [dir="rtl"] selector which should be on html tag */ + +@media (min-width: 992px) { + /* Main Sidebar */ + [dir="rtl"] .main-sidebar { + left: auto !important; + right: 0 !important; + border-right: none !important; + border-left: 1px solid rgba(0,0,0,0.1) !important; + } + + /* Content Wrapper & Headers */ + [dir="rtl"] .content-wrapper, + [dir="rtl"] .main-header, + [dir="rtl"] .main-footer { + margin-left: 0 !important; + margin-right: 250px !important; + transition: margin-right .3s ease-in-out !important; + } + + /* Collapsed Sidebar State */ + [dir="rtl"].sidebar-collapse .main-sidebar { + margin-left: 0 !important; + margin-right: 0 !important; /* AdminLTE collapses by width, not margin usually, but ensure position matches */ + width: 4.6rem !important; + } + + [dir="rtl"].sidebar-collapse .content-wrapper, + [dir="rtl"].sidebar-collapse .main-header, + [dir="rtl"].sidebar-collapse .main-footer { + margin-left: 0 !important; + margin-right: 4.6rem !important; + } + + /* Fix Brand Logo Area */ + [dir="rtl"] .brand-link { + float: right !important; + width: 100% !important; + text-align: right !important; + } + [dir="rtl"] .brand-image { + float: right !important; + margin-right: 0.8rem !important; + margin-left: 0.5rem !important; + } + + /* Navbar alignment */ + [dir="rtl"] .navbar-nav { + flex-direction: row; /* bootstrap default, but ensure items flow right to left visually */ + } + [dir="rtl"] .navbar-nav .nav-item { + float: right; + } + + /* Right side navbar items (user menu etc) should be on left now? + In RTL, "ml-auto" (margin-left: auto) pushes items to the LEFT. + Jazzmin uses ml-auto for the user menu. + In RTL, we want them on the LEFT. + Bootstrap 4 RTL support usually flips ml-auto to mr-auto, + but if we are running LTR bootstrap in RTL mode, ml-auto pushes to Right. + Wait, ml-auto = margin-left: auto. In LTR, this pushes to Right. + In RTL, we want these items on the LEFT. So we need margin-right: auto. + */ + + [dir="rtl"] .ml-auto { + margin-left: 0 !important; + margin-right: auto !important; + } + + [dir="rtl"] .mr-auto { + margin-right: 0 !important; + margin-left: auto !important; + } +} + +/* Sidebar Navigation Items RTL */ +[dir="rtl"] .nav-sidebar .nav-item > .nav-link { + display: flex !important; + flex-direction: row !important; /* Standard flow: RTL = Start(Right) to End(Left) */ + align-items: center !important; +} + +[dir="rtl"] .nav-sidebar .nav-icon { + margin-left: 0.5rem !important; + margin-right: 0 !important; +} + +[dir="rtl"] .nav-sidebar .nav-link p { + display: inline-block !important; + margin-right: 0 !important; + text-align: right !important; + width: 100% !important; +} + +/* Fix sidebar angle icon (arrow) */ +[dir="rtl"] .nav-sidebar .nav-icon.fa-angle-left { + transform: rotate(180deg); + margin-left: 0 !important; + margin-right: auto !important; /* Push to the far left */ +} + +/* General Utils */ +[dir="rtl"] .float-right { + float: left !important; +} +[dir="rtl"] .float-left { + float: right !important; +} +[dir="rtl"] .text-right { + text-align: left !important; +} +[dir="rtl"] .text-left { + text-align: right !important; +} \ No newline at end of file diff --git a/temp_jazzmin_base.html b/temp_jazzmin_base.html new file mode 100644 index 0000000..85ff041 --- /dev/null +++ b/temp_jazzmin_base.html @@ -0,0 +1,386 @@ +{% load i18n static jazzmin admin_urls %} +{% get_current_language as LANGUAGE_CODE %} +{% get_current_language_bidi as LANGUAGE_BIDI %} +{% get_jazzmin_settings request as jazzmin_settings %} +{% get_jazzmin_ui_tweaks as jazzmin_ui %} + + + + + + + + + + + {% block title %}{{ title }} | {{ jazzmin_settings.site_title }}{% endblock %} + + + + + + + + + {% if jazzmin_ui.theme.name != 'default' %} + + {% endif %} + + {% if jazzmin_ui.dark_mode_theme %} + + {% endif %} + + + + + {% if jazzmin_settings.custom_css %} + + + {% endif %} + + + + + + {% if jazzmin_settings.use_google_fonts_cdn %} + + + {% endif %} + + {% block extrastyle %} {% endblock %} + {% block extrahead %} {% endblock %} + + + +
+ + {% if not is_popup %} + + {% block sidebar %} + {% if jazzmin_settings.show_sidebar %} + {% get_side_menu as side_menu_list %} + + + {% endif %} + {% endblock %} + {% endif %} + +
+ {% block page_content %} + {% if not is_popup %} +
+
+
+
+

{% block content_title %}{% endblock %}

+ {% block breadcrumbs %}{% endblock %} +
+ {% block page_actions %}{% endblock %} +
+
+
+ {% endif %} + +
+
+
+ {% block messages %} + {% for message in messages %} + {% if message.tags == 'success' %} +
+ + {{ message|capfirst }} +
+ {% elif message.tags == 'error' %} +
+ + {{ message|capfirst }} +
+ {% elif message.tags == 'warning' %} +
+ + {{ message|capfirst }} +
+ {% elif message.tags == 'info' %} +
+ + {{ message|capfirst }} +
+ {% endif %} + {% endfor %} + {% endblock messages %} +
+ {% block content %} {% endblock %} +
+
+
+
+ + + {% endblock %} +
+ +{% block footer %} + {% if not is_popup %} +
+
+ {% trans 'Jazzmin version' %} {% get_jazzmin_version %} +
+ {% autoescape off %} + {% trans 'Copyright' %} © {% now 'Y' %} {{ jazzmin_settings.copyright }}. {% trans 'All rights reserved.' %} + {% endautoescape %} +
+ {% if jazzmin_settings.show_ui_builder %} + {% include 'jazzmin/includes/ui_builder_panel.html' %} + {% endif %} + {% endif %} +{% endblock %} + +
+ +{% if jazzmin_settings.show_ui_builder %} + +{% endif %} + + + + + + + + + + +{% if jazzmin_settings.custom_js %} + +{% endif %} + +{% if jazzmin_settings.show_ui_builder %} + + +{% endif %} + +{% block extrajs %}{% endblock %} + + +