[FR] Move URL endpoints to API namespace (#4163)

* Move endpoints
[FR] Move download URL endpoints to API namespace
Fixes #3927

* rename endpoint ref name and update js

* update endpoint name and js

* rename endpoint and fix js

* add docstring
This commit is contained in:
Matthias Mair 2023-01-07 13:23:38 +01:00 committed by GitHub
parent 942086741e
commit 0e96654b6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 22 additions and 18 deletions

View File

@ -36,6 +36,7 @@ from plugin.serializers import MetadataSerializer
from stock.models import StockItem, StockLocation
from . import serializers as part_serializers
from . import views
from .models import (BomItem, BomItemSubstitute, Part, PartAttachment,
PartCategory, PartCategoryParameterTemplate,
PartInternalPriceBreak, PartParameter,
@ -2196,6 +2197,9 @@ part_api_urls = [
re_path(r'^(?P<pk>\d+)/?', PartThumbsUpdate.as_view(), name='api-part-thumbs-update'),
])),
# BOM template
re_path(r'^bom_template/?', views.BomUploadTemplate.as_view(), name='api-bom-upload-template'),
re_path(r'^(?P<pk>\d+)/', include([
# Endpoint for extra serial number information
@ -2218,6 +2222,15 @@ part_api_urls = [
# Part pricing
re_path(r'^pricing/', PartPricingDetail.as_view(), name='api-part-pricing'),
# 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'),
# Part detail endpoint
re_path(r'^.*$', PartDetail.as_view(), name='api-part-detail'),
])),

View File

@ -441,7 +441,7 @@
{% if barcodes %}
$("#show-qr-code").click(function() {
launchModalForm(
"{% url 'part-qr' part.id %}",
"{% url 'api-part-qr' part.id %}",
{
no_post: true,
}

View File

@ -23,11 +23,11 @@ class BomExportTest(InvenTreeTestCase):
"""Perform test setup functions"""
super().setUp()
self.url = reverse('bom-download', kwargs={'pk': 100})
self.url = reverse('api-bom-download', kwargs={'pk': 100})
def test_bom_template(self):
"""Test that the BOM template can be downloaded from the server."""
url = reverse('bom-upload-template')
url = reverse('api-bom-upload-template')
# Download an XLS template
response = self.client.get(url, data={'format': 'xls'})

View File

@ -110,7 +110,7 @@ class PartDetailTest(PartViewTestCase):
def test_bom_download(self):
"""Test downloading a BOM for a valid part."""
response = self.client.get(reverse('bom-download', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
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))
@ -120,12 +120,12 @@ class PartQRTest(PartViewTestCase):
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('part-qr', args=(1,)))
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('part-qr', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
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)
@ -135,6 +135,6 @@ class PartQRTest(PartViewTestCase):
def test_invalid_part(self):
"""Test response for an invalid Part ID value"""
response = self.client.get(reverse('part-qr', args=(9999,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
response = self.client.get(reverse('api-part-qr', args=(9999,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(response.status_code, 200)

View File

@ -11,14 +11,8 @@ from django.urls import include, re_path
from . import views
part_detail_urls = [
re_path(r'^bom-download/?', views.BomDownload.as_view(), name='bom-download'),
re_path(r'^pricing/', views.PartPricing.as_view(), name='part-pricing'),
re_path(r'^bom-upload/?', views.BomUpload.as_view(), name='upload-bom'),
re_path(r'^qr_code/?', views.PartQRCode.as_view(), name='part-qr'),
# Normal thumbnail with form
re_path(r'^thumb-select/?', views.PartImageSelect.as_view(), name='part-image-select'),
@ -40,9 +34,6 @@ part_urls = [
re_path(r'^import/?', views.PartImportTemplate.as_view(), name='part-template-download'),
re_path(r'^import-api/', views.PartImportAjax.as_view(), name='api-part-import'),
# Download a BOM upload template
re_path(r'^bom_template/?', views.BomUploadTemplate.as_view(), name='bom-upload-template'),
# Individual part using pk
re_path(r'^(?P<pk>\d+)/', include(part_detail_urls)),

View File

@ -293,7 +293,7 @@ function downloadBomTemplate(options={}) {
$(opts.modal).modal('hide');
// Download the file
location.href = `{% url "bom-upload-template" %}?format=${format}`;
location.href = `{% url "api-bom-upload-template" %}?format=${format}`;
}
});
@ -373,7 +373,7 @@ function exportBom(part_id, options={}) {
'pricing_data',
];
var url = `/part/${part_id}/bom-download/?`;
var url = `/api/part/${part_id}/bom-download/?`;
field_names.forEach(function(fn) {
var val = getFormFieldValue(fn, fields[fn], opts);