mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-03 22:55:43 +00:00 
			
		
		
		
	Client side QR Codes (#4357)
* Add JS for qrcodejs Ref: https://davidshimjs.github.io/qrcodejs/ * Simple function for rendering a QR code * Refactor QR code view for Part * Replace QR code view for SupplierPart * Refactor QR codes for stock item and stock location models * Remove base QRCodeView entirely
This commit is contained in:
		@@ -2118,9 +2118,6 @@ part_api_urls = [
 | 
			
		||||
        # BOM download
 | 
			
		||||
        re_path(r'^bom-download/?', views.BomDownload.as_view(), name='api-bom-download'),
 | 
			
		||||
 | 
			
		||||
        # QR code download
 | 
			
		||||
        re_path(r'^qr_code/?', views.PartQRCode.as_view(), name='api-part-qr'),
 | 
			
		||||
 | 
			
		||||
        # Old pricing endpoint
 | 
			
		||||
        re_path(r'^pricing2/', views.PartPricing.as_view(), name='part-pricing'),
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -447,11 +447,9 @@
 | 
			
		||||
 | 
			
		||||
    {% if barcodes %}
 | 
			
		||||
    $("#show-qr-code").click(function() {
 | 
			
		||||
        launchModalForm(
 | 
			
		||||
            "{% url 'api-part-qr' part.id %}",
 | 
			
		||||
            {
 | 
			
		||||
                no_post: true,
 | 
			
		||||
            }
 | 
			
		||||
        showQRDialog(
 | 
			
		||||
            '{% trans "Part QR Code" %}',
 | 
			
		||||
            '{"part": {{ part.pk }}}',
 | 
			
		||||
        );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -113,28 +113,3 @@ class PartDetailTest(PartViewTestCase):
 | 
			
		||||
        response = self.client.get(reverse('api-bom-download', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
        self.assertIn('streaming_content', dir(response))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PartQRTest(PartViewTestCase):
 | 
			
		||||
    """Tests for the Part QR Code AJAX view."""
 | 
			
		||||
 | 
			
		||||
    def test_html_redirect(self):
 | 
			
		||||
        """A HTML request for a QR code should be redirected (use an AJAX request instead)"""
 | 
			
		||||
        response = self.client.get(reverse('api-part-qr', args=(1,)))
 | 
			
		||||
        self.assertEqual(response.status_code, 302)
 | 
			
		||||
 | 
			
		||||
    def test_valid_part(self):
 | 
			
		||||
        """Test QR code response for a Part"""
 | 
			
		||||
        response = self.client.get(reverse('api-part-qr', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
 | 
			
		||||
        data = str(response.content)
 | 
			
		||||
 | 
			
		||||
        self.assertIn('Part QR Code', data)
 | 
			
		||||
        self.assertIn('<img src=', data)
 | 
			
		||||
 | 
			
		||||
    def test_invalid_part(self):
 | 
			
		||||
        """Test response for an invalid Part ID value"""
 | 
			
		||||
        response = self.client.get(reverse('api-part-qr', args=(9999,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,7 @@ from common.models import InvenTreeSetting
 | 
			
		||||
from common.views import FileManagementAjaxView, FileManagementFormView
 | 
			
		||||
from company.models import SupplierPart
 | 
			
		||||
from InvenTree.helpers import str2bool, str2int
 | 
			
		||||
from InvenTree.views import (AjaxUpdateView, AjaxView, InvenTreeRoleMixin,
 | 
			
		||||
                             QRCodeView)
 | 
			
		||||
from InvenTree.views import AjaxUpdateView, AjaxView, InvenTreeRoleMixin
 | 
			
		||||
from plugin.views import InvenTreePluginViewMixin
 | 
			
		||||
from stock.models import StockItem, StockLocation
 | 
			
		||||
 | 
			
		||||
@@ -372,22 +371,6 @@ class PartDetailFromIPN(PartDetail):
 | 
			
		||||
        return super(PartDetailFromIPN, self).get(request, *args, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PartQRCode(QRCodeView):
 | 
			
		||||
    """View for displaying a QR code for a Part object."""
 | 
			
		||||
 | 
			
		||||
    ajax_form_title = _("Part QR Code")
 | 
			
		||||
 | 
			
		||||
    role_required = 'part.view'
 | 
			
		||||
 | 
			
		||||
    def get_qr_data(self):
 | 
			
		||||
        """Generate QR code data for the Part."""
 | 
			
		||||
        try:
 | 
			
		||||
            part = Part.objects.get(id=self.pk)
 | 
			
		||||
            return part.format_barcode()
 | 
			
		||||
        except Part.DoesNotExist:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PartImageSelect(AjaxUpdateView):
 | 
			
		||||
    """View for selecting Part image from existing images."""
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user