mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 20:16:44 +00:00
commit
ba72ced00c
@ -23,7 +23,10 @@ def DownloadFile(data, filename, content_type='application/text'):
|
|||||||
|
|
||||||
filename = WrapWithQuotes(filename)
|
filename = WrapWithQuotes(filename)
|
||||||
|
|
||||||
wrapper = FileWrapper(io.StringIO(data))
|
if type(data) == str:
|
||||||
|
wrapper = FileWrapper(io.StringIO(data))
|
||||||
|
else:
|
||||||
|
wrapper = FileWrapper(io.BytesIO(data))
|
||||||
|
|
||||||
response = StreamingHttpResponse(wrapper, content_type=content_type)
|
response = StreamingHttpResponse(wrapper, content_type=content_type)
|
||||||
response['Content-Length'] = len(data)
|
response['Content-Length'] = len(data)
|
||||||
|
@ -57,7 +57,6 @@ INSTALLED_APPS = [
|
|||||||
# Third part add-ons
|
# Third part add-ons
|
||||||
'django_filters',
|
'django_filters',
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
'simple_history',
|
|
||||||
'crispy_forms',
|
'crispy_forms',
|
||||||
'import_export',
|
'import_export',
|
||||||
'django_cleanup',
|
'django_cleanup',
|
||||||
@ -72,7 +71,6 @@ MIDDLEWARE = [
|
|||||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
'simple_history.middleware.HistoryRequestMiddleware',
|
|
||||||
'InvenTree.middleware.AuthRequiredMiddleware'
|
'InvenTree.middleware.AuthRequiredMiddleware'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ class PartAdmin(ImportExportModelAdmin):
|
|||||||
list_display = ('name', 'IPN', 'description', 'total_stock', 'category')
|
list_display = ('name', 'IPN', 'description', 'total_stock', 'category')
|
||||||
|
|
||||||
|
|
||||||
class PartCategoryAdmin(admin.ModelAdmin):
|
class PartCategoryAdmin(ImportExportModelAdmin):
|
||||||
|
|
||||||
list_display = ('name', 'pathstring', 'description')
|
list_display = ('name', 'pathstring', 'description')
|
||||||
|
|
||||||
|
@ -87,13 +87,12 @@ class PartList(generics.ListCreateAPIView):
|
|||||||
childs = category.getUniqueChildren()
|
childs = category.getUniqueChildren()
|
||||||
for child in childs:
|
for child in childs:
|
||||||
# Ignore the top-level category (already filtered)
|
# Ignore the top-level category (already filtered)
|
||||||
if child == cat_id:
|
if str(child) == str(cat_id):
|
||||||
continue
|
continue
|
||||||
flt |= Q(category=child)
|
flt |= Q(category=child)
|
||||||
|
|
||||||
parts_list = parts_list.filter(flt)
|
parts_list = parts_list.filter(flt)
|
||||||
|
|
||||||
# Default - return all parts
|
|
||||||
return parts_list
|
return parts_list
|
||||||
|
|
||||||
permission_classes = [
|
permission_classes = [
|
||||||
|
@ -25,74 +25,82 @@
|
|||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<table class='table table-striped'>
|
<div class='row'>
|
||||||
<tr>
|
<div class='col-sm-6'>
|
||||||
<td>Part name</td>
|
<table class='table table-striped'>
|
||||||
<td>{{ part.name }}</td>
|
<tr>
|
||||||
</tr>
|
<td>Part name</td>
|
||||||
<tr>
|
<td>{{ part.name }}</td>
|
||||||
<td>Description</td>
|
</tr>
|
||||||
<td>{{ part.description }}</td>
|
<tr>
|
||||||
</tr>
|
<td>Description</td>
|
||||||
{% if part.IPN %}
|
<td>{{ part.description }}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td>IPN</td>
|
{% if part.IPN %}
|
||||||
<td>{{ part.IPN }}</td>
|
<tr>
|
||||||
</tr>
|
<td>IPN</td>
|
||||||
{% endif %}
|
<td>{{ part.IPN }}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td>Category</td>
|
{% endif %}
|
||||||
<td>
|
<tr>
|
||||||
{% if part.category %}
|
<td>Category</td>
|
||||||
<a href="{% url 'category-detail' part.category.id %}">{{ part.category.pathstring }}</a>
|
<td>
|
||||||
{% endif %}
|
{% if part.category %}
|
||||||
</td>
|
<a href="{% url 'category-detail' part.category.id %}">{{ part.category.pathstring }}</a>
|
||||||
</tr>
|
{% endif %}
|
||||||
{% if part.default_location %}
|
</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td>Default Location</td>
|
{% if part.default_location %}
|
||||||
<td><a href="{% url 'stock-location-detail' part.default_location.id %}">{{ part.default_location.pathstring }}</a></td>
|
<tr>
|
||||||
</tr>
|
<td>Default Location</td>
|
||||||
{% endif %}
|
<td><a href="{% url 'stock-location-detail' part.default_location.id %}">{{ part.default_location.pathstring }}</a></td>
|
||||||
{% if part.default_supplier %}
|
</tr>
|
||||||
<tr>
|
{% endif %}
|
||||||
<td>Default Supplier</td>
|
{% if part.default_supplier %}
|
||||||
<td><a href="{% url 'supplier-part-detail' part.default_supplier.id %}">
|
<tr>
|
||||||
{{ part.default_supplier.supplier.name }} | {{ part.default_supplier.SKU }}
|
<td>Default Supplier</td>
|
||||||
</a></td>
|
<td><a href="{% url 'supplier-part-detail' part.default_supplier.id %}">
|
||||||
</tr>
|
{{ part.default_supplier.supplier.name }} | {{ part.default_supplier.SKU }}
|
||||||
{% endif %}
|
</a></td>
|
||||||
<tr>
|
</tr>
|
||||||
<td>Units</td>
|
{% endif %}
|
||||||
<td>{{ part.units }}</td>
|
<tr>
|
||||||
</tr>
|
<td>Units</td>
|
||||||
<tr>
|
<td>{{ part.units }}</td>
|
||||||
<td>Buildable</td>
|
</tr>
|
||||||
<td>{% include "yesnolabel.html" with value=part.buildable %}</td>
|
</table>
|
||||||
</tr>
|
</div>
|
||||||
<tr>
|
<div class='col-sm-6'>
|
||||||
<td>Consumable</td>
|
<table class='table table-striped'>
|
||||||
<td>{% include "yesnolabel.html" with value=part.consumable %}</td>
|
<tr>
|
||||||
</tr>
|
<td>Buildable</td>
|
||||||
<tr>
|
<td>{% include "yesnolabel.html" with value=part.buildable %}</td>
|
||||||
<td>Trackable</td>
|
</tr>
|
||||||
<td>{% include "yesnolabel.html" with value=part.trackable %}</td>
|
<tr>
|
||||||
</tr>
|
<td>Consumable</td>
|
||||||
<tr>
|
<td>{% include "yesnolabel.html" with value=part.consumable %}</td>
|
||||||
<td>Purchaseable</td>
|
</tr>
|
||||||
<td>{% include "yesnolabel.html" with value=part.purchaseable %}</td>
|
<tr>
|
||||||
</tr>
|
<td>Trackable</td>
|
||||||
<tr>
|
<td>{% include "yesnolabel.html" with value=part.trackable %}</td>
|
||||||
<td>Salable</td>
|
</tr>
|
||||||
<td>{% include "yesnolabel.html" with value=part.salable %}</td>
|
<tr>
|
||||||
</tr>
|
<td>Purchaseable</td>
|
||||||
{% if part.minimum_stock > 0 %}
|
<td>{% include "yesnolabel.html" with value=part.purchaseable %}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td>Minimum Stock</td>
|
<tr>
|
||||||
<td>{{ part.minimum_stock }}</td>
|
<td>Salable</td>
|
||||||
</tr>
|
<td>{% include "yesnolabel.html" with value=part.salable %}</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</table>
|
{% if part.minimum_stock > 0 %}
|
||||||
|
<tr>
|
||||||
|
<td>Minimum Stock</td>
|
||||||
|
<td>{{ part.minimum_stock }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if part.notes %}
|
{% if part.notes %}
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 98 KiB |
@ -21,7 +21,10 @@ function downloadBom(options = {}) {
|
|||||||
<div class='controls'>
|
<div class='controls'>
|
||||||
<select id='bom-format' class='select'>
|
<select id='bom-format' class='select'>
|
||||||
<option value='csv'>CSV</option>
|
<option value='csv'>CSV</option>
|
||||||
<option value='xls'>XLSX</option>
|
<option value='tsv'>TSV</option>
|
||||||
|
<option value='xls'>XLS</option>
|
||||||
|
<option value='xlsx'>XLSX</option>
|
||||||
|
<option value='ods'>ODS</option>
|
||||||
<option value='yaml'>YAML</option>
|
<option value='yaml'>YAML</option>
|
||||||
<option value='json'>JSON</option>
|
<option value='json'>JSON</option>
|
||||||
<option value='xml'>XML</option>
|
<option value='xml'>XML</option>
|
||||||
@ -72,20 +75,15 @@ function loadBomTable(table, options) {
|
|||||||
field: 'pk',
|
field: 'pk',
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
visible: false,
|
visible: false,
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
checkbox: true,
|
||||||
|
title: 'Select',
|
||||||
|
searchable: false,
|
||||||
|
sortable: false,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
if (options.editable) {
|
|
||||||
cols.push({
|
|
||||||
formatter: function(value, row, index, field) {
|
|
||||||
var bEdit = "<button class='btn btn-success bom-edit-button btn-sm' type='button' url='" + row.url + "edit'>Edit</button>";
|
|
||||||
var bDelt = "<button class='btn btn-danger bom-delete-button btn-sm' type='button' url='" + row.url + "delete'>Delete</button>";
|
|
||||||
|
|
||||||
return "<div class='btn-group'>" + bEdit + bDelt + "</div>";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Part column
|
// Part column
|
||||||
cols.push(
|
cols.push(
|
||||||
{
|
{
|
||||||
@ -126,8 +124,17 @@ function loadBomTable(table, options) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// If we are NOT editing, display the available stock
|
if (options.editable) {
|
||||||
if (!options.editable) {
|
cols.push({
|
||||||
|
formatter: function(value, row, index, field) {
|
||||||
|
var bEdit = "<button class='btn btn-success bom-edit-button btn-sm' type='button' url='" + row.url + "edit'>Edit</button>";
|
||||||
|
var bDelt = "<button class='btn btn-danger bom-delete-button btn-sm' type='button' url='" + row.url + "delete'>Delete</button>";
|
||||||
|
|
||||||
|
return "<div class='btn-group'>" + bEdit + bDelt + "</div>";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
cols.push(
|
cols.push(
|
||||||
{
|
{
|
||||||
field: 'sub_part.available_stock',
|
field: 'sub_part.available_stock',
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from simple_history.admin import SimpleHistoryAdmin
|
from import_export.admin import ImportExportModelAdmin
|
||||||
|
|
||||||
from .models import StockLocation, StockItem
|
from .models import StockLocation, StockItem
|
||||||
from .models import StockItemTracking
|
from .models import StockItemTracking
|
||||||
|
|
||||||
|
|
||||||
class LocationAdmin(admin.ModelAdmin):
|
class LocationAdmin(ImportExportModelAdmin):
|
||||||
list_display = ('name', 'pathstring', 'description')
|
list_display = ('name', 'pathstring', 'description')
|
||||||
|
|
||||||
|
|
||||||
class StockItemAdmin(SimpleHistoryAdmin):
|
class StockItemAdmin(ImportExportModelAdmin):
|
||||||
list_display = ('part', 'quantity', 'location', 'status', 'updated')
|
list_display = ('part', 'quantity', 'location', 'status', 'updated')
|
||||||
|
|
||||||
|
|
||||||
class StockTrackingAdmin(admin.ModelAdmin):
|
class StockTrackingAdmin(ImportExportModelAdmin):
|
||||||
list_display = ('item', 'date', 'title')
|
list_display = ('item', 'date', 'title')
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
|||||||
from django_filters import NumberFilter
|
from django_filters import NumberFilter
|
||||||
|
|
||||||
from django.conf.urls import url, include
|
from django.conf.urls import url, include
|
||||||
|
from django.db.models import Q
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
|
||||||
from .models import StockLocation, StockItem
|
from .models import StockLocation, StockItem
|
||||||
from .models import StockItemTracking
|
from .models import StockItemTracking
|
||||||
@ -202,7 +204,36 @@ class StockList(generics.ListCreateAPIView):
|
|||||||
Create a new StockItem
|
Create a new StockItem
|
||||||
"""
|
"""
|
||||||
|
|
||||||
queryset = StockItem.objects.all()
|
def get_queryset(self):
|
||||||
|
"""
|
||||||
|
If the query includes a particular location,
|
||||||
|
we may wish to also request stock items from all child locations.
|
||||||
|
This is set by the optional param 'include_child_categories'
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Does the client wish to filter by category?
|
||||||
|
loc_id = self.request.query_params.get('location', None)
|
||||||
|
|
||||||
|
# Start with all objects
|
||||||
|
stock_list = StockItem.objects.all()
|
||||||
|
|
||||||
|
if loc_id:
|
||||||
|
location = get_object_or_404(StockLocation, pk=loc_id)
|
||||||
|
|
||||||
|
# Filter by the supplied category
|
||||||
|
flt = Q(location=loc_id)
|
||||||
|
|
||||||
|
if self.request.query_params.get('include_child_locations', None):
|
||||||
|
childs = location.getUniqueChildren()
|
||||||
|
for child in childs:
|
||||||
|
# Ignore the top-level category (already filtered!)
|
||||||
|
if str(child) == str(loc_id):
|
||||||
|
continue
|
||||||
|
flt |= Q(location=child)
|
||||||
|
|
||||||
|
stock_list = stock_list.filter(flt)
|
||||||
|
|
||||||
|
return stock_list
|
||||||
|
|
||||||
serializer_class = StockItemSerializer
|
serializer_class = StockItemSerializer
|
||||||
|
|
||||||
@ -219,7 +250,6 @@ class StockList(generics.ListCreateAPIView):
|
|||||||
filter_fields = [
|
filter_fields = [
|
||||||
'part',
|
'part',
|
||||||
'uuid',
|
'uuid',
|
||||||
'location',
|
|
||||||
'supplier_part',
|
'supplier_part',
|
||||||
'customer',
|
'customer',
|
||||||
'belongs_to',
|
'belongs_to',
|
||||||
|
@ -160,7 +160,8 @@
|
|||||||
loadStockTable($("#stock-table"), {
|
loadStockTable($("#stock-table"), {
|
||||||
params: {
|
params: {
|
||||||
{% if location %}
|
{% if location %}
|
||||||
location: {{ location.id }}
|
location: {{ location.id }},
|
||||||
|
include_child_locations: true,
|
||||||
{% endif %}
|
{% endif %}
|
||||||
},
|
},
|
||||||
url: "{% url 'api-stock-list' %}",
|
url: "{% url 'api-stock-list' %}",
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<nav class="navbar navbar-default navbar-fixed-top">
|
<nav class="navbar navbar-default navbar-fixed-top">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="navbar-header clearfix content-heading">
|
<div class="navbar-header clearfix content-heading">
|
||||||
<a class="navbar-brand" id='logo' href="{% url 'index' %}"><img src="{% static 'img/inventree.png' %}" width="40" height="40"/></a>
|
<a class="navbar-brand" id='logo' href="{% url 'index' %}" style="padding-top: 7px; padding-bottom: 5px;"><img src="{% static 'img/inventree.png' %}" width="40" height="40" style="display:block; margin: auto;"/></a>
|
||||||
</div>
|
</div>
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li><a href="{% url 'part-index' %}">Parts</a></li>
|
<li><a href="{% url 'part-index' %}">Parts</a></li>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
sodipodi:docname="inventree.svg"
|
sodipodi:docname="inventree.svg"
|
||||||
inkscape:version="0.91 r13725"
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg2"
|
id="svg2"
|
||||||
viewBox="0 0 400 400.00001"
|
viewBox="0 0 400 400.00001"
|
||||||
@ -21,16 +21,16 @@
|
|||||||
inkscape:export-ydpi="115.2">
|
inkscape:export-ydpi="115.2">
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:window-y="24"
|
inkscape:window-y="0"
|
||||||
inkscape:window-x="65"
|
inkscape:window-x="-8"
|
||||||
inkscape:window-height="1056"
|
inkscape:window-height="1137"
|
||||||
inkscape:window-width="1855"
|
inkscape:window-width="1920"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:cy="237.03857"
|
inkscape:cy="521.06718"
|
||||||
inkscape:cx="195.55918"
|
inkscape:cx="-180.35636"
|
||||||
inkscape:zoom="1.4"
|
inkscape:zoom="0.35"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
@ -90,7 +90,7 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@ -158,14 +158,14 @@
|
|||||||
inkscape:export-ydpi="299.91324" />
|
inkscape:export-ydpi="299.91324" />
|
||||||
<g
|
<g
|
||||||
id="text4273"
|
id="text4273"
|
||||||
style="font-style:normal;font-weight:normal;font-size:217.54554749px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:0.76999996;fill:#ffeeaa;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
style="font-style:normal;font-weight:normal;font-size:217.54554749px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:0.76999996;fill:#335d88;fill-opacity:1;stroke:#ede3d8;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
transform="matrix(1.1055685,0.12077953,0.13042915,-1.1045144,260.24897,1649.2316)"
|
transform="matrix(1.1055685,0.12077953,0.13042915,-1.1045144,260.24897,1649.2316)"
|
||||||
inkscape:export-xdpi="299.91324"
|
inkscape:export-xdpi="299.91324"
|
||||||
inkscape:export-ydpi="299.91324">
|
inkscape:export-ydpi="299.91324">
|
||||||
<path
|
<path
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4577"
|
id="path4577"
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:217.55203247px;line-height:125%;font-family:Brussels;-inkscape-font-specification:'Brussels, Light';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffeeaa;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"
|
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:217.55203247px;line-height:125%;font-family:Brussels;-inkscape-font-specification:'Brussels, Light';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#335d88;fill-opacity:1;stroke:#ede3d8;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
d="m -117.40075,599.71964 c 5.27286,1.59179 8.93096,3.72644 11.01731,6.40882 2.16744,2.68089 3.19894,6.45951 3.10336,11.34732 0,0 -1.08272,55.36631 -1.08272,55.36631 -0.21906,11.20195 -7.38435,16.55674 -21.8761,16.0485 0,0 -2.92196,-0.10247 -2.92196,-0.10247 0,0 -0.15971,8.03102 -0.15971,8.03102 0,0 39.16281,5.47451 39.16281,5.47451 0,0 12.568242,0.24647 12.568242,0.24647 0,0 1.566329,-81.64215 1.566329,-81.64215 0.09195,-4.79265 1.142855,-8.19902 3.144966,-10.21177 1.990467,-1.93135 5.341631,-2.94441 10.01779,-3.04567 0,0 8.490412,-0.0219 8.490412,-0.0219 0,0 0.13793,-7.29971 0.13793,-7.29971 0,0 -72.942109,-11.42831 -72.942109,-11.42831 0,0 -0.15928,8.00932 -0.15928,8.00932 0,0 9.93273,2.8197 9.93273,2.8197 0,0 0,0 0,0 m 26.057646,150.04813 c 4.860402,-0.19831 8.905931,-1.73322 12.161092,-4.58865 3.313681,-2.83452 4.997535,-6.2059 5.072638,-10.13186 0.07509,-3.92554 -1.480873,-7.22278 -4.687942,-9.90881 -3.147235,-2.70919 -7.135665,-4.06169 -11.990765,-4.04062 -5.005803,0.0217 -9.283919,1.44206 -12.809479,4.27943 -3.55676,2.86247 -5.38718,6.35506 -5.46763,10.45908 -0.0805,4.10447 1.61494,7.51856 5.06366,10.22424 3.41899,2.68235 7.647131,3.91166 12.658426,3.70719 0,0 0,0 0,0" />
|
d="m -117.40075,599.71964 c 5.27286,1.59179 8.93096,3.72644 11.01731,6.40882 2.16744,2.68089 3.19894,6.45951 3.10336,11.34732 0,0 -1.08272,55.36631 -1.08272,55.36631 -0.21906,11.20195 -7.38435,16.55674 -21.8761,16.0485 0,0 -2.92196,-0.10247 -2.92196,-0.10247 0,0 -0.15971,8.03102 -0.15971,8.03102 0,0 39.16281,5.47451 39.16281,5.47451 0,0 12.568242,0.24647 12.568242,0.24647 0,0 1.566329,-81.64215 1.566329,-81.64215 0.09195,-4.79265 1.142855,-8.19902 3.144966,-10.21177 1.990467,-1.93135 5.341631,-2.94441 10.01779,-3.04567 0,0 8.490412,-0.0219 8.490412,-0.0219 0,0 0.13793,-7.29971 0.13793,-7.29971 0,0 -72.942109,-11.42831 -72.942109,-11.42831 0,0 -0.15928,8.00932 -0.15928,8.00932 0,0 9.93273,2.8197 9.93273,2.8197 0,0 0,0 0,0 m 26.057646,150.04813 c 4.860402,-0.19831 8.905931,-1.73322 12.161092,-4.58865 3.313681,-2.83452 4.997535,-6.2059 5.072638,-10.13186 0.07509,-3.92554 -1.480873,-7.22278 -4.687942,-9.90881 -3.147235,-2.70919 -7.135665,-4.06169 -11.990765,-4.04062 -5.005803,0.0217 -9.283919,1.44206 -12.809479,4.27943 -3.55676,2.86247 -5.38718,6.35506 -5.46763,10.45908 -0.0805,4.10447 1.61494,7.51856 5.06366,10.22424 3.41899,2.68235 7.647131,3.91166 12.658426,3.70719 0,0 0,0 0,0" />
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
@ -3,7 +3,6 @@ psycopg2>=2.8.1
|
|||||||
pillow>=5.0.0
|
pillow>=5.0.0
|
||||||
djangorestframework>=3.6.2
|
djangorestframework>=3.6.2
|
||||||
django_filter>=1.0.2
|
django_filter>=1.0.2
|
||||||
django-simple-history>=1.8.2
|
|
||||||
coreapi>=2.3.0
|
coreapi>=2.3.0
|
||||||
pygments>=2.2.0
|
pygments>=2.2.0
|
||||||
tablib>=0.13.0
|
tablib>=0.13.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user