From 2fa284d37bcb97aca87162807e0abe6e6b369cc3 Mon Sep 17 00:00:00 2001 From: eeintech Date: Fri, 4 Sep 2020 17:20:17 -0500 Subject: [PATCH] Added PartDetailFromIPN view (subclass of PartDetail) and url pattern --- InvenTree/part/urls.py | 4 +++- InvenTree/part/views.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index 7d5c279e75..037c792480 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -99,8 +99,10 @@ part_urls = [ # Export data for multiple parts url(r'^export/', views.PartExport.as_view(), name='part-export'), - # Individual part + # Individual part using pk url(r'^(?P\d+)/', include(part_detail_urls)), + # Individual part using IPN as slug + url(r'^(?P[-\w]+)/', views.PartDetailFromIPN.as_view(), name='part-detail-from-ipn'), # Part category url(r'^category/(?P\d+)/', include(part_category_urls)), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index f2d0089e60..ed6367eba4 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -647,6 +647,41 @@ class PartDetail(DetailView): return context +class PartDetailFromIPN(PartDetail): + slug_field = 'IPN' + slug_url_kwarg = 'slug' + + def get_object(self): + """ Return Part object which IPN field matches the slug value """ + queryset = self.get_queryset() + # Get slug + slug = self.kwargs.get(self.slug_url_kwarg) + + if slug is not None: + slug_field = self.get_slug_field() + # Filter by the slug value + queryset = queryset.filter(**{slug_field: slug}) + + try: + # Get unique part from queryset + part = queryset.get() + # Return Part object + return part + except queryset.model.DoesNotExist: + pass + + return None + + def get(self, request, *args, **kwargs): + """ Attempt to match slug to a Part, else redirect to PartIndex view """ + self.object = self.get_object() + + if not self.object: + return HttpResponseRedirect(reverse('part-index')) + + return super(PartDetailFromIPN, self).get(request, *args, **kwargs) + + class PartQRCode(QRCodeView): """ View for displaying a QR code for a Part object """