Merge branch 'api'

This commit is contained in:
Oliver 2018-05-05 01:27:24 +10:00
commit 24ece1b916
8 changed files with 166 additions and 8 deletions

View File

@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from rest_framework import serializers
from rest_framework import generics
from rest_framework import mixins
class DraftRUDView(generics.RetrieveAPIView, generics.UpdateAPIView, generics.DestroyAPIView):
def perform_update(self, serializer):
ctx_data = serializer._context['request'].data
if ctx_data.get('_is_final', False) in [True, u'true', u'True', 1]:
super(generics.UpdateAPIView, self).perform_update(serializer)
else:
pass

View File

@ -92,7 +92,8 @@ TEMPLATES = [
] ]
REST_FRAMEWORK = { REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'InvenTree.utils.api_exception_handler', 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
# 'EXCEPTION_HANDLER': 'InvenTree.utils.api_exception_handler',
# 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 'PAGE_SIZE': 50, # 'PAGE_SIZE': 50,
} }

View File

@ -3,17 +3,19 @@ from __future__ import unicode_literals
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters from rest_framework import filters
from rest_framework import generics, permissions from rest_framework import generics, permissions, mixins
from django.conf.urls import url from django.conf.urls import url, include
from .models import Part, PartCategory, BomItem from .models import Part, PartCategory, BomItem
from .models import SupplierPart from .models import SupplierPart
from .serializers import PartSerializer, BomItemSerializer from .serializers import PartSerializer, BomItemSerializer
from .serializers import SupplierPartSerializer from .serializers import SupplierPartSerializer
from .serializers import CategorySerializer
from InvenTree.views import TreeSerializer from InvenTree.views import TreeSerializer
from InvenTree.serializers import DraftRUDView
class PartCategoryTree(TreeSerializer): class PartCategoryTree(TreeSerializer):
@ -21,6 +23,44 @@ class PartCategoryTree(TreeSerializer):
model = PartCategory model = PartCategory
class CategoryList(generics.ListCreateAPIView):
queryset = PartCategory.objects.all()
serializer_class = CategorySerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
filter_backends = [
DjangoFilterBackend,
#filters.SearchFilter,
filters.OrderingFilter,
]
filter_fields = [
'parent',
]
ordering_fields = [
'name',
]
ordering = 'name'
search_fields = [
'name',
'description',
]
class PartDetail(DraftRUDView):
queryset = Part.objects.all()
serializer_class = PartSerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
class PartList(generics.ListCreateAPIView): class PartList(generics.ListCreateAPIView):
queryset = Part.objects.all() queryset = Part.objects.all()
@ -93,12 +133,21 @@ class SupplierPartList(generics.ListAPIView):
'supplier' 'supplier'
] ]
cat_api_urls = [
url(r'^$', CategoryList.as_view(), name='api-part-category-list'),
]
part_api_urls = [ part_api_urls = [
url(r'^tree/?', PartCategoryTree.as_view(), name='api-part-tree'), url(r'^tree/?', PartCategoryTree.as_view(), name='api-part-tree'),
url(r'^category/', include(cat_api_urls)),
url(r'^supplier/?', SupplierPartList.as_view(), name='api-part-supplier-list'), url(r'^supplier/?', SupplierPartList.as_view(), name='api-part-supplier-list'),
url(r'^bom/?', BomList.as_view(), name='api-bom-list'), url(r'^bom/?', BomList.as_view(), name='api-bom-list'),
url(r'^(?P<pk>\d+)/', PartDetail.as_view(), name='api-part-detail'),
url(r'^.*$', PartList.as_view(), name='api-part-list'), url(r'^.*$', PartList.as_view(), name='api-part-list'),
] ]

View File

@ -5,7 +5,7 @@ from .models import SupplierPart
from company.serializers import CompanyBriefSerializer from company.serializers import CompanyBriefSerializer
class CategoryBriefSerializer(serializers.ModelSerializer): class CategorySerializer(serializers.ModelSerializer):
url = serializers.CharField(source='get_absolute_url', read_only=True) url = serializers.CharField(source='get_absolute_url', read_only=True)
@ -17,6 +17,7 @@ class CategoryBriefSerializer(serializers.ModelSerializer):
'description', 'description',
'pathstring', 'pathstring',
'url', 'url',
'parent',
] ]
@ -40,7 +41,7 @@ class PartSerializer(serializers.ModelSerializer):
""" """
url = serializers.CharField(source='get_absolute_url', read_only=True) url = serializers.CharField(source='get_absolute_url', read_only=True)
category = CategoryBriefSerializer(many=False, read_only=True) category = CategorySerializer(many=False, read_only=True)
class Meta: class Meta:
model = Part model = Part

View File

@ -0,0 +1,88 @@
var jQuery = window.$;
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function inventreeGet(url, filters={}) {
$.ajax({
url: url,
type: 'GET',
data: filters,
dataType: 'json',
success: function(response) {
console.log('Success GET data at ' + url);
return response;
},
error: function(xhr, ajaxOptions, thrownError) {
console.error('Error on GET at ' + url);
console.error(thrownError);
return {error: thrownError};
}
})
}
function inventreeUpdate(url, data, final=false) {
if (final) {
data["_is_final"] = true;
}
// Middleware token required for data update
//var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
var csrftoken = getCookie('csrftoken');
$.ajax({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader('X-CSRFToken', csrftoken);
},
url: url,
type: 'put',
data: data,
dataType: 'json',
success: function(response, status) {
response['_status_code'] = status;
console.log('UPDATE object to ' + url + ' - result = ' + status);
return response;
},
error: function(xhr, ajaxOptions, thrownError) {
console.error('Error on UPDATE to ' + url);
console.error(thrownError);
return {error: thrownError};
}
})
}
// Return list of parts with optional filters
function getParts(filters={}) {
return inventreeGet('/api/part/', filters);
}
// Return list of part categories with optional filters
function getPartCategories(filters={}) {
return inventreeGet('/api/part/category/', filters);
}
function getStock(filters={}) {
return inventreeGet('/api/stock/', filters);
}
function getStockLocations(filters={}) {
return inventreeGet('/api/stock/location/', filters)
}
function getCompanies(filters={}) {
return inventreeGet('/api/company/', filters);
}

View File

@ -11,14 +11,14 @@ from .serializers import StockItemSerializer, StockQuantitySerializer
from .serializers import LocationSerializer from .serializers import LocationSerializer
from InvenTree.views import TreeSerializer from InvenTree.views import TreeSerializer
from InvenTree.serializers import DraftRUDView
class StockCategoryTree(TreeSerializer): class StockCategoryTree(TreeSerializer):
title = 'Stock' title = 'Stock'
model = StockLocation model = StockLocation
class StockDetail(generics.RetrieveUpdateDestroyAPIView): class StockDetail(DraftRUDView):
""" """
get: get:

View File

@ -56,7 +56,7 @@ class StockItemSerializer(serializers.ModelSerializer):
'stocktake_date', 'stocktake_date',
'stocktake_user', 'stocktake_user',
'updated', 'updated',
'quantity', #'quantity',
] ]

View File

@ -59,6 +59,8 @@
{% endblock %} {% endblock %}
{% block js_load %} {% block js_load %}
{{ block.super }}
<script type='text/javascript' src="{% static 'script/inventree/api.js' %}"></script>
<script type='text/javascript' src="{% static 'script/modal_form.js' %}"></script> <script type='text/javascript' src="{% static 'script/modal_form.js' %}"></script>
{% endblock %} {% endblock %}
{% block js_ready %} {% block js_ready %}