From 07fac2272f8b8f33e84f4b9cc2d34d48fc4ef919 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 13 Feb 2026 05:02:00 +0000 Subject: [PATCH] changing labels print --- assets/pasted-20260213-034550-9dbf9cca.png | Bin 0 -> 10836 bytes check_libs.py | 29 ++++ core/__pycache__/urls.cpython-311.pyc | Bin 15115 -> 15225 bytes core/__pycache__/views.cpython-311.pyc | Bin 141035 -> 141609 bytes core/templates/core/barcode_labels.html | 157 ++++++++++++++------- core/urls.py | 1 + core/views.py | 10 ++ reproduce_error.py | 33 +++++ test_weasyprint.py | 23 +++ 9 files changed, 200 insertions(+), 53 deletions(-) create mode 100644 assets/pasted-20260213-034550-9dbf9cca.png create mode 100644 check_libs.py create mode 100644 reproduce_error.py create mode 100644 test_weasyprint.py diff --git a/assets/pasted-20260213-034550-9dbf9cca.png b/assets/pasted-20260213-034550-9dbf9cca.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1c09b7982ed6d9b7cb6db1b0ec3ed3def748ca GIT binary patch literal 10836 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 RWGkX!W5gIX4$QE>`yb08NTmP( delta 1241 zcmZ{kT}V@57{~RTXSx|HQTsSs(p=WmHMe;@`;<%+%Tj}^sI?5Dk7Hy(fra)>^kvxM zEhwTWC>(TAA>BnmR}~cJz)N&jLO~S4=_c^1&imgAZ`xr$p7Z|y&&PSr*v!cIh+b3Xg-r@`3R@1LSY;&+S5Z4)kY}qYs-*X!>$Aumd{7LK*T#2B3@Le=*exmwmq*Hq?)91QY{6l2dd#(o_Fwu zRmSRV24zjka>`m>7#9EEP^+`96~2?O`3haUx!rt0+5h<2lUt3er)GMqA2paYH-v-&sW zM-57ul;V`KLXew_1-v&l@!F`7SYuF+Nj;o;tgz1NL%zZeTi9UABdI#u6B4^U7xLMh z1YhCg>tE+e7L6%VyUrS$g=cNE-{vrw1E;|E;0(ApEIjRDe>q0Vl(OThB5$+L&O(_4 z-+({B%81BN!Of96J3fl|7Wf>T1}Q3>0dOri4CbO@x+jQvR8;tdSZNXdHgE@c27Ca% z0>6WERpE?+8^I&0sB;tXGw`G8Z^Sc=O2s`ZH#F`IJ?=NC)1*#Loz|EH$1#azBZ}*I z;qHXQ?nONENl9lzt)kCm@KLMiV7As3Hq|Q&m$Oesg?@IR)hn-;b(YjbN>&r*6X0F& zrB+<=pv>O2c;p?n*BKMuU`%-Xz=JV=;id0K!C~9<6s8X`v9lS_6Bh|>;9y*oI1S#9 z7n8f$orG6jO*;Dq!JQDM2si+afH%Qs;KxKUc^8{VdR)5+&$Wk`FRsXY?NZ%I(N#~1 zIW8i82)<2<;uct)5*{rjPPTw!IJphJ0H;&MMf5t@PkRx44*NHf_RkajPR$Y5A!h$G F{Q<%$c^Ciy diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 553eb16e1ed0dac827dcd3873184b4d7b5414f14..68a3e28a56821a3174ad4bb5b9aab009d1b28634 100644 GIT binary patch delta 25058 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 W+!dLbZ{OpH^eeLen909p`TqcPxEUG% diff --git a/core/templates/core/barcode_labels.html b/core/templates/core/barcode_labels.html index 15ad3dd..0dd3907 100644 --- a/core/templates/core/barcode_labels.html +++ b/core/templates/core/barcode_labels.html @@ -5,9 +5,14 @@

Barcode Label Printing

- +
+ + +
@@ -132,24 +137,17 @@
-
3. Live Preview (Single Label)
+
3. Live Preview (Queue Preview)
-
-
-
-
Product Name
- - -
+
+
+
- Note: This is a preview of the layout. Actual print layout depends on settings above. + Note: This preview shows one of each product in your queue. Actual sheet layout will be generated on print.
@@ -481,6 +479,17 @@ document.addEventListener('DOMContentLoaded', function() { printQueueBtn.addEventListener('click', handlePrintQueue); } + const clearQueueBtn = document.getElementById('clearQueueBtn'); + if (clearQueueBtn) { + clearQueueBtn.addEventListener('click', function() { + if (confirm("Are you sure you want to clear the entire queue?")) { + queue.length = 0; + renderQueue(); + updatePreview(); + } + }); + } + function handlePrintQueue() { if (queue.length === 0) return; preparePrint(); @@ -491,7 +500,7 @@ document.addEventListener('DOMContentLoaded', function() { const printPreviewBtn = document.getElementById('printPreviewBtn'); if (printPreviewBtn) { - printPreviewBtn.addEventListener('click', printSingleFromPreview); + printPreviewBtn.addEventListener('click', handlePrintQueue); } // Product Search @@ -514,38 +523,90 @@ document.addEventListener('DOMContentLoaded', function() { // --- PREVIEW LOGIC --- function updatePreview() { - let product = null; + const container = document.getElementById('previewContainer'); + if (!container) return; + + container.innerHTML = ''; + + // Items to show: either everything in the queue, or the last added if queue is empty + let itemsToShow = []; if (queue.length > 0) { - product = queue[queue.length - 1]; + itemsToShow = [...queue]; } else if (lastAddedProduct) { - product = lastAddedProduct; + itemsToShow = [lastAddedProduct]; } - - if (!product) return; - - const previewName = document.querySelector('.preview-name'); - const previewSku = document.querySelector('.preview-sku'); - const previewPrice = document.querySelector('.preview-price'); - - if (previewName) previewName.innerHTML = (product.nameAr ? `
${product.nameAr}
` : '') + `
${product.name}
`; - if (previewSku) previewSku.innerText = product.sku; - if (previewPrice) previewPrice.innerText = 'OMR ' + parseFloat(product.price).toFixed(3); - - try { - if (typeof JsBarcode !== 'undefined') { - JsBarcode("#previewBarcode", product.sku, { - format: "CODE128", width: 2, height: 40, displayValue: false, margin: 0 - }); - } - } catch(e) {} + if (itemsToShow.length === 0) { + container.innerHTML = '
No items selected for preview
'; + return; + } + + const labelType = document.getElementById('labelType').value; const showName = document.getElementById('showName').checked; const showPrice = document.getElementById('showPrice').checked; const showSKU = document.getElementById('showSKU').checked; - - if (previewName) previewName.style.display = showName ? '' : 'none'; - if (previewPrice) previewPrice.style.display = showPrice ? '' : 'none'; - if (previewSku) previewSku.style.display = showSKU ? '' : 'none'; + + itemsToShow.forEach((p, idx) => { + const previewItem = document.createElement('div'); + previewItem.className = 'bg-white shadow-sm border p-2 d-flex flex-column align-items-center justify-content-center position-relative'; + + // Apply approximate styles based on labelType for the preview + let pWidth = "180px"; + let pHeight = "auto"; + let minHeight = "100px"; + + if (labelType === 'l7651') { pWidth = "150px"; minHeight = "80px"; } + else if (labelType === 'l7656') { pWidth = "180px"; minHeight = "50px"; } + else if (labelType === 'a4-40') { pWidth = "160px"; minHeight = "90px"; } + + previewItem.style.width = pWidth; + previewItem.style.minHeight = minHeight; + + let content = ''; + if (p.qty > 1) { + content += `${p.qty}x`; + } + + if (labelType === 'l7656') { + content = `
`; + if (showName) content += `
${p.nameAr ? p.nameAr + " " : ""}${p.name}
`; + content += ``; + if (showPrice) content += `
${parseFloat(p.price).toFixed(3)}
`; + content += `
`; + } else { + if (showName) { + content += `
`; + if (p.nameAr) content += `
${p.nameAr}
`; + content += `${p.name}
`; + } + content += ``; + if (showSKU || showPrice) { + content += `
`; + if (showSKU) content += `${p.sku}`; + if (showPrice) content += `OMR ${parseFloat(p.price).toFixed(3)}`; + content += `
`; + } + } + + previewItem.innerHTML = content; + container.appendChild(previewItem); + + // Render barcode + const svgEl = previewItem.querySelector('.preview-barcode-item'); + if (svgEl && typeof JsBarcode !== 'undefined') { + let bWidth = 1.2; + let bHeight = 30; + if (labelType === 'l7651') { bWidth = 0.9; bHeight = 20; } + else if (labelType === 'l7656') { bWidth = 0.8; bHeight = 15; } + else if (labelType === 'price-tag') { bWidth = 0.8; bHeight = 15; } + + try { + JsBarcode(svgEl, p.sku, { + format: "CODE128", width: bWidth, height: bHeight, displayValue: false, margin: 0 + }); + } catch(e) {} + } + }); } // --- DIRECT PRINT --- @@ -560,16 +621,6 @@ document.addEventListener('DOMContentLoaded', function() { performDirectPrint(product); } - function printSingleFromPreview() { - let product = null; - if (queue.length > 0) { - product = queue[queue.length - 1]; - } else if (lastAddedProduct) { - product = lastAddedProduct; - } - if (product) performDirectPrint(product); - } - function performDirectPrint(product) { document.body.classList.add('direct-print-mode'); printArea.innerHTML = ''; @@ -718,7 +769,7 @@ document.addEventListener('DOMContentLoaded', function() { } // --- SETUP LISTENERS --- - document.getElementById('labelType').addEventListener('change', () => preparePrint()); + document.getElementById('labelType').addEventListener('change', () => { updatePreview(); preparePrint(); }); document.getElementById('showName').addEventListener('change', () => { updatePreview(); preparePrint(); }); document.getElementById('showPrice').addEventListener('change', () => { updatePreview(); preparePrint(); }); document.getElementById('showSKU').addEventListener('change', () => { updatePreview(); preparePrint(); }); diff --git a/core/urls.py b/core/urls.py index 55e785f..601d69c 100644 --- a/core/urls.py +++ b/core/urls.py @@ -172,4 +172,5 @@ urlpatterns = [ # Database Backup/Restore path('settings/backup/', views.backup_database, name='backup_database'), path('settings/restore/', views.restore_database, name='restore_database'), + path('api/test-pdf/', views.test_pdf_view, name='test_pdf_view'), ] diff --git a/core/views.py b/core/views.py index e74f492..078e5b4 100644 --- a/core/views.py +++ b/core/views.py @@ -43,6 +43,16 @@ logger = logging.getLogger(__name__) # --- Basic Views --- +def test_pdf_view(request): + from weasyprint import HTML + html_string = "

Test PDF

" + pdf = HTML(string=html_string).write_pdf() + return HttpResponse(pdf, content_type='application/pdf') + +@login_required +def dashboard(request): + return redirect('core:index') + @login_required def index(request): settings = SystemSetting.objects.first() diff --git a/reproduce_error.py b/reproduce_error.py new file mode 100644 index 0000000..2fc746b --- /dev/null +++ b/reproduce_error.py @@ -0,0 +1,33 @@ + +import os +import django +from django.conf import settings as django_settings +from django.template.loader import render_to_string +from django.test import RequestFactory + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') +django.setup() + +from core.views import generate_pdf_file +from core.models import Sale + +def test_pdf(): + try: + sale = Sale.objects.first() + if not sale: + print("No sales found") + return + + request = RequestFactory().get('/') + context = {'sale': sale} # Simplified context + + print("Testing PDF generation...") + pdf = generate_pdf_file('pdf/invoice_pdf.html', context, request) + print(f"PDF generated successfully, size: {len(pdf)}") + except Exception as e: + print(f"Caught error: {e}") + import traceback + traceback.print_exc() + +if __name__ == "__main__": + test_pdf() diff --git a/test_weasyprint.py b/test_weasyprint.py new file mode 100644 index 0000000..85f49a4 --- /dev/null +++ b/test_weasyprint.py @@ -0,0 +1,23 @@ + +import os +import sys +import django +from django.conf import settings as django_settings +from django.template.loader import render_to_string + +# Setup Django +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') +django.setup() + +def test_pdf(): + from weasyprint import HTML + print("Imported weasyprint") + html_string = "

Test

" + try: + pdf = HTML(string=html_string).write_pdf() + print(f"Success! PDF size: {len(pdf)}") + except Exception as e: + print(f"Failed: {e}") + +if __name__ == "__main__": + test_pdf()