From f0ffb0f8c06a989704f4fedc8ef5ca8d80c43705 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 11 Apr 2020 19:59:16 +1000 Subject: [PATCH] Ability to include part_detail in build API - Build list now uses bootstrapTable --- .../static/script/inventree/build.js | 14 ++++ .../static/script/inventree/filters.js | 4 +- InvenTree/build/api.py | 13 ++++ InvenTree/build/serializers.py | 12 ++++ .../build/templates/build/build_list.html | 38 ----------- InvenTree/build/templates/build/index.html | 65 ++++++------------- 6 files changed, 61 insertions(+), 85 deletions(-) delete mode 100644 InvenTree/build/templates/build/build_list.html diff --git a/InvenTree/InvenTree/static/script/inventree/build.js b/InvenTree/InvenTree/static/script/inventree/build.js index 5ed035be86..03c33f7b57 100644 --- a/InvenTree/InvenTree/static/script/inventree/build.js +++ b/InvenTree/InvenTree/static/script/inventree/build.js @@ -8,6 +8,8 @@ function loadBuildTable(table, options) { filters[key] = params[key]; } + setupFilterList("build", table); + table.inventreeTable({ method: 'get', formatNoMatches: function() { @@ -26,14 +28,26 @@ function loadBuildTable(table, options) { { field: 'title', title: 'Build', + sortable: true, + formatter: function(value, row, index, field) { + return renderLink(value, '/build/' + row.pk + '/'); + } }, { field: 'part', title: 'Part', + sortable: true, + formatter: function(value, row, index, field) { + + var name = row.part_detail.full_name; + + return imageHoverIcon(row.part_detail.thumbnail) + renderLink(name, '/part/' + row.part + '/'); + } }, { field: 'quantity', title: 'Quantity', + sortable: true, }, { field: 'status_text', diff --git a/InvenTree/InvenTree/static/script/inventree/filters.js b/InvenTree/InvenTree/static/script/inventree/filters.js index b543df4730..de9f987911 100644 --- a/InvenTree/InvenTree/static/script/inventree/filters.js +++ b/InvenTree/InvenTree/static/script/inventree/filters.js @@ -238,8 +238,8 @@ function setupFilterList(tableKey, table, target) { var addClicked = false; - if (!target || target.length == 0) { - target = '#filter-list-" + tableKey'; + if (target == null || target.length == 0) { + target = `#filter-list-${tableKey}`; } var tag = `filter-tag-${tableKey}`; diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index dc6e484ec0..3be81f7b59 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -11,6 +11,8 @@ from rest_framework import generics, permissions from django.conf.urls import url, include +from InvenTree.helpers import str2bool + from .models import Build, BuildItem from .serializers import BuildSerializer, BuildItemSerializer @@ -39,6 +41,17 @@ class BuildList(generics.ListCreateAPIView): 'part', ] + def get_serializer(self, *args, **kwargs): + + try: + part_detail = str2bool(self.request.GET.get('part_detail', None)) + except AttributeError: + part_detail = None + + kwargs['part_detail'] = part_detail + + return self.serializer_class(*args, **kwargs) + class BuildDetail(generics.RetrieveUpdateAPIView): """ API endpoint for detail view of a Build object """ diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index 3eb3aee5be..19073d1e2d 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -10,6 +10,7 @@ from InvenTree.serializers import InvenTreeModelSerializer from stock.serializers import StockItemSerializerBrief from .models import Build, BuildItem +from part.serializers import PartBriefSerializer class BuildSerializer(InvenTreeModelSerializer): @@ -18,6 +19,16 @@ class BuildSerializer(InvenTreeModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) status_text = serializers.CharField(source='get_status_display', read_only=True) + part_detail = PartBriefSerializer(source='part', many=False, read_only=True) + + def __init__(self, *args, **kwargs): + part_detail = kwargs.pop('part_detail', False) + + super().__init__(*args, **kwargs) + + if part_detail is not True: + self.fields.pop('part_detail') + class Meta: model = Build fields = [ @@ -27,6 +38,7 @@ class BuildSerializer(InvenTreeModelSerializer): 'creation_date', 'completion_date', 'part', + 'part_detail', 'quantity', 'status', 'status_text', diff --git a/InvenTree/build/templates/build/build_list.html b/InvenTree/build/templates/build/build_list.html deleted file mode 100644 index 6b04ee6c8e..0000000000 --- a/InvenTree/build/templates/build/build_list.html +++ /dev/null @@ -1,38 +0,0 @@ -{% extends "collapse.html" %} - -{% block collapse_title %} -{{ title }} - {{ builds | length }} -{% endblock %} - -{% block collapse_content %} - - - - - - - - {% if completed %} - - {% else %} - - {% endif %} - - - -{% for build in builds %} - - - - - - {% else %} - - {% endif %} - -{% endfor %} - -
BuildPartQuantityStatusCompletedCreated
{{ build.title }}{{ build.part.full_name }}{{ build.quantity }}{% include "build_status.html" with build=build %} - {% if completed %} - {{ build.completion_date }}{{ build.completed_by.username }}{{ build.creation_date }}
-{% endblock %} \ No newline at end of file diff --git a/InvenTree/build/templates/build/index.html b/InvenTree/build/templates/build/index.html index bd20717f5f..9edfecfc45 100644 --- a/InvenTree/build/templates/build/index.html +++ b/InvenTree/build/templates/build/index.html @@ -13,25 +13,24 @@ InvenTree | Build List

Part Builds

-
-
- + +
+ +
+ +
+
+ +
+
-
- - +
-{% include "build/build_list.html" with builds=active title="Active Builds" completed=False collapse_id='active' %} - -{% include "build/build_list.html" with builds=completed completed=True title="Completed Builds" collapse_id="complete" %} - -{% include "build/build_list.html" with builds=cancelled title="Cancelled Builds" completed=False collapse_id="cancelled" %} - {% endblock %} {% block js_ready %} @@ -41,42 +40,18 @@ InvenTree | Build List $("#new-build").click(function() { launchModalForm( - "{% url 'build-create' %}", - { - follow: true - }); + "{% url 'build-create' %}", + { + follow: true + } + ); }); loadBuildTable($("#build-table"), { - url: "{% url 'api-build-list' %}" - }); - - $(".build-table").inventreeTable({ - formatNoMatches: function() { return 'No builds found'; }, - columns: [ - { - field: 'name', - title: 'Build', - sortable: true, - }, - { - field: 'part', - title: 'Part', - sortable: true, - }, - { - title: 'Quantity', - sortable: true, - searchable: false - }, - { - title: 'Status', - sortable: true, - }, - { - sortable: true, - }, - ] + url: "{% url 'api-build-list' %}", + params: { + part_detail: "true", + }, }); {% endblock %} \ No newline at end of file