From a9b274a48ff44f957cb19364313568e796489b87 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 11 Feb 2026 03:33:51 +0000 Subject: [PATCH] group permission --- core/__pycache__/views.cpython-311.pyc | Bin 106105 -> 107013 bytes core/templates/core/supplier_payments.html | 18 +++++-- core/templates/core/users.html | 58 ++++++++++++++++----- core/views.py | 22 +++++++- 4 files changed, 78 insertions(+), 20 deletions(-) diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 98e1a4898c0e246a32d239b4161c7a4afe9623ba..ed38371fedd97b7adc2bdb34ae7bed8cd9d3f031 100644 GIT binary patch delta 4397 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 F{{gd;iKYMm delta 3821 zcmai1dstOf7Uy@k=K}WvS5)LG4|xc5;fe;~SeCDZ{CZ#(Hcp{D@xZkg#kgF^>oMvmBg&k=g@W&ni2ho!$}^G{aS% zTTm=^l0^|)Bx#M?Lp(Lx-bMfia0CdIk`jqp*UNWchqhw-Fm)I4Wu8yAFH%P}k|@S8 zjAz)#(8N&9P9HOzV7QOD`2=mgWx4sT?9#kKExSELdvUi-Z6T@Zc0sE(dJWHEXO@~OUt^71Z z+tTc>eohY`c$%8`DQY{3+dZoe1}NH|WSWP3=kE}N~>L-@2KwF<2uKAt{ zQm@kUZJvlz)!wQ?Wt-<&e|DS#XkA@Ts3szcJu}a31`&?)S*n?c*`B56XG8TR@oA6w zLX3jNTEfLw)P6)P@Eo|9uc!k_eAYAe^2-X2YsY_#w1g2MIq4PJ89hXMeWS(W{HX%g zW1LJQFH5NQ=9MI}Zod+3i6HBhY@Nl{vd9NPp5&|5K;-fUOjM&u{i?JAALFF_42W0b zhVA^m#K0dX_w53>G7N%{zR%!zq&log@MNRDlnWmfnFj3TRcwz`P~ z<3-={lUc5@;y*YdYyEMb zLv9Mjkl#i<6O44r{p4V!L(ToAOtQnSPZ@w^h{_G!{@2f=A_m)PD6AsH# zGMGmOBK~>}Vu8#Xia3g~WGIDwhD;X8bwlxrx{SnXIVB0FP%Fm`L$vxgVrunAhv6pR zdHK?C#Hq`PTA}Y6j%k3Damgq|onD)aISO8owp66Z7l$LLf55}VrEXWY+vRo_l+F|{ zkypK*pNi2yom@QvQS`Tq{?vbx<_-Pq2qajnStN@)c+RtA%s6@tPs@A8;h~YUn6GD8 z#c=(s{TDx0@yds>*9#1 zq$5w=PWBu1)^r^64_?W>#>^r)sYe)Im;3HVbRT10#vF{BW9^De*zuYin2F)N$xO<` zjplV6Vzc~fCY(cl?Zc{0UV&L0cs7H-Jd}x~*x9Ulkcnb~Hot;$S4p-}up3#E&6;)6 zF$GELP9lQztSN9>=3dX&$m|uiHPR!YXYE&$*k*oMxMt89`*)7BhOI8KWaRfCo33S! zH^SlfGu5v)@0wBXHcFoyL|~n)5D3TXazYMrde`E$9HRW?t{gb6n>lz84|7^x&4I&e z%(ijxgRg$3XEF55%3K$mcos6w0MSjQUw3TjZD`gm;&N+FK32Vd76&E4H?57y&lT;9R=b|@G;E49n3(|tln0^1_WK*fR#BW* zKlx%MY<=uZ)bnokjPrgahFCj@J<9W@bB#CY-Fdj6_(vMf1ie%3%`Yu{oxyDP-hyEZ;mNVR@V&R5ylY79O|&#j_^mFjly z5+tanNZVijcL|nQ&X8#Lq10>SvZbi7d_&LS{5*y)|6o~Sf}c#PMhf}nRnvKWjtrvY zv(=y-l$VIHd`C2@%hf8NZ(tYuk>g~@WN}0=F zG=je$1b=!MUl)Qu8w5A|f*X9noxI>4U2u0UzGUF0TyXm>xbqg=Negap1$U)F;ekyI zW(Hq|ehl1SiZBLl6-Bf%moSb+ZtH}Tfm=4CITIsT;+{)zOC`8#5@Q+0GfZGeXPC&q zEr{TbLGaBl_|6xV415C%zG+1j1K*$G83w)^=L)_L1>b-ofm7#OP4ERK_`nxC8Ti-{ zdl~qx7yLE}u6)5IFSwWmSDHA -
+

{% trans "Supplier Payments" %}

{% trans "History of payments made to suppliers" %}

- - {% trans "Purchase Invoices" %} - + +
diff --git a/core/templates/core/users.html b/core/templates/core/users.html index d053fe9..3616eba 100644 --- a/core/templates/core/users.html +++ b/core/templates/core/users.html @@ -311,16 +311,21 @@ {% regroup permissions by content_type as perm_list %} {% for g in perm_list %} - + -
{{ g.grouper.name|capfirst }}
-
{{ g.grouper.app_label }}
+
+ + +
{% for perm in g.list %} {% if "view" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -329,7 +334,7 @@ {% for perm in g.list %} {% if "add" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -338,7 +343,7 @@ {% for perm in g.list %} {% if "change" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -347,7 +352,7 @@ {% for perm in g.list %} {% if "delete" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -401,16 +406,21 @@ {% regroup permissions by content_type as perm_list %} {% for g in perm_list %} - + -
{{ g.grouper.name|capfirst }}
-
{{ g.grouper.app_label }}
+
+ + +
{% for perm in g.list %} {% if "view" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -419,7 +429,7 @@ {% for perm in g.list %} {% if "add" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -428,7 +438,7 @@ {% for perm in g.list %} {% if "change" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -437,7 +447,7 @@ {% for perm in g.list %} {% if "delete" in perm.codename %}
- +
{% endif %} {% endfor %} @@ -511,6 +521,8 @@ document.addEventListener('DOMContentLoaded', function() { // Reset checkboxes document.querySelectorAll('.edit-group-perm').forEach(cb => cb.checked = false); + // Reset Select All checkboxes in Edit Modal + document.querySelectorAll('.module-select-all-edit').forEach(cb => cb.checked = false); // Fetch group permissions fetch(`/api/group-details/${id}/`) @@ -525,6 +537,24 @@ document.addEventListener('DOMContentLoaded', function() { }); }); }); + + // Handle "Select All" for Add Group Modal + document.querySelectorAll('.module-select-all').forEach(master => { + master.addEventListener('change', function() { + const moduleId = this.dataset.target; + const checkboxes = document.querySelectorAll(`.module-${moduleId}`); + checkboxes.forEach(cb => cb.checked = this.checked); + }); + }); + + // Handle "Select All" for Edit Group Modal + document.querySelectorAll('.module-select-all-edit').forEach(master => { + master.addEventListener('change', function() { + const moduleId = this.dataset.target; + const checkboxes = document.querySelectorAll(`.module-edit-${moduleId}`); + checkboxes.forEach(cb => cb.checked = this.checked); + }); + }); }); {% endblock %} \ No newline at end of file diff --git a/core/views.py b/core/views.py index 9bb5ec8..90d3046 100644 --- a/core/views.py +++ b/core/views.py @@ -851,10 +851,28 @@ def delete_purchase(request, pk): messages.success(request, _("Purchase deleted.")) return redirect('purchases') +@login_required @login_required def supplier_payments(request): - payments = PurchasePayment.objects.all().order_by('-payment_date') - return render(request, 'core/supplier_payments.html', {'payments': payments}) + payments = PurchasePayment.objects.select_related('purchase', 'purchase__supplier', 'created_by').all().order_by('-payment_date') + + search_query = request.GET.get('search', '') + if search_query: + payments = payments.filter( + Q(purchase__invoice_number__icontains=search_query) | + Q(purchase__supplier__name__icontains=search_query) | + Q(notes__icontains=search_query) | + Q(payment_method_name__icontains=search_query) + ) + + paginator = Paginator(payments, 20) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + return render(request, 'core/supplier_payments.html', { + 'payments': page_obj, + 'search_query': search_query + }) # --- Purchase Returns ---