From ca436a99dcec9d4d9771d163f130ad2607b239ab Mon Sep 17 00:00:00 2001 From: Artem Darius Weber Date: Thu, 9 Jan 2025 12:48:23 +0300 Subject: [PATCH 1/2] some --- docker-compose.yml | 2 - inventory/admin.py | 7 +- ...ions_remove_inventory_location_and_more.py | 63 ++ inventory/models.py | 62 +- inventory/urls.py | 2 + inventory/views.py | 29 +- logistic/__init__.py | 0 logistic/admin.py | 3 + logistic/apps.py | 6 + logistic/migrations/__init__.py | 0 logistic/models.py | 3 + logistic/tests.py | 3 + logistic/urls.py | 30 + logistic/views.py | 29 + logs.log | 175 +++ path-generator-main/.dockerignore | 2 + path-generator-main/.gitignore | 2 + path-generator-main/Dockerfile | 12 + path-generator-main/README.md | 5 + path-generator-main/app.js | 24 + path-generator-main/docker-compose.yml | 10 + path-generator-main/package-lock.json | 994 ++++++++++++++++++ path-generator-main/package.json | 15 + path-generator-main/pathGenerator.js | 95 ++ settings/base.py | 1 + urls.py | 1 + 26 files changed, 1566 insertions(+), 9 deletions(-) create mode 100644 inventory/migrations/0004_alter_inventory_options_remove_inventory_location_and_more.py create mode 100644 logistic/__init__.py create mode 100644 logistic/admin.py create mode 100644 logistic/apps.py create mode 100644 logistic/migrations/__init__.py create mode 100644 logistic/models.py create mode 100644 logistic/tests.py create mode 100644 logistic/urls.py create mode 100644 logistic/views.py create mode 100644 path-generator-main/.dockerignore create mode 100644 path-generator-main/.gitignore create mode 100644 path-generator-main/Dockerfile create mode 100644 path-generator-main/README.md create mode 100644 path-generator-main/app.js create mode 100644 path-generator-main/docker-compose.yml create mode 100644 path-generator-main/package-lock.json create mode 100644 path-generator-main/package.json create mode 100644 path-generator-main/pathGenerator.js diff --git a/docker-compose.yml b/docker-compose.yml index ef343a4..dae94c5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: db: image: postgres:15 diff --git a/inventory/admin.py b/inventory/admin.py index 8c38f3f..e902bb3 100644 --- a/inventory/admin.py +++ b/inventory/admin.py @@ -1,3 +1,8 @@ from django.contrib import admin +from .models import Inventory -# Register your models here. +@admin.register(Inventory) +class InventoryAdmin(admin.ModelAdmin): + list_display = ('product', 'warehouse', 'storage_location', 'actual_quantity', 'recorded_quantity', 'difference', 'inventory_date') + search_fields = ('product__name', 'warehouse__name', 'storage_location__name') + list_filter = ('warehouse', 'inventory_date') \ No newline at end of file diff --git a/inventory/migrations/0004_alter_inventory_options_remove_inventory_location_and_more.py b/inventory/migrations/0004_alter_inventory_options_remove_inventory_location_and_more.py new file mode 100644 index 0000000..b58573a --- /dev/null +++ b/inventory/migrations/0004_alter_inventory_options_remove_inventory_location_and_more.py @@ -0,0 +1,63 @@ +# Generated by Django 5.1.4 on 2025-01-09 08:41 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0003_alter_stockoperation_product_alter_inventory_product_and_more'), + ('product_directory', '0001_initial'), + ('warehouse', '0002_warehouse_alter_stock_options_and_more'), + ] + + operations = [ + migrations.AlterModelOptions( + name='inventory', + options={'verbose_name': 'Инвентаризация', 'verbose_name_plural': 'Инвентаризации'}, + ), + migrations.RemoveField( + model_name='inventory', + name='location', + ), + migrations.RemoveField( + model_name='inventory', + name='quantity', + ), + migrations.AddField( + model_name='inventory', + name='actual_quantity', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Фактическое количество'), + ), + migrations.AddField( + model_name='inventory', + name='difference', + field=models.IntegerField(blank=True, default=0, null=True, verbose_name='Разница'), + ), + migrations.AddField( + model_name='inventory', + name='recorded_quantity', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Учтенное количество'), + ), + migrations.AddField( + model_name='inventory', + name='storage_location', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='inventory.storagelocation', verbose_name='Место хранения'), + ), + migrations.AddField( + model_name='inventory', + name='warehouse', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='warehouse.warehouse', verbose_name='Склад'), + ), + migrations.AlterField( + model_name='inventory', + name='inventory_date', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Дата инвентаризации'), + ), + migrations.AlterField( + model_name='inventory', + name='product', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='product_directory.product', verbose_name='Товар'), + ), + ] diff --git a/inventory/models.py b/inventory/models.py index 31563e0..42a6cf7 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -2,6 +2,8 @@ from django.db import models from django.contrib.auth.models import AbstractUser, Permission, Group from product_directory.models import Product +from warehouse.models import Warehouse + # todo: нужно перенести уникальные поля в новую модель @@ -132,10 +134,60 @@ class PriceList(models.Model): class Inventory(models.Model): - product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="Товар") - location = models.ForeignKey(StorageLocation, on_delete=models.CASCADE, verbose_name="Место хранения") - quantity = models.IntegerField(verbose_name="Количество") - inventory_date = models.DateField(verbose_name="Дата инвентаризации") + warehouse = models.ForeignKey( + Warehouse, + on_delete=models.CASCADE, + verbose_name="Склад", + null=True, + blank=True # Разрешить null и пустое значение + ) + storage_location = models.ForeignKey( + StorageLocation, + on_delete=models.CASCADE, + verbose_name="Место хранения", + null=True, + blank=True # Разрешить null и пустое значение + ) + product = models.ForeignKey( + Product, + on_delete=models.CASCADE, + verbose_name="Товар", + null=True, + blank=True # Разрешить null и пустое значение + ) + actual_quantity = models.PositiveIntegerField( + null=True, + blank=True, # Разрешить null и пустое значение + verbose_name="Фактическое количество" + ) + recorded_quantity = models.PositiveIntegerField( + null=True, + blank=True, # Разрешить null и пустое значение + verbose_name="Учтенное количество" + ) + difference = models.IntegerField( + null=True, + blank=True, # Разрешить null и пустое значение + verbose_name="Разница", + default=0 + ) + inventory_date = models.DateTimeField( + auto_now_add=True, + verbose_name="Дата инвентаризации", + null=True, + blank=True # Разрешить null и пустое значение + ) + + class Meta: + verbose_name = "Инвентаризация" + verbose_name_plural = "Инвентаризации" + + def save(self, *args, **kwargs): + if self.actual_quantity is not None and self.recorded_quantity is not None: + self.difference = self.actual_quantity - self.recorded_quantity + else: + self.difference = 0 + super().save(*args, **kwargs) def __str__(self): - return f"Инвентаризация {self.product.name} - {self.location.name}" \ No newline at end of file + return f"{self.product.name if self.product else 'No Product'} ({self.warehouse.name if self.warehouse else 'No Warehouse'}) - {self.difference}" \ No newline at end of file diff --git a/inventory/urls.py b/inventory/urls.py index ed9c461..14efee7 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -7,6 +7,7 @@ from .views import ( ProductViewSet, EmployeeViewSet, PositionViewSet, StorageLocationViewSet, ContractorViewSet, SupplyContractViewSet, TruckViewSet ) +from .views import conduct_inventory # Create the router for inventory-related views router_inventory = DefaultRouter() @@ -36,4 +37,5 @@ urlpatterns = [ path('', include(router_inventory.urls)), path('swagger/', schema_view_inventory.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui-inventory'), path('redoc/', schema_view_inventory.with_ui('redoc', cache_timeout=0), name='schema-redoc-inventory'), + path('inventory//', conduct_inventory, name='conduct_inventory'), ] diff --git a/inventory/views.py b/inventory/views.py index fcc9811..62831f4 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -1,10 +1,37 @@ from rest_framework import viewsets -from .models import Product, Employee, Position, StorageLocation, Contractor, SupplyContract, Truck + +from warehouse.models import Warehouse, Stock +from .models import Product, Employee, Position, StorageLocation, Contractor, SupplyContract, Truck, Inventory +from django.http import JsonResponse +from .models import Inventory from .serializers import ( ProductSerializer, EmployeeSerializer, PositionSerializer, StorageLocationSerializer, ContractorSerializer, SupplyContractSerializer, TruckSerializer ) +def conduct_inventory(request, warehouse_id): + warehouse = Warehouse.objects.get(id=warehouse_id) + stock_items = Stock.objects.filter(location__warehouse=warehouse) + + inventory_results = [] + for stock_item in stock_items: + recorded_quantity = stock_item.quantity + # Симуляция фактического количества (можно заменить на ввод пользователя) + actual_quantity = recorded_quantity - 5 # Пример: уменьшение на 5 для теста + inventory = Inventory.objects.create( + warehouse=warehouse, + storage_location=stock_item.location, + product=stock_item.product, + actual_quantity=actual_quantity, + recorded_quantity=recorded_quantity, + ) + inventory_results.append(inventory) + + return JsonResponse({ + "message": "Инвентаризация завершена", + "results": [str(result) for result in inventory_results], + }) + class ProductViewSet(viewsets.ModelViewSet): queryset = Product.objects.all() serializer_class = ProductSerializer diff --git a/logistic/__init__.py b/logistic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/logistic/admin.py b/logistic/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/logistic/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/logistic/apps.py b/logistic/apps.py new file mode 100644 index 0000000..6c83ecf --- /dev/null +++ b/logistic/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LogisticConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'logistic' diff --git a/logistic/migrations/__init__.py b/logistic/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/logistic/models.py b/logistic/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/logistic/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/logistic/tests.py b/logistic/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/logistic/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/logistic/urls.py b/logistic/urls.py new file mode 100644 index 0000000..d17f943 --- /dev/null +++ b/logistic/urls.py @@ -0,0 +1,30 @@ +from django.urls import path, include +from . import views +from rest_framework.routers import DefaultRouter +from drf_yasg.views import get_schema_view +from drf_yasg import openapi +from rest_framework.permissions import AllowAny + +# Create the router for pricing-related views +router_pricing = DefaultRouter() + +# Register any viewsets with the router (example) +# router_pricing.register(r'example', views.ExampleViewSet) + +# Swagger schema view for pricing +schema_view_pricing = get_schema_view( + openapi.Info( + title="Store Management API - Pricing", + default_version='v1', + description="API for managing pricing in the franchise store", + terms_of_service="https://www.example.com/terms/", + contact=openapi.Contact(email="support@example.com"), + license=openapi.License(name="BSD License"), + ), + public=True, + permission_classes=(AllowAny,), +) + +urlpatterns = [ + path('generate-path/', views.generate_path, name='generate_path'), +] diff --git a/logistic/views.py b/logistic/views.py new file mode 100644 index 0000000..5466707 --- /dev/null +++ b/logistic/views.py @@ -0,0 +1,29 @@ +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +import json +import requests + +@csrf_exempt +def generate_path(request): + if request.method == 'POST': + try: + data = json.loads(request.body) + if 'points' not in data or not isinstance(data['points'], list) or len(data['points']) != 2: + return JsonResponse({'error': 'Invalid input data. "points" must be an array of two objects with x and y.'}, status=400) + + response = requests.post( + 'http://localhost:82/generatePath', + json=data + ) + + if response.status_code == 200: + return JsonResponse(response.json(), safe=False) + else: + return JsonResponse({'error': 'Failed to generate path', 'details': response.text}, status=response.status_code) + + except json.JSONDecodeError: + return JsonResponse({'error': 'Invalid JSON format'}, status=400) + except Exception as e: + return JsonResponse({'error': 'An unexpected error occurred', 'details': str(e)}, status=500) + + return JsonResponse({'error': 'Only POST method is allowed'}, status=405) diff --git a/logs.log b/logs.log index ab8d3d7..4e2998f 100644 --- a/logs.log +++ b/logs.log @@ -731,3 +731,178 @@ django.template.exceptions.TemplateSyntaxError: { + const guard = typeGuard.safeParse(req.body); + if (!guard.success) return res.status(500).send(guard.error); + try { + const result = await generate(guard.data); + console.log(result) + return res.send(result); + } catch (error) { + console.error(error); + return res.status(500).send(); + } +}) + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) \ No newline at end of file diff --git a/path-generator-main/docker-compose.yml b/path-generator-main/docker-compose.yml new file mode 100644 index 0000000..4663b91 --- /dev/null +++ b/path-generator-main/docker-compose.yml @@ -0,0 +1,10 @@ +version: "3.8" + +services: + path-generator: + container_name: path-generator + build: . + ports: + - "82:82" + command: node /app/app.js + restart: unless-stopped diff --git a/path-generator-main/package-lock.json b/path-generator-main/package-lock.json new file mode 100644 index 0000000..c796d5f --- /dev/null +++ b/path-generator-main/package-lock.json @@ -0,0 +1,994 @@ +{ + "name": "pathgenerator", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "pathgenerator", + "version": "0.0.0", + "dependencies": { + "axios": "^1.6.8", + "cors": "^2.8.5", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "zod": "^3.22.4" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dependencies": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==" + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==" + } + } +} diff --git a/path-generator-main/package.json b/path-generator-main/package.json new file mode 100644 index 0000000..71a8e08 --- /dev/null +++ b/path-generator-main/package.json @@ -0,0 +1,15 @@ +{ + "name": "pathgenerator", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "axios": "^1.6.8", + "cors": "^2.8.5", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "zod": "^3.22.4" + } +} diff --git a/path-generator-main/pathGenerator.js b/path-generator-main/pathGenerator.js new file mode 100644 index 0000000..4aa4446 --- /dev/null +++ b/path-generator-main/pathGenerator.js @@ -0,0 +1,95 @@ +const z = require("zod"); +const axios = require('axios'); + +function jb(e) { + return Object.keys(e).map((t => ({ + key: t, + value: (!1 === e[t] ? 'false' : e[t] || '').toString() + }))).sort(((e, t) => e.key < t.key ? -1 : e.key > t.key ? 1 : 0)).map((e => e.value)).join(''); +} + +function wb(e) { + return e.split('?')[0].replace(/^[^/]*\/\/[^/]+\//, '/'); +} + +const _b = [22, 4147, 1234, 11] + , Ib = _b[0] + _b[3] + , Cb = _b[1] + _b[2]; + +function kb(e, t, r, s = '') { + const a = jb(t); + return Ob(wb(e) + a + s + r); +} + +function Ob(e) { + const t = e.length; + let r = Cb; + for (let s = 0; s < t; s += 1) + r = r * Ib + e.charCodeAt(s), + r >>>= 0; + return r; +} + +const getR = (l) => { + const n = 'https://routing.api.2gis.com/carrouting/6.0.0/global'; + const u = 'rurbbn3446'; + const d = 'baf4c54e9dae'; + return kb(n, u, d, JSON.stringify(l)); +}; + +const pointGuard = z.object({ + x: z.number(), + y: z.number(), +}); + + +const typeGuard = z.object({ + points: pointGuard.array().length(2), +}); + + +const generate = async ({points}) => { + const data = { + 'locale': 'ru', + 'point_a_name': 'Source', + 'point_b_name': 'Target', + 'points': points.map(item => ({...item, type: "pedo"})), + 'purpose': 'autoSearch', + 'type': 'online5', + }; + return axios.post( + 'https://routing.api.2gis.com/carrouting/6.0.0/global', + data, + { + params: { + 'key': 'rurbbn3446', + 'r': getR(data) + }, + headers: { + 'authority': 'routing.api.2gis.com', + 'accept-language': 'ru,en;q=0.9', + 'cache-control': 'no-cache', + 'origin': 'https://2gis.ru', + 'pragma': 'no-cache', + 'referer': 'https://2gis.ru/', + 'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "YaBrowser";v="24.1", "Yowser";v="2.5"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'cross-site', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36' + } + } + ).then((response) => response.data.result.map((item) => { + return { + ...item, + path: item.maneuvers[0].outcoming_path.geometry + } + })); +}; + +module.exports = { + typeGuard, + generate +} diff --git a/settings/base.py b/settings/base.py index 04bdeb4..329c199 100644 --- a/settings/base.py +++ b/settings/base.py @@ -61,6 +61,7 @@ INSTALLED_APPS = [ 'product_directory', 'goods_reception', 'pricing', + 'logistic', ] ROOT_URLCONF = 'urls' diff --git a/urls.py b/urls.py index 022f400..439e826 100644 --- a/urls.py +++ b/urls.py @@ -8,4 +8,5 @@ urlpatterns = [ path('api/goods-reception/', include('goods_reception.urls')), path('api/warehouse/', include('warehouse.urls')), path('api/hr/', include('hr.urls')), + path('logistic/', include('logistic.urls')), ] From c9714e27f04543e7a116ba7ff9deb461972a0f72 Mon Sep 17 00:00:00 2001 From: Artem Darius Weber Date: Thu, 9 Jan 2025 12:48:46 +0300 Subject: [PATCH 2/2] some --- .../__pycache__/__init__.cpython-310.pyc | Bin 166 -> 154 bytes inventory/__pycache__/apps.cpython-310.pyc | Bin 451 -> 439 bytes inventory/__pycache__/models.cpython-310.pyc | Bin 6357 -> 7363 bytes .../__pycache__/0001_initial.cpython-310.pyc | Bin 3276 -> 3264 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 177 -> 165 bytes settings/__pycache__/__init__.cpython-310.pyc | Bin 165 -> 153 bytes settings/__pycache__/base.cpython-310.pyc | Bin 1870 -> 1868 bytes settings/__pycache__/dev.cpython-310.pyc | Bin 269 -> 257 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/inventory/__pycache__/__init__.cpython-310.pyc b/inventory/__pycache__/__init__.cpython-310.pyc index cbdfa45bcb1cd89ef15305075b82801257e96227..c625c7fa45eb7be942e85c49637971d2022c3134 100644 GIT binary patch delta 63 zcmZ3+IE#@xpO=@50SI1O*G}ZN(XiDIElw>e)=x<+$}BC`cgasK%}vcKDb`ObO3X{n R$Sh8cFD}V1N}X7(4FFSn6+Zv~ delta 75 zcmbQmxQvlIpO=@50SK-})=lKLG4a&T$j?pHPf0Aw)_2KIF3nBND=F4@&n)pMP0}we b$uCOP%}vZpOiu+#=oVKNm!#%S%-040WD^;I diff --git a/inventory/__pycache__/apps.cpython-310.pyc b/inventory/__pycache__/apps.cpython-310.pyc index 978f29185380e1b0b8e9fbc5a0ea74675eb1ac27..0af69011ba997543826200c2cae0a64677d0db2a 100644 GIT binary patch delta 65 zcmX@iyq%dlpO=@50SI1O*KXt%VbrkH4=qkDD%MX)EXph`)_2KIF3nBND=F4bD@x2u T&d4lIjV~_AFG`&p%vb;bdW02{ delta 77 zcmdnae3+R#pO=@50SK-})@|e#VKi~o&&bbB)lW$*%GP(uPcF?(%_}L^ch4;GC{5BY dF3B%S)y+-JOH5A%N$3_=7MG;vPIhN3005E88Pos( diff --git a/inventory/__pycache__/models.cpython-310.pyc b/inventory/__pycache__/models.cpython-310.pyc index b9b8b024547fedc9d59ad440949bdb1857b95391..43bcc61036e675c3ee85ea034a7349350a2c42bc 100644 GIT binary patch delta 3423 zcma)8O>7&-72a9yl1p-zB3Be8|H+hXxh7(Zt>Vh5?KpNN|HX|WL<($g<7`%(l}wo; z)mg3r2?m(dLfs;8(R6YP()1^n0yzXtgeorV6v(Bwt_t+B?WO1;mtJ~p6SVIQHx%QB zK}pQx%=c!7?{D6FfBweD-^w%$BPGG-?blk1FCKV3vzPq!^~cIBDp94TEhnuckuFM9 zrST1k#$B?Mx)Za~fF!5}h~~y%t;0G=Q?O1&I}AY5R0l+lkPILO%>a^#kUl{AXcmxc zgk%B9Q4^5I%?Qc?)KBvOQlTS9XD}|2kEE-gB8(rVgw6UU{lf@t56t(i>*uZ4AJ&#Bu7OxD z#D_?c`|;**Pn{0Jse?R`D3gOcTiD0v5kGH(GapItli-8xSAxy$SD6V* zc9@T(2FVfBsq+8oG>r#^PUd8z-egV%G}}=}?^Xx5qHkCcNr7*r_8%$Z^y^4^>U9#h zm-v5D1LUM|%y{~h;vqbNG3IB11V0Nt3bwXi4c-eL1Y5x-Gx?v==h7kuMQDxkVg1@L z8nLHyuJJeY!^gUekDGvy7T-Ho7o8 zd?K2p5mPlqx{GwZ^!`icQ8IQJxa=t;6F~evAi*yo7C$O({~*{59&EqHP<<9T_F588F4s{E0k9G0Oo76VzRB{8|&N@p8U?L}>AqfxCf6XSgx2`(l?x0JO}R=Ppm4 zx96_UoVO=0Jqz>Mu84lbQboMxDv}Xi9~cI++#9%fx~ExYVdp9g57S=TELkuM)&Uc~ z5aqL&c2Wso>}xxEHgG z&RP@e46OSEABr_i-&3qCAUQzVrwl-_x@KtKMhj~59og!?D=iS3rMV5w%2Si}Z%Ed_ zT}hFw0+if*n7sUXfo$i=Uj+Aq-$8QuV6LRFPU>lwF%iB`gN6)4z<&%#@DA*~zx{nk zNp~^3!s&;>W)Xf`58<8&1^#b>hoxB8HJB-UERMmiw(kNT;s(Ca+5b7}XK?4w;lF;1 zX%FJ;Jw^Zm8AX8=lHrx?c_89m{%&EkANW@g6|DA7bk#TU>{%GXrLJTVDp@imR*cG) zLStYVWj)ie%-Az-)A9FmeQ>`le)hG3t?82bXo|sq3Hw)FHs65$1Bni7> zuwzXR6})v5g~0ICB!y^%Sum}jbf14>Fi~LOEA!3*xh*Y8v?ck3nJ@*xqZu;D5KvpL z$0)(yX6%l%q}(P|>9+h1`7t39l|VIlx@|i(?1K{KJ2m@zzEf{P`U`W+tuz>Q=?;{l z)rAF@x%G-0s-6#3IaIusv+9C7hd`cCaoD04#&5lhzrTj|&9*Bw$MbBvtu`vlY#<-P z@UWfA!`q3=1=4L|4{rQ|;%EdF#w4B^2ZD;T1kxqasuN1yl&B0#ndOi!5x`=ADX@ay zw^UG7onB8(H;OZ?LH$Z|T`nG3*J0ghFxQn*@mLX}q?3EXBT2V4`RzZi+KZ+*TIbRcMp!P68K63*`#)GYzlWtggD3 z>rHpjWf!U~w?^4_@$d^sFvGW{#VTxNI!&)lp@@p05*`rcEi@trRa|H}BPWTloX2Z~ zyRO0PhcLVsfnaFL1P6ZO|5g(6>=&1hti-m@6g4`~nZe;tm3SM)c_yJN*#yHsn=a+K zHe|J|Y{&d#?S@@gD^#Ds?p-wF47*ohG|{OrY(Cf&60Bbgv$eSLOCOzf8gBJ#?ima( c4|UZc9CaB|c|MymjUm%8Q)b%K%v{0zFI_?E<^TWy delta 2405 zcmb7F-ES0C6yH1hHM=vjyEEOTrQ2<{r4%+~yRlHT1lmGd3W}xJ1;ZM%EPIEtWxsNF zRxA?vkno@o!J8PPV#H@3OrQygL1K&=eVTpnWr9ItO#B1zg$MPV=~7D4C2^8_a_{e+ zd*}Sl*Zpqfm*)Z%Me#e}8@uuL{LSd~Ko>EuZ%Lh-c2E~}Uvf~lP8P&>oEaY=9_j_e zt2<%shqXw3u=X`IBtZOB0z_&eG9WTl08yHV0!V-c0SPvd03ac%0-`pNARwDG+6GWt z6AA$orV&6QO+=;Z<{XK3E|XpSb)}P6$sa`GX`vV7c%X}aAoPxO0If&UsgsqGo}xK+ zDm7Wj*GqcYsHLV0#=iRTRL!U`Jz2_?bMrcGBx{Q`Loe~)gc#}K{|IRk;d9QNL!EFF z!|PUw^|rml|6}ACr*)ZSiiSOvb-582) z6aom#zZduw=F2bXi?*qjI5(Bf&Ky2)z!IyKTEQq(%B+W9^cdYODfYody*%tqkv^^l zV?5_IJtAQB4*t6@Dli{Ui$g)1nKys3QpoEypfw(dB{j4Isjx7LR_5=)%_x5$#_7`> zGIILp>{NDQ-@*M8Q*$;W)`Q9s5SGhWtm>?#*;_$p1V%G5A_=%5HUirUkqPtDK1xJ> z-}geN4|M8iy?M>N-8gS9H7+m}mTV&*^tY2u|A)x|JQwBH{L#**nXI;*fA8-Z9YoC( zik1Y>_`NV{G6+m9ncx5lBX%6dr1S9&cmrlxJp{u1%)DpbXjko=GToY3<0KaUtl{4U{KDj zq!(0*TrK7dJzK7qj_a%?v152e6vP=N&FcA6gV}7&VACo2Ci zv=y4c&!K*4IbN`3*HV}(YX8_HXFM5CIITbh5TgyHO+zTSzqLE2 zK|Rk8X;Cr_Hi^roH8*`iWerosP>#K>XHZZgZqrT7t-F6zz&4|P)ED!isJ_u~tDm1HEC%kZ}1 zT%lenUUFmt)CbR--}3D*zX9)3g)Oot?%I#0yof^OKeZ>v^91IPKb*T@Uv>4o(Nof4n zXr^YlU$*NQpKaEM0(0H&XbhVaL$5K+R)$fu&#roL?YDP5Y*^w>XbAP9K8o(P-7Gu8 W(9pEDkYDT26wR+mny9JkwEqC958l!M diff --git a/inventory/migrations/__pycache__/0001_initial.cpython-310.pyc b/inventory/migrations/__pycache__/0001_initial.cpython-310.pyc index c4ea00a6ccd2dab29049dc09c6ab150d300218df..173570502aa3243e0968dc82efc930f61942877b 100644 GIT binary patch delta 66 zcmX>jc|ejopO=@50SMY0YBzG%aBKMJhZd(673-%Y7G;(e>$~J9m*%GCl@#lz6(!~+ UXJi(q#uu057o~3A%`M0X0HzTZDF6Tf delta 78 zcmX>gc}9{upO=@50SK-})@|gj;WmlT&&bbB)lW$*%GP(uPcF?(%_}L^ch4;GC{5BY eF3B%S)y+-JOH5A%N$3_=7MG;vZeGtV$Or)5qZ-Qq diff --git a/inventory/migrations/__pycache__/__init__.cpython-310.pyc b/inventory/migrations/__pycache__/__init__.cpython-310.pyc index 0a89eba36551b833a5b98e8c39d1e8378ea1269e..1a2af7b57c4d57d0fa0e393b878dfe4fdbf176b9 100644 GIT binary patch delta 63 zcmdnUxRjAQpO=@50SI1O*G}ZN(eTg@Elw>e)=x<+$}BC`cgasK%}vcKDb`ObO3X{n R$Sh8cFD}V1N}X731^`;K6>9(h delta 75 zcmZ3=xRH@NpO=@50SK-})=lKLF$vMn$j?pHPf0Aw)_2KIF3nBND=F4@&n)pMP0}we b$uCOP%}vZpOiu+#=oVKNm!#%S%r^r7Y}XmB diff --git a/settings/__pycache__/__init__.cpython-310.pyc b/settings/__pycache__/__init__.cpython-310.pyc index d653309f64c6ca3750ec2608389e2b34d1745259..c0f6ea35189c4f5ccd7ac3531be34a3d4848bb27 100644 GIT binary patch delta 63 zcmZ3=IFpe(pO=@50SFRpYbSEsXxQk77N-^!>!&0ZWtJA}yW}UA=BDPA6ziuICFUh( RWEQ8!7nkH0rB1BY0suHc6te&T delta 75 zcmbQqxRjAQpO=@50SK-})=lKLG4asP$j?pHPf0Aw)_2KIF3nBND=F4@&n)pMP0}we b$uCOP%}vZpOiu+#=oVKNm!#%S%+~?{V@DZ% diff --git a/settings/__pycache__/base.cpython-310.pyc b/settings/__pycache__/base.cpython-310.pyc index e43ac90accc892b74a2165967fd13e78d01d7020..4de4eb87db9b841cc71ac4151e0fc003db42122f 100644 GIT binary patch delta 96 zcmX@dcZQEIpO=@50SNZas88qM+{kCZ!pJw-p5-l96h}^edS-D+X7Xko)*?m?3;odI z)S_bjl*FRU(qes={N&Qy)Vz{n{j{RQyyT3`;?(%!lKi67$(Pu|83iY6v8w<8c2yqj delta 97 zcmX@ZcaD!QpO=@50SJQD*QNj9*vMzV!pJ+>p5^UkGu9$T6BqrA{M=Oil*FQJeV6>? x(%jU%l45=L%o2~%B>m!&{GwFd+{C=Z^i+_9ZgFLCNowxo3vA(x0+Th^RRGT!AO-*c diff --git a/settings/__pycache__/dev.cpython-310.pyc b/settings/__pycache__/dev.cpython-310.pyc index ab580c7395867e8c7b6ca8e35860fc20b241e753..74a028f38e88642b630ce78a3c3cbdd1513adf25 100644 GIT binary patch delta 78 zcmeBWYGmTh=jG*M0D?6hwG+8R8KWj9Iva5S`9&b&m$`muacWVqeoA6dW@)j$OMY@` cZfaghv3^=nVqS7aW^rnKaY=qr>cmId03V1LZ2$lO delta 90 zcmZo<>Sf~2=jG*M0D`NLbrZQm8E;KYbhhIJ@{2&kFK7LX{M=Oil*FQJeV6>?(%jU% ml45=L%o2~%B>m!&{GwFd+{C=Z^i+_9ZgFLCNowxIYuW&X2OVPo