From 739a0d397f2a9e8092cfc29e95b403ae29ccd471 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 11 Feb 2026 02:44:41 +0000 Subject: [PATCH] editing users --- .../__pycache__/__init__.cpython-311.pyc | Bin 183 -> 0 bytes .../setup_accounts.cpython-311.pyc | Bin 2877 -> 0 bytes assets/pasted-20260210-182651-b15404c1.png | Bin 0 -> 2883 bytes core/__pycache__/fix_db_view.cpython-311.pyc | Bin 2510 -> 0 bytes core/__pycache__/fix_view.cpython-311.pyc | Bin 1657 -> 0 bytes core/__pycache__/views.cpython-311.pyc | Bin 98949 -> 105622 bytes core/templates/core/barcode_labels.html | 97 ++++++++++++----- core/views.py | 103 +++++++++++++++++- 8 files changed, 169 insertions(+), 31 deletions(-) delete mode 100644 accounting/management/commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 accounting/management/commands/__pycache__/setup_accounts.cpython-311.pyc create mode 100644 assets/pasted-20260210-182651-b15404c1.png delete mode 100644 core/__pycache__/fix_db_view.cpython-311.pyc delete mode 100644 core/__pycache__/fix_view.cpython-311.pyc diff --git a/accounting/management/commands/__pycache__/__init__.cpython-311.pyc b/accounting/management/commands/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 89fee31c3e4247d0e3b5f10aa6799247bc0171e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmZ3^%ge<81bi8dnIQTxh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%S%5aKQ~ps zG^sSNq*On(A~m_RB)>?%JijQrxF9h(RX;H~IUgvOnU}7go0ylFo|>DQSE8Ssp9|!r y6zj*wXXa&=#K-FuRQ}?y$<0qG%}KQ@Vg(uvvb>ldNPJ*sWMurn03(W+fnoquqb^eb diff --git a/accounting/management/commands/__pycache__/setup_accounts.cpython-311.pyc b/accounting/management/commands/__pycache__/setup_accounts.cpython-311.pyc deleted file mode 100644 index 8706e38e3ec4edb9aa1fb37f9b03eb44a0b4e9fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2877 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 wwdXgSSsV$O{t<8 literal 0 HcmV?d00001 diff --git a/core/__pycache__/fix_db_view.cpython-311.pyc b/core/__pycache__/fix_db_view.cpython-311.pyc deleted file mode 100644 index f355ba6375a1ef99bae9869c2ccef310724287f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2510 zcmbsrO-~y~bY?$n)?ULVw5bD;x@v-gL9(G~m0-J6#&!}S+bG7aN)APfcLPrBU1xV4 zz=A4=p14HHp+v2!a-yopA%B6db9bdZSeB5g_SBoJv=YjxGycLh0V(S2n>TM}-uJv2 z?Jq8u1EBWDZyVVh4Zxpx(riS7cykRAn?M92%z-?703oJ{9FZph<5pE;7ot7*FYj6u&In_j>n^SIe)DjMsqr4Fu=dBD*!5 zX^ZOSlzpdceX>rTDNnDFKZ2i5c|3;>W1ak#lzZyqGF%2L>Qm~PJZ%$DQ-WDAuy`nFMZ?X)Tk0@-;Lj025YChGZxU=Bd^>CTgS z5uIDMli3Ni)>V@tTSA+iF`^6PN|Z)tqp@f>#b>p7O;Vp`GZKG0ITPnIiYm<)R7EUi zbUrp6pHA`Pr5m&9a5y?U>u+Zla;hYVtGu+5)pU)|${n)aQalt(MU#9gG!=_>Z1JH; zgb&Ze((y#QK0Pb1W@UYN+`}hkQhXvEi}8`@?NBQ9d-|gwIqY*zJ5=BXDm&+)* zVqWHTrNfA~bUB(#&Lnw36tnVTn}DA$jhzH9px5GQN9@9CUXt~^q%SFAD+9OMGtiJZ zD*^2ayrtynG_*5xC8MGGyj+Y2N}qM-q9N9uigrWZlDj)0bt#k&D!8Cdmab!5>jJ-| zN)Nxd?z=vDN5Pqm2-?zuBB)}}Cro@v&@jip41grBg@c*6f{wb z(f|61G3ZBNasi7A7^mPEwJM3^FmYUUB0unWv4;t?B8Z!8!eSE!n`lLF-(-^(n>1=r zkAP+ZRnS5Ndi%dvhR`Z zDc-&}NTZcKp2jOfB<6B(*n!Irm0MO#4Q{1H}GitZje55hdvTp^*qj9rQs&A8?LH z(0(xBj@+~#d`jb$n>1btl9>JyYdeIP^N_&W4lhvA5ABC;h;YI~SDfM_L0(k6OXxSJ zewCQUinvg_gSCqP6}&;Q0ks#Qw>`l;db@Mdr1}Ax;-3@k4nnAeAS{DxMkka3Z*)SH Q8h~HHDtI?m`;o5y0GzFEcmMzZ diff --git a/core/__pycache__/fix_view.cpython-311.pyc b/core/__pycache__/fix_view.cpython-311.pyc deleted file mode 100644 index ab4a8a29442dbc1d4d8305800ec460906b8dab44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1657 zcmZux&1)M+6rWkGq>)z}nI>+eMoERMG!`XN>thiIgORuXSh*-!e_|Tic6oPZX_mk3FA40FCF(PHCoUDMdhb&~_GOFM_t|)m0OIs=XDr#Q!bYIzD3FHHw zu9kxpk|&<-FNZ2q`6-0Nubj75s8wRr z6e;Yg-*L)d^_T5psR~Mv(Jjh21(k3rM5$WjCLSg&7bwVkP7T4-U$W6s*KM0zD~K|(mQebX=cN&&`f=;UKRBW-KHjNVVQ=_9`c%D(u`>{ znprPx7q&{Yk*@vVhNR&|V>*Ng!o#OQ?4o1s+OwsOmh5UtM@^mph9)Wq03fS4*@UzA zP!Y9o2np#nB#94bf7GrK;H?(^OPQ?n0r<6)manPo%gFDLg(v-?ao}4}M~ z9zjf5+&gpt$l(};h$=)RBS2gpX$Un@Q#pVP569JDBxcUuTmH%HR?$aDynpsSiP-g) zDq?4d6=V{#q3pImtm@vyFC0^jdSYLO; zQmfY}lli$Junbd_wy3Le17vWR7n9v#vVCso?zTy5qGVT@Y<$z^)!8Vv9HYd@8RQU{I~GS==_W5{PQIzI^T&dcB6}r z^|snB_5&!Sza+62B=+o9hs<`#tV3o2ja_f6PxW3r(N?=8*7M9uJre#Y^d$6Hd#bfH zaEji+;1zyF^mg%Q(IN3Ji900zZvagv_wRHfbKS_CL+0KbYghURLn`OxtH?Dc{>Afe zKn%DOS?WfX9P)pD1Jw7)?V#`*P~M|lAg7@tZ7MhKJDPbfciVS#3rqdBALMdMceUX> zY{32HebT{q{@|i9smSTzgH~U@z`^U&IAWcFul$$B2+Z6%lmCo&hj@+n6R}GYknK4o zSva9yrVH$2Fy*zte*pm{VcbKXI~Q>eed0`V58ZSoxraVfwWu^?Bm K?83#;%lSWwc9qxw diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 1e00527794dbe5e8abd39a19e4cd15e107750aeb..74be99258f5d3c2f79dc5df27343cad990df6283 100644 GIT binary patch delta 25826 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 UAVh_Ty3>cYvGWOvwIK5U2M*r|D*ylh delta 20908 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 CRb_Ml diff --git a/core/templates/core/barcode_labels.html b/core/templates/core/barcode_labels.html index d184deb..174a3f2 100644 --- a/core/templates/core/barcode_labels.html +++ b/core/templates/core/barcode_labels.html @@ -200,7 +200,7 @@ margin: 0; } - /* Direct Print Mode */ + /* Direct Print Mode Overrides */ body.direct-print-mode @page { size: auto; margin: 0; @@ -209,53 +209,91 @@ .label-sheet { position: relative; width: 210mm; - height: 297mm; + min-height: 297mm; /* Ensure full page height for sheets */ margin: 0 auto; background: white; page-break-after: always; box-sizing: border-box; + display: block; /* Default fallback */ + } + + /* Direct print container override */ + body.direct-print-mode .label-sheet { + width: auto; + min-height: auto; + page-break-after: auto; display: block; - font-size: 0; /* Remove whitespace between inline-blocks */ } .label-item { box-sizing: border-box; - display: inline-block; /* More robust than flex for print grids */ - vertical-align: top; text-align: center; overflow: hidden; - font-size: initial; /* Reset font size */ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; /* Fills the grid cell or container */ + height: 100%; + page-break-inside: avoid; } + /* --- SHEET GRIDS --- */ + /* Avery L7651 (5x13 = 65) */ .sheet-l7651 { - padding: 10.7mm 9.75mm !important; + display: grid !important; + grid-template-columns: repeat(5, 38.1mm) !important; + grid-auto-rows: 21.2mm !important; + padding: 10.7mm 9.75mm !important; + gap: 0; } - .label-l7651 { - width: 38.1mm !important; - height: 21.2mm !important; - padding: 1mm; - } - - /* Other layouts ... */ - .sheet-a4-24 { padding: 0 !important; } - .label-a4-24 { width: 70mm; height: 37.125mm; padding: 2mm; } - - .sheet-a4-40 { padding: 0 !important; } - .label-a4-40 { width: 52.5mm; height: 29.7mm; padding: 1mm; } - - .sheet-l7656 { padding: 31.95mm 13mm !important; } - .label-l7656 { - width: 46mm; height: 11.1mm; padding: 0.5mm; + .label-l7651 { padding: 1mm; } + + /* Avery L7656 (4x21 = 84) */ + .sheet-l7656 { + display: grid !important; + grid-template-columns: repeat(4, 46mm) !important; + grid-auto-rows: 11.1mm !important; + padding: 31.95mm 13mm !important; + gap: 0; } + .label-l7656 { padding: 0.5mm; } .label-l7656 .inner-flex { display: flex; flex-direction: row; justify-content: space-around; align-items: center; height: 100%; width: 100%; } .label-l7656 svg { height: 8mm !important; width: auto; } .label-l7656 .label-text { font-size: 5pt !important; width: auto !important; margin: 0 2px; } - .sheet-l7156 { padding: 15.15mm 9.75mm !important; } - .label-l7156 { width: 63.5mm; height: 38.1mm; padding: 2mm; } + /* Avery L7156 (3x7 = 21) */ + .sheet-l7156 { + display: grid !important; + grid-template-columns: repeat(3, 63.5mm) !important; + grid-auto-rows: 38.1mm !important; + padding: 15.15mm 9.75mm !important; + gap: 0; + } + .label-l7156 { padding: 2mm; } + + /* A4 24 (3x8) */ + .sheet-a4-24 { + display: grid !important; + grid-template-columns: repeat(3, 63.5mm) !important; + grid-auto-rows: 33.9mm !important; + padding: 12.9mm 9.75mm !important; + gap: 0; + } + .label-a4-24 { padding: 2mm; } + + /* A4 40 (4x10) */ + .sheet-a4-40 { + display: grid !important; + grid-template-columns: repeat(4, 48.5mm) !important; + grid-auto-rows: 25.4mm !important; + padding: 21.5mm 8mm !important; + gap: 0; + } + .label-a4-40 { padding: 1mm; } .label-item svg { max-width: 100%; @@ -568,7 +606,8 @@ document.addEventListener('DOMContentLoaded', function() { // --- PREPARE PRINT (Full Queue) --- function preparePrint() { - if (document.body.classList.contains('direct-print-mode')) return; + // Ensure we are not in direct print mode + document.body.classList.remove('direct-print-mode'); printArea.innerHTML = ''; const labelType = document.getElementById('labelType').value; @@ -595,7 +634,6 @@ document.addEventListener('DOMContentLoaded', function() { for (let s = 0; s < allLabels.length; s += labelsPerSheet) { const sheetLabels = allLabels.slice(s, s + labelsPerSheet); const sheet = document.createElement('div'); - sheet.className = `label-sheet sheet-${labelType}`; // Add specific classes if (labelType === 'a4-24') sheet.classList.add('sheet-a4-24'); @@ -603,6 +641,9 @@ document.addEventListener('DOMContentLoaded', function() { else if (labelType === 'l7651') sheet.classList.add('sheet-l7651'); else if (labelType === 'l7656') sheet.classList.add('sheet-l7656'); else if (labelType === 'l7156') sheet.classList.add('sheet-l7156'); + + sheet.classList.add('label-sheet'); + sheet.classList.add('sheet-' + labelType); printArea.appendChild(sheet); @@ -664,4 +705,4 @@ document.addEventListener('DOMContentLoaded', function() { updatePreview(); }); -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/views.py b/core/views.py index a594402..4d8d00f 100644 --- a/core/views.py +++ b/core/views.py @@ -18,6 +18,8 @@ import logging import base64 import os from django.conf import settings as django_settings +from django.contrib.auth.models import User, Group, Permission +from django.contrib.contenttypes.models import ContentType from .models import ( SystemSetting, Customer, Supplier, Product, Category, Unit, @@ -166,6 +168,7 @@ def index(request): @login_required def inventory(request): + logger.info("Inventory view accessed") products = Product.objects.all().order_by('name_en') categories = Category.objects.all() units = Unit.objects.all() @@ -176,6 +179,7 @@ def inventory(request): next_30_days = today + datetime.timedelta(days=30) expired_products = products.filter(has_expiry=True, expiry_date__lt=today) + expiring_soon_products = products.filter(has_expiry=True, expiry_date__gte=today, expiry_date__lte=next_30_days) settings = SystemSetting.objects.first() if not settings: settings = SystemSetting.objects.create() @@ -296,11 +300,99 @@ def profile_view(request): @login_required def user_management(request): - return render(request, 'core/users.html') + if request.method == 'POST': + action = request.POST.get('action') + + try: + if action == 'add': + username = request.POST.get('username') + email = request.POST.get('email') + password = request.POST.get('password') + group_ids = request.POST.getlist('groups') + + if User.objects.filter(username=username).exists(): + messages.error(request, _("Username already exists.")) + else: + user = User.objects.create_user(username=username, email=email, password=password) + if group_ids: + user.groups.set(group_ids) + messages.success(request, _("User created successfully.")) + + elif action == 'edit_user': + user_id = request.POST.get('user_id') + user = get_object_or_404(User, id=user_id) + + user.email = request.POST.get('email') + password = request.POST.get('password') + if password: + user.set_password(password) + user.save() + + group_ids = request.POST.getlist('groups') + user.groups.set(group_ids) + messages.success(request, _("User updated successfully.")) + + elif action == 'toggle_status': + user_id = request.POST.get('user_id') + if int(user_id) == request.user.id: + messages.error(request, _("You cannot deactivate yourself.")) + else: + user = get_object_or_404(User, id=user_id) + user.is_active = not user.is_active + user.save() + status = _("activated") if user.is_active else _("deactivated") + messages.success(request, _(f"User {status}.")) + + elif action == 'add_group': + name = request.POST.get('name') + perm_ids = request.POST.getlist('permissions') + + if Group.objects.filter(name=name).exists(): + messages.error(request, _("Group name already exists.")) + else: + group = Group.objects.create(name=name) + if perm_ids: + group.permissions.set(perm_ids) + messages.success(request, _("Group created successfully.")) + + elif action == 'edit_group': + group_id = request.POST.get('group_id') + group = get_object_or_404(Group, id=group_id) + group.name = request.POST.get('name') + group.save() + + perm_ids = request.POST.getlist('permissions') + group.permissions.set(perm_ids) + messages.success(request, _("Group updated successfully.")) + + elif action == 'delete_group': + group_id = request.POST.get('group_id') + group = get_object_or_404(Group, id=group_id) + group.delete() + messages.success(request, _("Group deleted successfully.")) + + except Exception as e: + logger.error(f"User Management Error: {e}") + messages.error(request, _(f"An error occurred: {e}")) + + return redirect('user_management') + + users = User.objects.all().order_by('username') + groups = Group.objects.all().order_by('name') + # Filter permissions to exclude internal/system apps if desired, or show all + permissions = Permission.objects.select_related('content_type').order_by('content_type__app_label', 'content_type__model') + + return render(request, 'core/users.html', { + 'users': users, + 'groups': groups, + 'permissions': permissions + }) @login_required def group_details_api(request, pk): - return JsonResponse({}) + group = get_object_or_404(Group, pk=pk) + permissions = list(group.permissions.values_list('id', flat=True)) + return JsonResponse({'permissions': permissions}) # --- POS Views --- @@ -687,13 +779,18 @@ def edit_purchase(request, pk): decimal_places = site_settings.decimal_places or 2 cart_items = [] + logger.info(f"EDIT_PURCHASE: Processing {purchase.items.count()} items for purchase {pk}") for item in purchase.items.all().select_related('product'): + # Debugging attributes + if hasattr(item, 'unit_price'): + logger.warning(f"Item {item.id} has unit_price attribute! {item.unit_price}") + cart_items.append({ 'id': item.product.id, 'name_en': item.product.name_en, 'name_ar': item.product.name_ar, 'sku': item.product.sku, - 'cost_price': float(item.unit_price), + 'cost_price': float(item.cost_price), 'quantity': float(item.quantity) })