resort imports

This commit is contained in:
Matthias Mair 2022-05-20 17:24:51 +02:00
parent ddc4ef3c38
commit e1d22f538d
156 changed files with 807 additions and 1042 deletions

View File

@ -2,18 +2,17 @@
Main JSON interface views Main JSON interface views
""" """
from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django.http import JsonResponse from django.http import JsonResponse
from django.utils.translation import gettext_lazy as _
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters from rest_framework import filters, permissions
from rest_framework import permissions
from .views import AjaxView
from .version import inventreeVersion, inventreeApiVersion, inventreeInstanceName
from .status import is_worker_running from .status import is_worker_running
from .version import (inventreeApiVersion, inventreeInstanceName,
inventreeVersion)
from .views import AjaxView
class InfoView(AjaxView): class InfoView(AjaxView):

View File

@ -6,9 +6,10 @@ import csv
import io import io
import re import re
from django.http.response import StreamingHttpResponse
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.http.response import StreamingHttpResponse
from rest_framework.test import APITestCase from rest_framework.test import APITestCase

View File

@ -3,16 +3,16 @@
import logging import logging
from django.apps import AppConfig from django.apps import AppConfig
from django.core.exceptions import AppRegistryNotReady
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.exceptions import AppRegistryNotReady
from django.db import transaction from django.db import transaction
from django.db.utils import IntegrityError from django.db.utils import IntegrityError
from InvenTree.ready import isInTestMode, canAppAccessDatabase
from .config import get_setting
import InvenTree.tasks import InvenTree.tasks
from InvenTree.ready import canAppAccessDatabase, isInTestMode
from .config import get_setting
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")
@ -111,8 +111,8 @@ class InvenTreeConfig(AppConfig):
try: try:
from djmoney.contrib.exchange.models import ExchangeBackend from djmoney.contrib.exchange.models import ExchangeBackend
from InvenTree.tasks import update_exchange_rates
from common.settings import currency_code_default from common.settings import currency_code_default
from InvenTree.tasks import update_exchange_rates
except AppRegistryNotReady: # pragma: no cover except AppRegistryNotReady: # pragma: no cover
pass pass

View File

@ -3,12 +3,12 @@ Pull rendered copies of the templated
only used for testing the js files! - This file is omited from coverage only used for testing the js files! - This file is omited from coverage
""" """
from django.test import TestCase # pragma: no cover
from django.contrib.auth import get_user_model # pragma: no cover
import os # pragma: no cover import os # pragma: no cover
import pathlib # pragma: no cover import pathlib # pragma: no cover
from django.contrib.auth import get_user_model # pragma: no cover
from django.test import TestCase # pragma: no cover
class RenderJavascriptFiles(TestCase): # pragma: no cover class RenderJavascriptFiles(TestCase): # pragma: no cover
""" """

View File

@ -2,10 +2,9 @@
Helper functions for loading InvenTree configuration options Helper functions for loading InvenTree configuration options
""" """
import logging
import os import os
import shutil import shutil
import logging
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -4,12 +4,10 @@
Provides extra global data to all templates. Provides extra global data to all templates.
""" """
from InvenTree.status_codes import SalesOrderStatus, PurchaseOrderStatus
from InvenTree.status_codes import BuildStatus, StockStatus
from InvenTree.status_codes import StockHistoryCode
import InvenTree.status import InvenTree.status
from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
SalesOrderStatus, StockHistoryCode,
StockStatus)
from users.models import RuleSet from users.models import RuleSet

View File

@ -5,20 +5,19 @@ Custom exception handling for the DRF API
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
import traceback
import sys import sys
import traceback
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError as DjangoValidationError from django.core.exceptions import ValidationError as DjangoValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.debug import ExceptionReporter from django.views.debug import ExceptionReporter
import rest_framework.views as drfviews
from error_report.models import Error from error_report.models import Error
from rest_framework import serializers
from rest_framework.exceptions import ValidationError as DRFValidationError from rest_framework.exceptions import ValidationError as DRFValidationError
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import serializers
import rest_framework.views as drfviews
def exception_handler(exc, context): def exception_handler(exc, context):

View File

@ -1,13 +1,14 @@
import certifi
import ssl import ssl
from urllib.error import URLError
from urllib.request import urlopen from urllib.request import urlopen
from common.settings import currency_code_default, currency_codes
from urllib.error import URLError
from djmoney.contrib.exchange.backends.base import SimpleExchangeBackend
from django.db.utils import OperationalError from django.db.utils import OperationalError
import certifi
from djmoney.contrib.exchange.backends.base import SimpleExchangeBackend
from common.settings import currency_code_default, currency_codes
class InvenTreeExchange(SimpleExchangeBackend): class InvenTreeExchange(SimpleExchangeBackend):
""" """

View File

@ -1,24 +1,22 @@
""" Custom fields used in InvenTree """ """ Custom fields used in InvenTree """
import sys import sys
from .validators import allowable_url_schemes
from django.utils.translation import gettext_lazy as _
from django.forms.fields import URLField as FormURLField
from django.db import models as models
from django.core import validators
from django import forms
from decimal import Decimal from decimal import Decimal
from djmoney.models.fields import MoneyField as ModelMoneyField from django import forms
from django.core import validators
from django.db import models as models
from django.forms.fields import URLField as FormURLField
from django.utils.translation import gettext_lazy as _
from djmoney.forms.fields import MoneyField from djmoney.forms.fields import MoneyField
from djmoney.models.fields import MoneyField as ModelMoneyField
from djmoney.models.validators import MinMoneyValidator from djmoney.models.validators import MinMoneyValidator
import InvenTree.helpers import InvenTree.helpers
from .validators import allowable_url_schemes
class InvenTreeURLFormField(FormURLField): class InvenTreeURLFormField(FormURLField):
""" Custom URL form field with custom scheme validators """ """ Custom URL form field with custom scheme validators """
@ -39,7 +37,7 @@ class InvenTreeURLField(models.URLField):
def money_kwargs(): def money_kwargs():
""" returns the database settings for MoneyFields """ """ returns the database settings for MoneyFields """
from common.settings import currency_code_mappings, currency_code_default from common.settings import currency_code_default, currency_code_mappings
kwargs = {} kwargs = {}
kwargs['currency_choices'] = currency_code_mappings() kwargs['currency_choices'] = currency_code_mappings()

View File

@ -2,29 +2,29 @@
Helper forms which subclass Django forms to provide additional functionality Helper forms which subclass Django forms to provide additional functionality
""" """
from urllib.parse import urlencode
import logging import logging
from urllib.parse import urlencode
from django.utils.translation import gettext_lazy as _
from django import forms from django import forms
from django.contrib.auth.models import User, Group
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import Group, User
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field
from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText, StrictButton, Div
from allauth.account.forms import SignupForm, set_form_field_order
from allauth.account.adapter import DefaultAccountAdapter from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter from allauth.account.forms import SignupForm, set_form_field_order
from allauth.exceptions import ImmediateHttpResponse from allauth.exceptions import ImmediateHttpResponse
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth_2fa.adapter import OTPAdapter from allauth_2fa.adapter import OTPAdapter
from allauth_2fa.utils import user_has_valid_totp_device from allauth_2fa.utils import user_has_valid_totp_device
from crispy_forms.bootstrap import (AppendedText, Div, PrependedAppendedText,
PrependedText, StrictButton)
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Field, Layout
from part.models import PartCategory
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
from part.models import PartCategory
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -3,27 +3,25 @@ Provides helper functions used throughout the InvenTree project
""" """
import io import io
import re
import json import json
import os.path import os.path
from PIL import Image import re
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
from wsgiref.util import FileWrapper from wsgiref.util import FileWrapper
from django.http import StreamingHttpResponse
from django.core.exceptions import ValidationError, FieldError
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.core.exceptions import FieldError, ValidationError
import InvenTree.version from django.http import StreamingHttpResponse
from django.utils.translation import gettext_lazy as _
from common.models import InvenTreeSetting
from .settings import MEDIA_URL, STATIC_URL
from common.settings import currency_code_default
from djmoney.money import Money from djmoney.money import Money
from PIL import Image
import InvenTree.version
from common.models import InvenTreeSetting
from common.settings import currency_code_default
from .settings import MEDIA_URL, STATIC_URL
def getSetting(key, backup_value=None): def getSetting(key, backup_value=None):

View File

@ -6,7 +6,6 @@ import logging
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -2,15 +2,15 @@
Custom management command to prerender files Custom management command to prerender files
""" """
from django.core.management.base import BaseCommand import os
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand
from django.http.request import HttpRequest
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from django.http.request import HttpRequest
from django.utils.translation import override as lang_over from django.utils.translation import override as lang_over
import os
def render_file(file_name, source, target, locales, ctx): def render_file(file_name, source, target, locales, ctx):
""" renders a file into all provided locales """ """ renders a file into all provided locales """

View File

@ -4,19 +4,18 @@ Custom management command to rebuild thumbnail images
- May be required after importing a new dataset, for example - May be required after importing a new dataset, for example
""" """
import os
import logging import logging
import os
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db.utils import OperationalError, ProgrammingError
from PIL import UnidentifiedImageError from PIL import UnidentifiedImageError
from django.core.management.base import BaseCommand
from django.conf import settings
from django.db.utils import OperationalError, ProgrammingError
from company.models import Company from company.models import Company
from part.models import Part from part.models import Part
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -2,8 +2,8 @@
Custom management command to remove MFA for a user Custom management command to remove MFA for a user
""" """
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
class Command(BaseCommand): class Command(BaseCommand):

View File

@ -2,13 +2,12 @@
Custom management command, wait for the database to be ready! Custom management command, wait for the database to be ready!
""" """
from django.core.management.base import BaseCommand
from django.db import connection
from django.db.utils import OperationalError, ImproperlyConfigured
import time import time
from django.core.management.base import BaseCommand
from django.db import connection
from django.db.utils import ImproperlyConfigured, OperationalError
class Command(BaseCommand): class Command(BaseCommand):
""" """

View File

@ -1,14 +1,12 @@
import logging import logging
from rest_framework import serializers from rest_framework import serializers
from rest_framework.fields import empty
from rest_framework.metadata import SimpleMetadata from rest_framework.metadata import SimpleMetadata
from rest_framework.utils import model_meta from rest_framework.utils import model_meta
from rest_framework.fields import empty
from InvenTree.helpers import str2bool
import users.models import users.models
from InvenTree.helpers import str2bool
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -1,20 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import logging
from django.conf import settings from django.conf import settings
from django.contrib.auth.middleware import PersistentRemoteUserMiddleware from django.contrib.auth.middleware import PersistentRemoteUserMiddleware
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse_lazy, Resolver404 from django.urls import Resolver404, include, re_path, reverse_lazy
from django.urls import include, re_path
import logging
from allauth_2fa.middleware import (AllauthTwoFactorMiddleware,
BaseRequire2FAMiddleware)
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from allauth_2fa.middleware import BaseRequire2FAMiddleware, AllauthTwoFactorMiddleware
from InvenTree.urls import frontendpatterns
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
from InvenTree.urls import frontendpatterns
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -2,27 +2,25 @@
Generic models which provide extra functionality over base Django model types. Generic models which provide extra functionality over base Django model types.
""" """
import re
import os
import logging import logging
import os
import re
from django.db import models
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models
from django.db.models.signals import pre_delete from django.db.models.signals import pre_delete
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from mptt.models import MPTTModel, TreeForeignKey
from mptt.exceptions import InvalidMove from mptt.exceptions import InvalidMove
from mptt.models import MPTTModel, TreeForeignKey
from InvenTree.fields import InvenTreeURLField from InvenTree.fields import InvenTreeURLField
from InvenTree.validators import validate_tree_name from InvenTree.validators import validate_tree_name
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -3,27 +3,24 @@ Serializers used in various InvenTree apps
""" """
import os import os
import tablib
from decimal import Decimal
from collections import OrderedDict from collections import OrderedDict
from decimal import Decimal
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError as DjangoValidationError from django.core.exceptions import ValidationError as DjangoValidationError
from django.utils.translation import gettext_lazy as _
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _
import tablib
from djmoney.contrib.django_rest_framework.fields import MoneyField from djmoney.contrib.django_rest_framework.fields import MoneyField
from djmoney.money import Money from djmoney.money import Money
from djmoney.utils import MONEY_CLASSES, get_currency_field_name from djmoney.utils import MONEY_CLASSES, get_currency_field_name
from rest_framework import serializers from rest_framework import serializers
from rest_framework.utils import model_meta
from rest_framework.fields import empty
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from rest_framework.fields import empty
from rest_framework.serializers import DecimalField from rest_framework.serializers import DecimalField
from rest_framework.utils import model_meta
from .models import extract_int from .models import extract_int

View File

@ -12,7 +12,6 @@ database setup in this file.
""" """
import logging import logging
import os import os
import random import random
import socket import socket
@ -20,13 +19,13 @@ import string
import sys import sys
from datetime import datetime from datetime import datetime
import moneyed import django.conf.locale
import yaml
from django.utils.translation import gettext_lazy as _
from django.contrib.messages import constants as messages from django.contrib.messages import constants as messages
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
import django.conf.locale from django.utils.translation import gettext_lazy as _
import moneyed
import yaml
from .config import get_base_dir, get_config_file, get_plugin_file, get_setting from .config import get_base_dir, get_config_file, get_plugin_file, get_setting
@ -453,10 +452,8 @@ db_options = db_config.get("OPTIONS", db_config.get("options", {}))
# Specific options for postgres backend # Specific options for postgres backend
if "postgres" in db_engine: # pragma: no cover if "postgres" in db_engine: # pragma: no cover
from psycopg2.extensions import ( from psycopg2.extensions import (ISOLATION_LEVEL_READ_COMMITTED,
ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_SERIALIZABLE)
ISOLATION_LEVEL_SERIALIZABLE,
)
# Connection timeout # Connection timeout
if "connect_timeout" not in db_options: if "connect_timeout" not in db_options:

View File

@ -3,20 +3,18 @@ Provides system status functionality checks.
""" """
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils.translation import gettext_lazy as _
from django.utils import timezone
import logging import logging
from datetime import timedelta from datetime import timedelta
from django.conf import settings
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django_q.models import Success from django_q.models import Success
from django_q.monitor import Stat from django_q.monitor import Stat
from django.conf import settings
import InvenTree.ready import InvenTree.ready
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -1,17 +1,16 @@
import re
import json import json
import warnings
import requests
import logging import logging
import re
import warnings
from datetime import timedelta from datetime import timedelta
from django.utils import timezone
from django.conf import settings
from django.core import mail as django_mail
from django.core.exceptions import AppRegistryNotReady from django.core.exceptions import AppRegistryNotReady
from django.db.utils import OperationalError, ProgrammingError from django.db.utils import OperationalError, ProgrammingError
from django.core import mail as django_mail from django.utils import timezone
from django.conf import settings
import requests
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")
@ -72,9 +71,10 @@ def offload_task(taskname, *args, force_sync=False, **kwargs):
""" """
try: try:
import importlib
from django_q.tasks import AsyncTask from django_q.tasks import AsyncTask
import importlib
from InvenTree.status import is_worker_running from InvenTree.status import is_worker_running
except AppRegistryNotReady: # pragma: no cover except AppRegistryNotReady: # pragma: no cover
logger.warning(f"Could not offload task '{taskname}' - app registry not ready") logger.warning(f"Could not offload task '{taskname}' - app registry not ready")
@ -254,9 +254,10 @@ def update_exchange_rates():
""" """
try: try:
from InvenTree.exchange import InvenTreeExchange
from djmoney.contrib.exchange.models import ExchangeBackend, Rate from djmoney.contrib.exchange.models import ExchangeBackend, Rate
from common.settings import currency_code_default, currency_codes from common.settings import currency_code_default, currency_codes
from InvenTree.exchange import InvenTreeExchange
except AppRegistryNotReady: # pragma: no cover except AppRegistryNotReady: # pragma: no cover
# Apps not yet loaded! # Apps not yet loaded!
logger.info("Could not perform 'update_exchange_rates' - App registry not ready") logger.info("Could not perform 'update_exchange_rates' - App registry not ready")

View File

@ -1,20 +1,17 @@
""" Low level tests for the InvenTree API """ """ Low level tests for the InvenTree API """
from rest_framework import status from base64 import b64encode
from django.test import TestCase
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.test import TestCase
from django.urls import reverse from django.urls import reverse
from rest_framework import status
from InvenTree.api_tester import InvenTreeAPITestCase from InvenTree.api_tester import InvenTreeAPITestCase
from users.models import RuleSet from users.models import RuleSet
from base64 import b64encode
class HTMLAPITests(TestCase): class HTMLAPITests(TestCase):
""" """

View File

@ -1,8 +1,7 @@
"""Tests for middleware functions""" """Tests for middleware functions"""
from django.test import TestCase
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse from django.urls import reverse

View File

@ -4,16 +4,15 @@ Unit tests for task management
from datetime import timedelta from datetime import timedelta
from django.utils import timezone
from django.test import TestCase from django.test import TestCase
from django_q.models import Schedule from django.utils import timezone
from django_q.models import Schedule
from error_report.models import Error from error_report.models import Error
import InvenTree.tasks import InvenTree.tasks
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
threshold = timezone.now() - timedelta(days=30) threshold = timezone.now() - timedelta(days=30)
threshold_low = threshold - timedelta(days=1) threshold_low = threshold - timedelta(days=1)

View File

@ -2,14 +2,13 @@
Validate that all URLs specified in template files are correct. Validate that all URLs specified in template files are correct.
""" """
from django.test import TestCase
from django.urls import reverse
import os import os
import re import re
from pathlib import Path from pathlib import Path
from django.test import TestCase
from django.urls import reverse
class URLTest(TestCase): class URLTest(TestCase):

View File

@ -2,12 +2,12 @@
Unit tests for the main web views Unit tests for the main web views
""" """
import re
import os import os
import re
from django.contrib.auth import get_user_model
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
from django.contrib.auth import get_user_model
class ViewTests(TestCase): class ViewTests(TestCase):

View File

@ -1,33 +1,26 @@
import json import json
import os import os
import time import time
from decimal import Decimal
from unittest import mock from unittest import mock
from django.test import TestCase, override_settings
import django.core.exceptions as django_exceptions import django.core.exceptions as django_exceptions
from django.core.exceptions import ValidationError
from django.contrib.auth import get_user_model
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.test import TestCase, override_settings
from djmoney.money import Money
from djmoney.contrib.exchange.models import Rate, convert_money
from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import Rate, convert_money
from .validators import validate_overage, validate_part_name from djmoney.money import Money
from . import helpers
from . import version
from . import status
from . import ready
from . import config
from decimal import Decimal
import InvenTree.tasks import InvenTree.tasks
from stock.models import StockLocation
from common.settings import currency_codes
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
from common.settings import currency_codes
from stock.models import StockLocation
from . import config, helpers, ready, status, version
from .validators import validate_overage, validate_part_name
class ValidatorTest(TestCase): class ValidatorTest(TestCase):

View File

@ -4,47 +4,41 @@ Top-level URL lookup for InvenTree application.
Passes URL lookup downstream to each app as required. Passes URL lookup downstream to each app as required.
""" """
from django.urls import include, path, re_path
from django.contrib import admin
from company.urls import company_urls
from company.urls import manufacturer_part_urls
from company.urls import supplier_part_urls
from common.urls import common_urls
from part.urls import part_urls
from stock.urls import stock_urls
from build.urls import build_urls
from order.urls import order_urls
from plugin.urls import get_plugin_urls
from common.api import common_api_urls, settings_api_urls
from part.api import part_api_urls, bom_api_urls
from company.api import company_api_urls
from stock.api import stock_api_urls
from build.api import build_api_urls
from order.api import order_api_urls
from label.api import label_api_urls
from report.api import report_api_urls
from plugin.api import plugin_api_urls
from users.api import user_urls
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path, re_path
from django.views.generic.base import RedirectView from django.views.generic.base import RedirectView
from rest_framework.documentation import include_docs_urls from rest_framework.documentation import include_docs_urls
from .views import auth_request from build.api import build_api_urls
from .views import IndexView, SearchView, DatabaseStatsView from build.urls import build_urls
from .views import SettingsView, EditUserView, SetPasswordView, CustomEmailView, CustomConnectionsView, CustomPasswordResetFromKeyView from common.api import common_api_urls, settings_api_urls
from .views import CustomSessionDeleteView, CustomSessionDeleteOtherView from common.urls import common_urls
from .views import CurrencyRefreshView from company.api import company_api_urls
from .views import AppearanceSelectView, SettingCategorySelectView from company.urls import (company_urls, manufacturer_part_urls,
from .views import DynamicJsView supplier_part_urls)
from .views import NotificationsView from label.api import label_api_urls
from order.api import order_api_urls
from order.urls import order_urls
from part.api import bom_api_urls, part_api_urls
from part.urls import part_urls
from plugin.api import plugin_api_urls
from plugin.urls import get_plugin_urls
from report.api import report_api_urls
from stock.api import stock_api_urls
from stock.urls import stock_urls
from users.api import user_urls
from .api import InfoView, NotFoundView from .api import InfoView, NotFoundView
from .views import (AppearanceSelectView, CurrencyRefreshView,
CustomConnectionsView, CustomEmailView,
CustomPasswordResetFromKeyView,
CustomSessionDeleteOtherView, CustomSessionDeleteView,
DatabaseStatsView, DynamicJsView, EditUserView, IndexView,
NotificationsView, SearchView, SetPasswordView,
SettingCategorySelectView, SettingsView, auth_request)
admin.site.site_header = "InvenTree Admin" admin.site.site_header = "InvenTree Admin"

View File

@ -2,19 +2,17 @@
Custom field validators for InvenTree Custom field validators for InvenTree
""" """
import re
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import FieldDoesNotExist, ValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.exceptions import FieldDoesNotExist
from moneyed import CURRENCIES from moneyed import CURRENCIES
import common.models import common.models
import re
def validate_currency_code(code): def validate_currency_code(code):
""" """

View File

@ -3,12 +3,12 @@ Version information for InvenTree.
Provides information on the current InvenTree version Provides information on the current InvenTree version
""" """
import subprocess
import django
import re import re
import subprocess
import django
import common.models import common.models
from InvenTree.api_version import INVENTREE_API_VERSION from InvenTree.api_version import INVENTREE_API_VERSION
# InvenTree software version # InvenTree software version

View File

@ -5,39 +5,38 @@ In particular these views provide base functionality for rendering Django forms
as JSON objects and passing them to modal forms (using jQuery / bootstrap). as JSON objects and passing them to modal forms (using jQuery / bootstrap).
""" """
import os
import json import json
import os
from django.utils.translation import gettext_lazy as _ from django.conf import settings
from django.contrib.auth.mixins import (LoginRequiredMixin,
PermissionRequiredMixin)
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.timezone import now from django.utils.timezone import now
from django.shortcuts import redirect from django.utils.translation import gettext_lazy as _
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views import View from django.views import View
from django.views.generic import ListView, DetailView, CreateView, FormView, DeleteView, UpdateView from django.views.generic import (CreateView, DeleteView, DetailView, FormView,
ListView, UpdateView)
from django.views.generic.base import RedirectView, TemplateView from django.views.generic.base import RedirectView, TemplateView
from djmoney.contrib.exchange.models import ExchangeBackend, Rate
from allauth.account.forms import AddEmailForm from allauth.account.forms import AddEmailForm
from allauth.socialaccount.forms import DisconnectForm
from allauth.account.models import EmailAddress from allauth.account.models import EmailAddress
from allauth.account.views import EmailView, PasswordResetFromKeyView from allauth.account.views import EmailView, PasswordResetFromKeyView
from allauth.socialaccount.forms import DisconnectForm
from allauth.socialaccount.views import ConnectionsView from allauth.socialaccount.views import ConnectionsView
from user_sessions.views import SessionDeleteView, SessionDeleteOtherView from djmoney.contrib.exchange.models import ExchangeBackend, Rate
from user_sessions.views import SessionDeleteOtherView, SessionDeleteView
from common.models import ColorTheme, InvenTreeSetting
from common.settings import currency_code_default, currency_codes from common.settings import currency_code_default, currency_codes
from part.models import PartCategory from part.models import PartCategory
from common.models import InvenTreeSetting, ColorTheme from users.models import RuleSet, check_user_role
from users.models import check_user_role, RuleSet
from .forms import DeleteForm, EditUserForm, SetPasswordForm from .forms import (DeleteForm, EditUserForm, SetPasswordForm,
from .forms import SettingCategorySelectForm SettingCategorySelectForm)
from .helpers import str2bool from .helpers import str2bool

View File

@ -5,18 +5,16 @@ Provides a JSON API for common components.
import json import json
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.urls import include, path, re_path
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.urls import path
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.urls import include, re_path
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import NotAcceptable, NotFound
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, generics, permissions
from rest_framework import serializers
from django_q.tasks import async_task from django_q.tasks import async_task
from rest_framework import filters, generics, permissions, serializers
from rest_framework.exceptions import NotAcceptable, NotFound
from rest_framework.response import Response
from rest_framework.views import APIView
import common.models import common.models
import common.serializers import common.serializers

View File

@ -4,7 +4,6 @@ import logging
from django.apps import AppConfig from django.apps import AppConfig
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -2,12 +2,13 @@
Files management tools. Files management tools.
""" """
from rapidfuzz import fuzz
import tablib
import os import os
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
import tablib
from rapidfuzz import fuzz
class FileManager: class FileManager:

View File

@ -3,45 +3,41 @@ Common database model definitions.
These models are 'generic' and do not fit a particular business logic object. These models are 'generic' and do not fit a particular business logic object.
""" """
import os import base64
import decimal import decimal
import math import hashlib
import uuid
import hmac import hmac
import json import json
import hashlib import logging
import base64 import math
from secrets import compare_digest import os
import uuid
from datetime import datetime, timedelta from datetime import datetime, timedelta
from secrets import compare_digest
from django.apps import apps from django.apps import apps
from django.db import models, transaction
from django.db.utils import IntegrityError, OperationalError
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User, Group from django.contrib.auth.models import Group, User
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.humanize.templatetags.humanize import naturaltime from django.contrib.humanize.templatetags.humanize import naturaltime
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator, URLValidator
from django.db import models, transaction
from django.db.utils import IntegrityError, OperationalError
from django.urls import reverse from django.urls import reverse
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from djmoney.settings import CURRENCY_CHOICES
from djmoney.contrib.exchange.models import convert_money
from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import convert_money
from djmoney.settings import CURRENCY_CHOICES
from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import PermissionDenied
from django.utils.translation import gettext_lazy as _
from django.core.validators import MinValueValidator, URLValidator
from django.core.exceptions import ValidationError
import InvenTree.helpers
import InvenTree.fields import InvenTree.fields
import InvenTree.helpers
import InvenTree.validators import InvenTree.validators
import logging
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -1,13 +1,12 @@
import logging import logging
from datetime import timedelta from datetime import timedelta
from common.models import NotificationEntry, NotificationMessage
from InvenTree.helpers import inheritors from InvenTree.helpers import inheritors
from InvenTree.ready import isImportingData from InvenTree.ready import isImportingData
from common.models import NotificationEntry, NotificationMessage
from plugin import registry from plugin import registry
from plugin.models import NotificationUserSetting from plugin.models import NotificationUserSetting
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -2,12 +2,12 @@
JSON serializers for common components JSON serializers for common components
""" """
from InvenTree.serializers import InvenTreeModelSerializer
from InvenTree.helpers import get_objectreference
from rest_framework import serializers from rest_framework import serializers
from common.models import InvenTreeSetting, InvenTreeUserSetting, NotificationMessage from common.models import (InvenTreeSetting, InvenTreeUserSetting,
NotificationMessage)
from InvenTree.helpers import get_objectreference
from InvenTree.serializers import InvenTreeModelSerializer
class SettingsSerializer(InvenTreeModelSerializer): class SettingsSerializer(InvenTreeModelSerializer):

View File

@ -2,15 +2,17 @@
User-configurable settings for the common app User-configurable settings for the common app
""" """
from moneyed import CURRENCIES
from django.conf import settings from django.conf import settings
from moneyed import CURRENCIES
def currency_code_default(): def currency_code_default():
""" """
Returns the default currency code (or USD if not specified) Returns the default currency code (or USD if not specified)
""" """
from django.db.utils import ProgrammingError from django.db.utils import ProgrammingError
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
try: try:

View File

@ -1,9 +1,8 @@
import logging import logging
from datetime import timedelta, datetime from datetime import datetime, timedelta
from django.core.exceptions import AppRegistryNotReady from django.core.exceptions import AppRegistryNotReady
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -1,7 +1,8 @@
from common.notifications import NotificationMethod, SingleNotificationMethod, BulkNotificationMethod, storage
from plugin.models import NotificationUserSetting
from part.test_part import BaseNotificationIntegrationTest
import plugin.templatetags.plugin_extras as plugin_tags import plugin.templatetags.plugin_extras as plugin_tags
from common.notifications import (BulkNotificationMethod, NotificationMethod,
SingleNotificationMethod, storage)
from part.test_part import BaseNotificationIntegrationTest
from plugin.models import NotificationUserSetting
class BaseNotificationTests(BaseNotificationIntegrationTest): class BaseNotificationTests(BaseNotificationIntegrationTest):

View File

@ -2,9 +2,10 @@
from django.test import TestCase from django.test import TestCase
from common.models import NotificationEntry from common.models import NotificationEntry
from . import tasks as common_tasks
from InvenTree.tasks import offload_task from InvenTree.tasks import offload_task
from . import tasks as common_tasks
class TaskTest(TestCase): class TaskTest(TestCase):
""" """

View File

@ -1,19 +1,20 @@
from http import HTTPStatus
import json import json
from datetime import timedelta from datetime import timedelta
from http import HTTPStatus
from django.test import TestCase, Client
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse from django.urls import reverse
from InvenTree.api_tester import InvenTreeAPITestCase from InvenTree.api_tester import InvenTreeAPITestCase
from InvenTree.helpers import str2bool from InvenTree.helpers import str2bool
from plugin.models import NotificationUserSetting, PluginConfig
from plugin import registry from plugin import registry
from plugin.models import NotificationUserSetting, PluginConfig
from .models import InvenTreeSetting, InvenTreeUserSetting, WebhookEndpoint, WebhookMessage, NotificationEntry, ColorTheme
from .api import WebhookView from .api import WebhookView
from .models import (ColorTheme, InvenTreeSetting, InvenTreeUserSetting,
NotificationEntry, WebhookEndpoint, WebhookMessage)
CONTENT_TYPE_JSON = 'application/json' CONTENT_TYPE_JSON = 'application/json'

View File

@ -4,12 +4,12 @@ Django views for interacting with common models
import os import os
from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.utils.translation import gettext_lazy as _
from formtools.wizard.views import SessionWizardView
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from formtools.wizard.views import SessionWizardView
from InvenTree.views import AjaxView from InvenTree.views import AjaxView

View File

@ -1,17 +1,16 @@
from django.contrib import admin from django.contrib import admin
from import_export.admin import ImportExportModelAdmin
from import_export.resources import ModelResource
from import_export.fields import Field
import import_export.widgets as widgets import import_export.widgets as widgets
from import_export.admin import ImportExportModelAdmin
from .models import Company from import_export.fields import Field
from .models import SupplierPart from import_export.resources import ModelResource
from .models import SupplierPriceBreak
from .models import ManufacturerPart, ManufacturerPartAttachment, ManufacturerPartParameter
from part.models import Part from part.models import Part
from .models import (Company, ManufacturerPart, ManufacturerPartAttachment,
ManufacturerPartParameter, SupplierPart,
SupplierPriceBreak)
class CompanyResource(ModelResource): class CompanyResource(ModelResource):
""" Class for managing Company data import/export """ """ Class for managing Company data import/export """

View File

@ -2,25 +2,24 @@
Provides a JSON API for the Company app Provides a JSON API for the Company app
""" """
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework as rest_filters
from rest_framework import filters
from rest_framework import generics
from django.urls import include, re_path
from django.db.models import Q from django.db.models import Q
from django.urls import include, re_path
from django_filters import rest_framework as rest_filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, generics
from InvenTree.helpers import str2bool
from InvenTree.api import AttachmentMixin from InvenTree.api import AttachmentMixin
from InvenTree.helpers import str2bool
from .models import Company from .models import (Company, ManufacturerPart, ManufacturerPartAttachment,
from .models import ManufacturerPart, ManufacturerPartAttachment, ManufacturerPartParameter ManufacturerPartParameter, SupplierPart,
from .models import SupplierPart, SupplierPriceBreak SupplierPriceBreak)
from .serializers import (CompanySerializer,
from .serializers import CompanySerializer ManufacturerPartAttachmentSerializer,
from .serializers import ManufacturerPartSerializer, ManufacturerPartAttachmentSerializer, ManufacturerPartParameterSerializer ManufacturerPartParameterSerializer,
from .serializers import SupplierPartSerializer, SupplierPriceBreakSerializer ManufacturerPartSerializer, SupplierPartSerializer,
SupplierPriceBreakSerializer)
class CompanyList(generics.ListCreateAPIView): class CompanyList(generics.ListCreateAPIView):

View File

@ -2,14 +2,13 @@
Django Forms for interacting with Company app Django Forms for interacting with Company app
""" """
from InvenTree.forms import HelperForm
from InvenTree.fields import RoundingDecimalFormField
from django.utils.translation import gettext_lazy as _
import django.forms import django.forms
from django.utils.translation import gettext_lazy as _
from .models import Company from InvenTree.fields import RoundingDecimalFormField
from .models import SupplierPriceBreak from InvenTree.forms import HelperForm
from .models import Company, SupplierPriceBreak
class CompanyImageDownloadForm(HelperForm): class CompanyImageDownloadForm(HelperForm):

View File

@ -4,32 +4,26 @@ Company database model definitions
import os import os
from django.utils.translation import gettext_lazy as _
from django.core.validators import MinValueValidator
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models import Sum, Q, UniqueConstraint
from django.apps import apps from django.apps import apps
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator
from django.db import models
from django.db.models import Q, Sum, UniqueConstraint
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from moneyed import CURRENCIES
from markdownx.models import MarkdownxField from markdownx.models import MarkdownxField
from moneyed import CURRENCIES
from stdimage.models import StdImageField from stdimage.models import StdImageField
from InvenTree.helpers import getMediaUrl, getBlankImage, getBlankThumbnail
from InvenTree.fields import InvenTreeURLField
from InvenTree.models import InvenTreeAttachment
from InvenTree.status_codes import PurchaseOrderStatus
import InvenTree.validators
import common.models import common.models
import common.settings import common.settings
import InvenTree.validators
from common.settings import currency_code_default from common.settings import currency_code_default
from InvenTree.fields import InvenTreeURLField
from InvenTree.helpers import getBlankImage, getBlankThumbnail, getMediaUrl
from InvenTree.models import InvenTreeAttachment
from InvenTree.status_codes import PurchaseOrderStatus
def rename_company_image(instance, filename): def rename_company_image(instance, filename):

View File

@ -5,22 +5,19 @@ JSON serializers for Company app
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from sql_util.utils import SubqueryCount from sql_util.utils import SubqueryCount
from InvenTree.serializers import InvenTreeAttachmentSerializer from common.settings import currency_code_default, currency_code_mappings
from InvenTree.serializers import InvenTreeDecimalField from InvenTree.serializers import (InvenTreeAttachmentSerializer,
from InvenTree.serializers import InvenTreeImageSerializerField InvenTreeDecimalField,
from InvenTree.serializers import InvenTreeModelSerializer InvenTreeImageSerializerField,
from InvenTree.serializers import InvenTreeMoneySerializer InvenTreeModelSerializer,
InvenTreeMoneySerializer)
from part.serializers import PartBriefSerializer from part.serializers import PartBriefSerializer
from .models import Company from .models import (Company, ManufacturerPart, ManufacturerPartAttachment,
from .models import ManufacturerPart, ManufacturerPartAttachment, ManufacturerPartParameter ManufacturerPartParameter, SupplierPart,
from .models import SupplierPart, SupplierPriceBreak SupplierPriceBreak)
from common.settings import currency_code_default, currency_code_mappings
class CompanyBriefSerializer(InvenTreeModelSerializer): class CompanyBriefSerializer(InvenTreeModelSerializer):

View File

@ -1,6 +1,7 @@
from rest_framework import status
from django.urls import reverse from django.urls import reverse
from rest_framework import status
from InvenTree.api_tester import InvenTreeAPITestCase from InvenTree.api_tester import InvenTreeAPITestCase
from .models import Company from .models import Company

View File

@ -1,9 +1,9 @@
""" Unit tests for Company views (see views.py) """ """ Unit tests for Company views (see views.py) """
from django.test import TestCase
from django.urls import reverse
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.test import TestCase
from django.urls import reverse
class CompanyViewTestBase(TestCase): class CompanyViewTestBase(TestCase):

View File

@ -1,13 +1,14 @@
from django.test import TestCase
from django.core.exceptions import ValidationError
import os import os
from decimal import Decimal from decimal import Decimal
from .models import Company, Contact, ManufacturerPart, SupplierPart from django.core.exceptions import ValidationError
from .models import rename_company_image from django.test import TestCase
from part.models import Part from part.models import Part
from .models import (Company, Contact, ManufacturerPart, SupplierPart,
rename_company_image)
class CompanySimpleTest(TestCase): class CompanySimpleTest(TestCase):

View File

@ -6,7 +6,6 @@ from django.urls import include, re_path
from . import views from . import views
company_detail_urls = [ company_detail_urls = [
re_path(r'^thumb-download/', views.CompanyImageDownloadFromURL.as_view(), name='company-image-download'), re_path(r'^thumb-download/', views.CompanyImageDownloadFromURL.as_view(), name='company-image-download'),

View File

@ -2,26 +2,21 @@
Django views for interacting with Company app Django views for interacting with Company app
""" """
import io
from django.core.files.base import ContentFile
from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView from django.views.generic import DetailView, ListView
from django.urls import reverse
from django.core.files.base import ContentFile
from PIL import Image
import requests import requests
import io from PIL import Image
from InvenTree.views import AjaxUpdateView from InvenTree.views import AjaxUpdateView, InvenTreeRoleMixin
from InvenTree.views import InvenTreeRoleMixin from plugin.views import InvenTreePluginViewMixin
from .models import Company
from .models import ManufacturerPart
from .models import SupplierPart
from .forms import CompanyImageDownloadForm from .forms import CompanyImageDownloadForm
from .models import Company, ManufacturerPart, SupplierPart
from plugin.views import InvenTreePluginViewMixin
class CompanyIndex(InvenTreeRoleMixin, ListView): class CompanyIndex(InvenTreeRoleMixin, ListView):

View File

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import StockItemLabel, StockLocationLabel, PartLabel from .models import PartLabel, StockItemLabel, StockLocationLabel
class LabelAdmin(admin.ModelAdmin): class LabelAdmin(admin.ModelAdmin):

View File

@ -1,30 +1,27 @@
from io import BytesIO from io import BytesIO
from PIL import Image
from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django.urls import include, re_path from django.core.exceptions import FieldError, ValidationError
from django.core.exceptions import ValidationError, FieldError
from django.http import HttpResponse, JsonResponse from django.http import HttpResponse, JsonResponse
from django.urls import include, re_path
from django.utils.translation import gettext_lazy as _
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from PIL import Image
from rest_framework import generics, filters from rest_framework import filters, generics
from rest_framework.response import Response from rest_framework.response import Response
import common.models
import InvenTree.helpers import InvenTree.helpers
from InvenTree.tasks import offload_task from InvenTree.tasks import offload_task
import common.models
from plugin.registry import registry
from stock.models import StockItem, StockLocation
from part.models import Part from part.models import Part
from plugin.base.label import label as plugin_label from plugin.base.label import label as plugin_label
from plugin.registry import registry
from stock.models import StockItem, StockLocation
from .models import StockItemLabel, StockLocationLabel, PartLabel from .models import PartLabel, StockItemLabel, StockLocationLabel
from .serializers import StockItemLabelSerializer, StockLocationLabelSerializer, PartLabelSerializer from .serializers import (PartLabelSerializer, StockItemLabelSerializer,
StockLocationLabelSerializer)
class LabelListView(generics.ListAPIView): class LabelListView(generics.ListAPIView):

View File

@ -1,7 +1,7 @@
import hashlib
import logging
import os import os
import shutil import shutil
import logging
import hashlib
import warnings import warnings
from django.apps import AppConfig from django.apps import AppConfig
@ -10,7 +10,6 @@ from django.core.exceptions import AppRegistryNotReady
from InvenTree.ready import canAppAccessDatabase from InvenTree.ready import canAppAccessDatabase
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -2,28 +2,24 @@
Label printing models Label printing models
""" """
import sys
import os
import logging
import datetime import datetime
import logging
import os
import sys
from django.conf import settings from django.conf import settings
from django.db import models from django.core.exceptions import FieldError, ValidationError
from django.urls import reverse
from django.core.validators import FileExtensionValidator, MinValueValidator from django.core.validators import FileExtensionValidator, MinValueValidator
from django.core.exceptions import ValidationError, FieldError from django.db import models
from django.template import Context, Template
from django.template import Template, Context
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from InvenTree.helpers import validateFilterString, normalize
import common.models import common.models
import stock.models
import part.models import part.models
import stock.models
from InvenTree.helpers import normalize, validateFilterString
try: try:
from django_weasyprint import WeasyTemplateResponseMixin from django_weasyprint import WeasyTemplateResponseMixin

View File

@ -1,7 +1,7 @@
from InvenTree.serializers import InvenTreeModelSerializer from InvenTree.serializers import (InvenTreeAttachmentSerializerField,
from InvenTree.serializers import InvenTreeAttachmentSerializerField InvenTreeModelSerializer)
from .models import StockItemLabel, StockLocationLabel, PartLabel from .models import PartLabel, StockItemLabel, StockLocationLabel
class StockItemLabelSerializer(InvenTreeModelSerializer): class StockItemLabelSerializer(InvenTreeModelSerializer):

View File

@ -2,18 +2,18 @@
import os import os
from django.conf import settings
from django.apps import apps from django.apps import apps
from django.urls import reverse from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import reverse
from InvenTree.helpers import validateFilterString
from InvenTree.api_tester import InvenTreeAPITestCase from InvenTree.api_tester import InvenTreeAPITestCase
from InvenTree.helpers import validateFilterString
from .models import StockItemLabel, StockLocationLabel, PartLabel
from part.models import Part from part.models import Part
from stock.models import StockItem from stock.models import StockItem
from .models import PartLabel, StockItemLabel, StockLocationLabel
class LabelTest(InvenTreeAPITestCase): class LabelTest(InvenTreeAPITestCase):

View File

@ -1,14 +1,14 @@
from django.contrib import admin from django.contrib import admin
import import_export.widgets as widgets
from import_export.admin import ImportExportModelAdmin from import_export.admin import ImportExportModelAdmin
from import_export.fields import Field from import_export.fields import Field
from import_export.resources import ModelResource from import_export.resources import ModelResource
import import_export.widgets as widgets
from .models import PurchaseOrder, PurchaseOrderLineItem, PurchaseOrderExtraLine from .models import (PurchaseOrder, PurchaseOrderExtraLine,
from .models import SalesOrder, SalesOrderLineItem, SalesOrderExtraLine PurchaseOrderLineItem, SalesOrder, SalesOrderAllocation,
from .models import SalesOrderShipment, SalesOrderAllocation SalesOrderExtraLine, SalesOrderLineItem,
SalesOrderShipment)
# region general classes # region general classes

View File

@ -2,29 +2,25 @@
JSON API for the Order app JSON API for the Order app
""" """
from django.db.models import F, Q
from django.urls import include, path, re_path from django.urls import include, path, re_path
from django.db.models import Q, F
from django_filters import rest_framework as rest_filters from django_filters import rest_framework as rest_filters
from rest_framework import generics from rest_framework import filters, generics, status
from rest_framework import filters, status
from rest_framework.response import Response from rest_framework.response import Response
from company.models import SupplierPart
from InvenTree.filters import InvenTreeOrderingFilter
from InvenTree.helpers import str2bool, DownloadFile
from InvenTree.api import AttachmentMixin, APIDownloadMixin
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus
from order.admin import PurchaseOrderResource, PurchaseOrderLineItemResource
from order.admin import SalesOrderResource
import order.models as models import order.models as models
import order.serializers as serializers import order.serializers as serializers
from company.models import SupplierPart
from InvenTree.api import APIDownloadMixin, AttachmentMixin
from InvenTree.filters import InvenTreeOrderingFilter
from InvenTree.helpers import DownloadFile, str2bool
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus
from order.admin import (PurchaseOrderLineItemResource, PurchaseOrderResource,
SalesOrderResource)
from part.models import Part from part.models import Part
from users.models import Owner
from plugin.serializers import MetadataSerializer from plugin.serializers import MetadataSerializer
from users.models import Owner
class GeneralExtraLineList: class GeneralExtraLineList:

View File

@ -5,11 +5,9 @@ Django Forms for interacting with Order objects
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from InvenTree.fields import InvenTreeMoneyField
from InvenTree.helpers import clean_decimal
from common.forms import MatchItemForm from common.forms import MatchItemForm
from InvenTree.fields import InvenTreeMoneyField
from InvenTree.helpers import clean_decimal
class OrderMatchItemForm(MatchItemForm): class OrderMatchItemForm(MatchItemForm):

View File

@ -5,42 +5,38 @@ Order model definitions
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
from datetime import datetime from datetime import datetime
from decimal import Decimal from decimal import Decimal
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator
from django.db import models, transaction from django.db import models, transaction
from django.db.models import Q, F, Sum from django.db.models import F, Q, Sum
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch.dispatcher import receiver from django.dispatch.dispatcher import receiver
from django.core.validators import MinValueValidator
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from djmoney.contrib.exchange.models import convert_money
from djmoney.money import Money
from markdownx.models import MarkdownxField from markdownx.models import MarkdownxField
from mptt.models import TreeForeignKey from mptt.models import TreeForeignKey
from djmoney.contrib.exchange.models import convert_money import InvenTree.helpers
from djmoney.money import Money
from common.settings import currency_code_default from common.settings import currency_code_default
from users import models as UserModels
from part import models as PartModels
from stock import models as stock_models
from company.models import Company, SupplierPart from company.models import Company, SupplierPart
from InvenTree.fields import InvenTreeModelMoneyField, RoundingDecimalField
from InvenTree.helpers import decimal2string, getSetting, increment
from InvenTree.models import InvenTreeAttachment, ReferenceIndexingMixin
from InvenTree.status_codes import (PurchaseOrderStatus, SalesOrderStatus,
StockHistoryCode, StockStatus)
from part import models as PartModels
from plugin.events import trigger_event from plugin.events import trigger_event
from plugin.models import MetadataMixin from plugin.models import MetadataMixin
from stock import models as stock_models
import InvenTree.helpers from users import models as UserModels
from InvenTree.fields import InvenTreeModelMoneyField, RoundingDecimalField
from InvenTree.helpers import decimal2string, increment, getSetting
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockStatus, StockHistoryCode
from InvenTree.models import InvenTreeAttachment, ReferenceIndexingMixin
def get_next_po_number(): def get_next_po_number():

View File

@ -4,36 +4,30 @@ JSON serializers for the Order API
from decimal import Decimal from decimal import Decimal
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError as DjangoValidationError from django.core.exceptions import ValidationError as DjangoValidationError
from django.db import models, transaction from django.db import models, transaction
from django.db.models import Case, When, Value from django.db.models import (BooleanField, Case, ExpressionWrapper, F, Q,
from django.db.models import BooleanField, ExpressionWrapper, F, Q Value, When)
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from sql_util.utils import SubqueryCount from sql_util.utils import SubqueryCount
from common.settings import currency_code_mappings
from company.serializers import CompanyBriefSerializer, SupplierPartSerializer
from InvenTree.serializers import InvenTreeAttachmentSerializer
from InvenTree.helpers import normalize, extract_serial_numbers
from InvenTree.serializers import InvenTreeModelSerializer
from InvenTree.serializers import InvenTreeDecimalField
from InvenTree.serializers import InvenTreeMoneySerializer
from InvenTree.serializers import ReferenceIndexingSerializerMixin
from InvenTree.status_codes import StockStatus, PurchaseOrderStatus, SalesOrderStatus
import order.models import order.models
from part.serializers import PartBriefSerializer
import stock.models import stock.models
import stock.serializers import stock.serializers
from common.settings import currency_code_mappings
from company.serializers import CompanyBriefSerializer, SupplierPartSerializer
from InvenTree.helpers import extract_serial_numbers, normalize
from InvenTree.serializers import (InvenTreeAttachmentSerializer,
InvenTreeDecimalField,
InvenTreeModelSerializer,
InvenTreeMoneySerializer,
ReferenceIndexingSerializerMixin)
from InvenTree.status_codes import (PurchaseOrderStatus, SalesOrderStatus,
StockStatus)
from part.serializers import PartBriefSerializer
from users.serializers import OwnerSerializer from users.serializers import OwnerSerializer

View File

@ -3,20 +3,17 @@ Tests for the Order API
""" """
import io import io
from datetime import datetime, timedelta from datetime import datetime, timedelta
from rest_framework import status
from django.urls import reverse from django.urls import reverse
from InvenTree.api_tester import InvenTreeAPITestCase from rest_framework import status
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus
from part.models import Part
from stock.models import StockItem
import order.models as models import order.models as models
from InvenTree.api_tester import InvenTreeAPITestCase
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus
from part.models import Part
from stock.models import StockItem
class OrderTest(InvenTreeAPITestCase): class OrderTest(InvenTreeAPITestCase):

View File

@ -1,21 +1,16 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.test import TestCase
from django.core.exceptions import ValidationError
from datetime import datetime, timedelta from datetime import datetime, timedelta
from company.models import Company from django.core.exceptions import ValidationError
from django.test import TestCase
from InvenTree import status_codes as status
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
from company.models import Company
from order.models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation, SalesOrderShipment from InvenTree import status_codes as status
from order.models import (SalesOrder, SalesOrderAllocation, SalesOrderLineItem,
SalesOrderShipment)
from part.models import Part from part.models import Part
from stock.models import StockItem from stock.models import StockItem

View File

@ -1,9 +1,9 @@
""" Unit tests for Order views (see views.py) """ """ Unit tests for Order views (see views.py) """
from django.test import TestCase
from django.urls import reverse
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.test import TestCase
from django.urls import reverse
class OrderViewTestCase(TestCase): class OrderViewTestCase(TestCase):

View File

@ -2,15 +2,15 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.test import TestCase
import django.core.exceptions as django_exceptions import django.core.exceptions as django_exceptions
from django.test import TestCase
from part.models import Part
from .models import PurchaseOrder, PurchaseOrderLineItem
from stock.models import StockLocation
from company.models import SupplierPart from company.models import SupplierPart
from InvenTree.status_codes import PurchaseOrderStatus from InvenTree.status_codes import PurchaseOrderStatus
from part.models import Part
from stock.models import StockLocation
from .models import PurchaseOrder, PurchaseOrderLineItem
class OrderTest(TestCase): class OrderTest(TestCase):

View File

@ -2,36 +2,32 @@
Django views for interacting with Order app Django views for interacting with Order app
""" """
from django.db.utils import IntegrityError
from django.http.response import JsonResponse
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.http import HttpResponseRedirect
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView
from django.forms import HiddenInput, IntegerField
import logging import logging
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
from .models import PurchaseOrder, PurchaseOrderLineItem from django.db.utils import IntegrityError
from .models import SalesOrder, SalesOrderLineItem from django.forms import HiddenInput, IntegerField
from .admin import PurchaseOrderLineItemResource, SalesOrderLineItemResource from django.http import HttpResponseRedirect
from company.models import SupplierPart # ManufacturerPart from django.http.response import JsonResponse
from part.models import Part from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView
from common.forms import UploadFileForm, MatchFieldForm
from common.views import FileManagementFormView
from common.files import FileManager from common.files import FileManager
from common.forms import MatchFieldForm, UploadFileForm
from . import forms as order_forms from common.views import FileManagementFormView
from part.views import PartPricing from company.models import SupplierPart # ManufacturerPart
from InvenTree.helpers import DownloadFile from InvenTree.helpers import DownloadFile
from InvenTree.views import InvenTreeRoleMixin, AjaxView from InvenTree.views import AjaxView, InvenTreeRoleMixin
from part.models import Part
from part.views import PartPricing
from plugin.views import InvenTreePluginViewMixin from plugin.views import InvenTreePluginViewMixin
from . import forms as order_forms
from .admin import PurchaseOrderLineItemResource, SalesOrderLineItemResource
from .models import (PurchaseOrder, PurchaseOrderLineItem, SalesOrder,
SalesOrderLineItem)
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -1,12 +1,12 @@
from django.contrib import admin from django.contrib import admin
import import_export.widgets as widgets
from import_export.admin import ImportExportModelAdmin from import_export.admin import ImportExportModelAdmin
from import_export.fields import Field from import_export.fields import Field
from import_export.resources import ModelResource from import_export.resources import ModelResource
import import_export.widgets as widgets
from company.models import SupplierPart
import part.models as models import part.models as models
from company.models import SupplierPart
from stock.models import StockLocation from stock.models import StockLocation

View File

@ -3,53 +3,41 @@ Provides a JSON API for the Part app
""" """
import datetime import datetime
from django.urls import include, path, re_path
from django.http import JsonResponse
from django.db.models import Q, F, Count, Min, Max, Avg
from django.db import transaction
from django.utils.translation import gettext_lazy as _
from rest_framework import status
from rest_framework.response import Response
from rest_framework import filters, serializers
from rest_framework import generics
from rest_framework.exceptions import ValidationError
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework as rest_filters
from djmoney.money import Money
from djmoney.contrib.exchange.models import convert_money
from djmoney.contrib.exchange.exceptions import MissingRate
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
from part.admin import PartResource from django.db import transaction
from django.db.models import Avg, Count, F, Max, Min, Q
from django.http import JsonResponse
from django.urls import include, path, re_path
from django.utils.translation import gettext_lazy as _
from .models import Part, PartCategory, PartRelated from django_filters import rest_framework as rest_filters
from .models import BomItem, BomItemSubstitute from django_filters.rest_framework import DjangoFilterBackend
from .models import PartParameter, PartParameterTemplate from djmoney.contrib.exchange.exceptions import MissingRate
from .models import PartAttachment, PartTestTemplate from djmoney.contrib.exchange.models import convert_money
from .models import PartSellPriceBreak, PartInternalPriceBreak from djmoney.money import Money
from .models import PartCategoryParameterTemplate from rest_framework import filters, generics, serializers, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
import order.models
from build.models import Build, BuildItem
from common.models import InvenTreeSetting
from company.models import Company, ManufacturerPart, SupplierPart from company.models import Company, ManufacturerPart, SupplierPart
from InvenTree.api import APIDownloadMixin, AttachmentMixin
from InvenTree.helpers import DownloadFile, increment, isNull, str2bool
from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
SalesOrderStatus)
from part.admin import PartResource
from plugin.serializers import MetadataSerializer
from stock.models import StockItem, StockLocation from stock.models import StockItem, StockLocation
from common.models import InvenTreeSetting
from build.models import Build, BuildItem
import order.models
from plugin.serializers import MetadataSerializer
from . import serializers as part_serializers from . import serializers as part_serializers
from .models import (BomItem, BomItemSubstitute, Part, PartAttachment,
from InvenTree.helpers import str2bool, isNull, increment PartCategory, PartCategoryParameterTemplate,
from InvenTree.helpers import DownloadFile PartInternalPriceBreak, PartParameter,
from InvenTree.api import AttachmentMixin, APIDownloadMixin PartParameterTemplate, PartRelated, PartSellPriceBreak,
PartTestTemplate)
from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus, SalesOrderStatus
class CategoryList(generics.ListCreateAPIView): class CategoryList(generics.ListCreateAPIView):

View File

@ -1,11 +1,10 @@
import logging import logging
from django.db.utils import OperationalError, ProgrammingError
from django.apps import AppConfig from django.apps import AppConfig
from django.db.utils import OperationalError, ProgrammingError
from InvenTree.ready import canAppAccessDatabase from InvenTree.ready import canAppAccessDatabase
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -7,11 +7,11 @@ from collections import OrderedDict
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from company.models import ManufacturerPart, SupplierPart
from InvenTree.helpers import DownloadFile, GetExportFormats, normalize from InvenTree.helpers import DownloadFile, GetExportFormats, normalize
from .admin import BomItemResource from .admin import BomItemResource
from .models import BomItem from .models import BomItem
from company.models import ManufacturerPart, SupplierPart
def IsValidBOMFormat(fmt): def IsValidBOMFormat(fmt):

View File

@ -7,17 +7,15 @@ from django.utils.translation import gettext_lazy as _
from mptt.fields import TreeNodeChoiceField from mptt.fields import TreeNodeChoiceField
from InvenTree.forms import HelperForm
from InvenTree.helpers import clean_decimal
from InvenTree.fields import RoundingDecimalFormField
import common.models import common.models
from common.forms import MatchItemForm from common.forms import MatchItemForm
from InvenTree.fields import RoundingDecimalFormField
from InvenTree.forms import HelperForm
from InvenTree.helpers import clean_decimal
from .models import Part, PartCategory from .models import (Part, PartCategory, PartCategoryParameterTemplate,
from .models import PartParameterTemplate PartInternalPriceBreak, PartParameterTemplate,
from .models import PartCategoryParameterTemplate PartSellPriceBreak)
from .models import PartSellPriceBreak, PartInternalPriceBreak
class PartModelChoiceField(forms.ModelChoiceField): class PartModelChoiceField(forms.ModelChoiceField):

View File

@ -3,64 +3,52 @@ Part database model definitions
""" """
import decimal import decimal
import hashlib
import os
import logging import logging
import os
from django.utils.translation import gettext_lazy as _ from datetime import datetime
from django.core.exceptions import ValidationError from decimal import Decimal, InvalidOperation
from django.urls import reverse
from django.db import models, transaction
from django.db.utils import IntegrityError
from django.db.models import Q, Sum, UniqueConstraint
from django.db.models.functions import Coalesce
from django.core.validators import MinValueValidator
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator
from django.db import models, transaction
from django.db.models import Q, Sum, UniqueConstraint
from django.db.models.functions import Coalesce
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.db.utils import IntegrityError
from django.dispatch import receiver from django.dispatch import receiver
from django.urls import reverse
from jinja2 import Template from django.utils.translation import gettext_lazy as _
from markdownx.models import MarkdownxField
from django_cleanup import cleanup from django_cleanup import cleanup
from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import convert_money
from mptt.models import TreeForeignKey, MPTTModel from jinja2 import Template
from markdownx.models import MarkdownxField
from mptt.exceptions import InvalidMove from mptt.exceptions import InvalidMove
from mptt.managers import TreeManager from mptt.managers import TreeManager
from mptt.models import MPTTModel, TreeForeignKey
from stdimage.models import StdImageField from stdimage.models import StdImageField
from decimal import Decimal, InvalidOperation import common.models
from datetime import datetime
import hashlib
from djmoney.contrib.exchange.models import convert_money
from common.settings import currency_code_default
from common.models import InvenTreeSetting
from InvenTree import helpers
from InvenTree import validators
import InvenTree.ready import InvenTree.ready
import InvenTree.tasks import InvenTree.tasks
from InvenTree.fields import InvenTreeURLField
from InvenTree.helpers import decimal2string, normalize, decimal2money
from InvenTree.models import InvenTreeTree, InvenTreeAttachment, DataImportMixin
from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus, SalesOrderStatus
import common.models
from build import models as BuildModels
from order import models as OrderModels
from company.models import SupplierPart
import part.settings as part_settings import part.settings as part_settings
from stock import models as StockModels from build import models as BuildModels
from common.models import InvenTreeSetting
from common.settings import currency_code_default
from company.models import SupplierPart
from InvenTree import helpers, validators
from InvenTree.fields import InvenTreeURLField
from InvenTree.helpers import decimal2money, decimal2string, normalize
from InvenTree.models import (DataImportMixin, InvenTreeAttachment,
InvenTreeTree)
from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
SalesOrderStatus)
from order import models as OrderModels
from plugin.models import MetadataMixin from plugin.models import MetadataMixin
from stock import models as StockModels
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -5,40 +5,35 @@ JSON serializers for Part app
import imghdr import imghdr
from decimal import Decimal from decimal import Decimal
from django.urls import reverse_lazy
from django.db import models, transaction from django.db import models, transaction
from django.db.models import ExpressionWrapper, F, Q, Func from django.db.models import (ExpressionWrapper, F, FloatField, Func, OuterRef,
from django.db.models import Subquery, OuterRef, FloatField Q, Subquery)
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from djmoney.contrib.django_rest_framework import MoneyField
from rest_framework import serializers from rest_framework import serializers
from sql_util.utils import SubqueryCount, SubquerySum from sql_util.utils import SubqueryCount, SubquerySum
from djmoney.contrib.django_rest_framework import MoneyField
from common.settings import currency_code_default, currency_code_mappings from common.settings import currency_code_default, currency_code_mappings
from InvenTree.serializers import (DataFileExtractSerializer,
from InvenTree.serializers import (DataFileUploadSerializer, DataFileUploadSerializer,
DataFileExtractSerializer, InvenTreeAttachmentSerializer,
InvenTreeAttachmentSerializerField, InvenTreeAttachmentSerializerField,
InvenTreeDecimalField, InvenTreeDecimalField,
InvenTreeImageSerializerField, InvenTreeImageSerializerField,
InvenTreeModelSerializer, InvenTreeModelSerializer,
InvenTreeAttachmentSerializer,
InvenTreeMoneySerializer) InvenTreeMoneySerializer)
from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
from InvenTree.status_codes import (BuildStatus,
PurchaseOrderStatus,
SalesOrderStatus) SalesOrderStatus)
from stock.models import StockItem from stock.models import StockItem
from .models import (BomItem, BomItemSubstitute, from .models import (BomItem, BomItemSubstitute, Part, PartAttachment,
Part, PartAttachment, PartCategory, PartRelated, PartCategory, PartCategoryParameterTemplate,
PartParameter, PartParameterTemplate, PartSellPriceBreak, PartInternalPriceBreak, PartParameter,
PartStar, PartTestTemplate, PartCategoryParameterTemplate, PartParameterTemplate, PartRelated, PartSellPriceBreak,
PartInternalPriceBreak) PartStar, PartTestTemplate)
class CategorySerializer(InvenTreeModelSerializer): class CategorySerializer(InvenTreeModelSerializer):

View File

@ -2,10 +2,9 @@ import logging
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
import common.notifications
import InvenTree.helpers import InvenTree.helpers
import InvenTree.tasks import InvenTree.tasks
import common.notifications
import part.models import part.models
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")

View File

@ -5,30 +5,25 @@ This module provides template tags for extra functionality,
over and above the built-in Django tags. over and above the built-in Django tags.
""" """
from datetime import date, datetime import logging
import os import os
import sys import sys
import logging from datetime import date, datetime
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from django.conf import settings as djangosettings
from django import template from django import template
from django.urls import reverse from django.conf import settings as djangosettings
from django.utils.safestring import mark_safe
from django.templatetags.static import StaticNode, static
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.templatetags.static import StaticNode, static
from InvenTree import version, settings from django.urls import reverse
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
import InvenTree.helpers import InvenTree.helpers
from common.models import ColorTheme, InvenTreeSetting, InvenTreeUserSetting
from common.models import InvenTreeSetting, ColorTheme, InvenTreeUserSetting
from common.settings import currency_code_default from common.settings import currency_code_default
from InvenTree import settings, version
from plugin.models import PluginSetting, NotificationUserSetting from plugin.models import NotificationUserSetting, PluginSetting
register = template.Library() register = template.Library()

View File

@ -4,8 +4,9 @@ Provide templates for the various model status codes.
from django import template from django import template
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus
from InvenTree.status_codes import StockStatus, BuildStatus from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
SalesOrderStatus, StockStatus)
register = template.Library() register = template.Library()

View File

@ -1,21 +1,18 @@
import PIL
from django.urls import reverse from django.urls import reverse
import PIL
from rest_framework import status from rest_framework import status
from rest_framework.test import APIClient from rest_framework.test import APIClient
from InvenTree.api_tester import InvenTreeAPITestCase
from InvenTree.status_codes import BuildStatus, StockStatus, PurchaseOrderStatus
from part.models import Part, PartCategory
from part.models import BomItem, BomItemSubstitute
from stock.models import StockItem, StockLocation
from company.models import Company
from common.models import InvenTreeSetting
import build.models import build.models
import order.models import order.models
from common.models import InvenTreeSetting
from company.models import Company
from InvenTree.api_tester import InvenTreeAPITestCase
from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus,
StockStatus)
from part.models import BomItem, BomItemSubstitute, Part, PartCategory
from stock.models import StockItem, StockLocation
class PartCategoryAPITest(InvenTreeAPITestCase): class PartCategoryAPITest(InvenTreeAPITestCase):

View File

@ -4,11 +4,10 @@ Unit testing for BOM export functionality
import csv import csv
from django.test import TestCase
from django.urls import reverse
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.test import TestCase
from django.urls import reverse
class BomExportTest(TestCase): class BomExportTest(TestCase):

View File

@ -2,13 +2,12 @@
Unit testing for BOM upload / import functionality Unit testing for BOM upload / import functionality
""" """
import tablib
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse from django.urls import reverse
from InvenTree.api_tester import InvenTreeAPITestCase import tablib
from InvenTree.api_tester import InvenTreeAPITestCase
from part.models import Part from part.models import Part

View File

@ -1,11 +1,11 @@
from django.db import transaction
from django.test import TestCase
import django.core.exceptions as django_exceptions
from decimal import Decimal from decimal import Decimal
from .models import Part, BomItem, BomItemSubstitute import django.core.exceptions as django_exceptions
from django.db import transaction
from django.test import TestCase
from .models import BomItem, BomItemSubstitute, Part
class BomItemTest(TestCase): class BomItemTest(TestCase):

View File

@ -1,5 +1,5 @@
from django.test import TestCase
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.test import TestCase
from .models import Part, PartCategory, PartParameter, PartParameterTemplate from .models import Part, PartCategory, PartParameter, PartParameterTemplate

View File

@ -1,11 +1,10 @@
# Tests for Part Parameters # Tests for Part Parameters
from django.test import TestCase, TransactionTestCase
import django.core.exceptions as django_exceptions import django.core.exceptions as django_exceptions
from django.test import TestCase, TransactionTestCase
from .models import Part, PartCategory from .models import (Part, PartCategory, PartCategoryParameterTemplate,
from .models import PartParameter, PartParameterTemplate PartParameter, PartParameterTemplate)
from .models import PartCategoryParameterTemplate
class TestParams(TestCase): class TestParams(TestCase):

View File

@ -1,24 +1,23 @@
# Tests for the Part model # Tests for the Part model
from allauth.account.models import EmailAddress
from django.conf import settings
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.core.exceptions import ValidationError
import os import os
from .models import Part, PartCategory, PartCategoryStar, PartStar, PartTestTemplate from django.conf import settings
from .models import rename_part_image from django.contrib.auth import get_user_model
from .templatetags import inventree_extras from django.core.exceptions import ValidationError
from django.test import TestCase
from allauth.account.models import EmailAddress
import part.settings import part.settings
from common.models import (InvenTreeSetting, InvenTreeUserSetting,
NotificationEntry, NotificationMessage)
from common.notifications import UIMessageNotification, storage
from InvenTree import version from InvenTree import version
from common.models import InvenTreeSetting, InvenTreeUserSetting, NotificationEntry, NotificationMessage
from common.notifications import storage, UIMessageNotification from .models import (Part, PartCategory, PartCategoryStar, PartStar,
PartTestTemplate, rename_part_image)
from .templatetags import inventree_extras
class TemplateTagTest(TestCase): class TemplateTagTest(TestCase):

View File

@ -1,9 +1,9 @@
""" Unit tests for Part Views (see views.py) """ """ Unit tests for Part Views (see views.py) """
from django.test import TestCase
from django.urls import reverse
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.test import TestCase
from django.urls import reverse
from .models import Part from .models import Part

View File

@ -12,7 +12,6 @@ from django.urls import include, re_path
from . import views from . import views
part_parameter_urls = [ part_parameter_urls = [
re_path(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'), re_path(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'),
re_path(r'^template/(?P<pk>\d+)/edit/', views.PartParameterTemplateEdit.as_view(), name='part-param-template-edit'), re_path(r'^template/(?P<pk>\d+)/edit/', views.PartParameterTemplateEdit.as_view(), name='part-param-template-edit'),

View File

@ -2,55 +2,44 @@
Django views for interacting with Part app Django views for interacting with Part app
""" """
from django.core.files.base import ContentFile
from django.core.exceptions import ValidationError
from django.db import transaction
from django.db.utils import IntegrityError
from django.shortcuts import get_object_or_404
from django.shortcuts import HttpResponseRedirect
from django.utils.translation import gettext_lazy as _
from django.urls import reverse
from django.views.generic import DetailView, ListView
from django.forms import HiddenInput
from django.conf import settings
from django.contrib import messages
from djmoney.contrib.exchange.models import convert_money
from djmoney.contrib.exchange.exceptions import MissingRate
from PIL import Image
import requests
import os
import io import io
import os
from decimal import Decimal from decimal import Decimal
from .models import PartCategory, Part from django.conf import settings
from .models import PartParameterTemplate from django.contrib import messages
from .models import PartCategoryParameterTemplate from django.core.exceptions import ValidationError
from django.core.files.base import ContentFile
from django.db import transaction
from django.db.utils import IntegrityError
from django.forms import HiddenInput
from django.shortcuts import HttpResponseRedirect, get_object_or_404
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView
from common.models import InvenTreeSetting import requests
from company.models import SupplierPart from djmoney.contrib.exchange.exceptions import MissingRate
from common.files import FileManager from djmoney.contrib.exchange.models import convert_money
from common.views import FileManagementFormView, FileManagementAjaxView from PIL import Image
from stock.models import StockItem, StockLocation
import common.settings as inventree_settings import common.settings as inventree_settings
from common.files import FileManager
from common.models import InvenTreeSetting
from common.views import FileManagementAjaxView, FileManagementFormView
from company.models import SupplierPart
from InvenTree.helpers import str2bool
from InvenTree.views import (AjaxCreateView, AjaxDeleteView, AjaxUpdateView,
AjaxView, InvenTreeRoleMixin, QRCodeView)
from order.models import PurchaseOrderLineItem
from plugin.views import InvenTreePluginViewMixin
from stock.models import StockItem, StockLocation
from . import forms as part_forms from . import forms as part_forms
from . import settings as part_settings from . import settings as part_settings
from .bom import MakeBomTemplate, ExportBom, IsValidBOMFormat from .bom import ExportBom, IsValidBOMFormat, MakeBomTemplate
from order.models import PurchaseOrderLineItem from .models import (Part, PartCategory, PartCategoryParameterTemplate,
PartParameterTemplate)
from InvenTree.views import AjaxView, AjaxCreateView, AjaxUpdateView, AjaxDeleteView
from InvenTree.views import QRCodeView
from InvenTree.views import InvenTreeRoleMixin
from InvenTree.helpers import str2bool
from plugin.views import InvenTreePluginViewMixin
class PartIndex(InvenTreeRoleMixin, ListView): class PartIndex(InvenTreeRoleMixin, ListView):

View File

@ -2,9 +2,9 @@
Utility file to enable simper imports Utility file to enable simper imports
""" """
from .helpers import MixinImplementationError, MixinNotImplementedError
from .plugin import IntegrationPluginBase, InvenTreePlugin
from .registry import registry from .registry import registry
from .plugin import InvenTreePlugin, IntegrationPluginBase
from .helpers import MixinNotImplementedError, MixinImplementationError
__all__ = [ __all__ = [
'registry', 'registry',

View File

@ -5,18 +5,17 @@ JSON API for the plugin app
from django.conf import settings from django.conf import settings
from django.urls import include, re_path from django.urls import include, re_path
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, generics, permissions, status from rest_framework import filters, generics, permissions, status
from rest_framework.exceptions import NotFound from rest_framework.exceptions import NotFound
from rest_framework.response import Response from rest_framework.response import Response
from django_filters.rest_framework import DjangoFilterBackend import plugin.serializers as PluginSerializers
from common.api import GlobalSettingsPermissions from common.api import GlobalSettingsPermissions
from plugin.base.barcodes.api import barcode_api_urls
from plugin.base.action.api import ActionPluginView from plugin.base.action.api import ActionPluginView
from plugin.base.barcodes.api import barcode_api_urls
from plugin.base.locate.api import LocatePluginView from plugin.base.locate.api import LocatePluginView
from plugin.models import PluginConfig, PluginSetting from plugin.models import PluginConfig, PluginSetting
import plugin.serializers as PluginSerializers
from plugin.registry import registry from plugin.registry import registry

View File

@ -11,7 +11,6 @@ from InvenTree.ready import canAppAccessDatabase
from plugin import registry from plugin import registry
from plugin.helpers import check_git_version, log_error from plugin.helpers import check_git_version, log_error
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -1,7 +1,7 @@
""" Unit tests for action plugins """ """ Unit tests for action plugins """
from django.test import TestCase
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import TestCase
from plugin import InvenTreePlugin from plugin import InvenTreePlugin
from plugin.mixins import ActionMixin from plugin.mixins import ActionMixin

View File

@ -1,19 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.urls import reverse, path, re_path from django.urls import path, re_path, reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework.exceptions import ValidationError
from rest_framework import permissions from rest_framework import permissions
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from plugin import registry
from plugin.base.barcodes.mixins import hash_barcode
from plugin.builtin.barcodes.inventree_barcode import InvenTreeBarcodePlugin
from stock.models import StockItem from stock.models import StockItem
from stock.serializers import StockItemSerializer from stock.serializers import StockItemSerializer
from plugin.builtin.barcodes.inventree_barcode import InvenTreeBarcodePlugin
from plugin.base.barcodes.mixins import hash_barcode
from plugin import registry
class BarcodeScan(APIView): class BarcodeScan(APIView):
""" """

View File

@ -1,12 +1,12 @@
""" """
Plugin mixin classes for barcode plugin Plugin mixin classes for barcode plugin
""" """
import string
import hashlib import hashlib
import string
from stock.models import StockItem
from stock.serializers import StockItemSerializer, LocationSerializer
from part.serializers import PartSerializer from part.serializers import PartSerializer
from stock.models import StockItem
from stock.serializers import LocationSerializer, StockItemSerializer
def hash_barcode(barcode_data): def hash_barcode(barcode_data):

View File

@ -7,8 +7,8 @@ Unit tests for Barcode endpoints
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.urls import reverse from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status from rest_framework import status
from rest_framework.test import APITestCase
from stock.models import StockItem from stock.models import StockItem

View File

@ -6,15 +6,13 @@ import logging
from django.conf import settings from django.conf import settings
from django.db import transaction from django.db import transaction
from django.db.models.signals import post_save, post_delete from django.db.models.signals import post_delete, post_save
from django.dispatch.dispatcher import receiver from django.dispatch.dispatcher import receiver
from InvenTree.ready import canAppAccessDatabase, isImportingData from InvenTree.ready import canAppAccessDatabase, isImportingData
from InvenTree.tasks import offload_task from InvenTree.tasks import offload_task
from plugin.registry import registry from plugin.registry import registry
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

View File

@ -2,22 +2,21 @@
Plugin mixin classes Plugin mixin classes
""" """
import logging
import json import json
import logging
from django.db.utils import OperationalError, ProgrammingError
from django.urls import include, re_path
import requests import requests
from django.urls import include, re_path
from django.db.utils import OperationalError, ProgrammingError
import InvenTree.helpers import InvenTree.helpers
from plugin.helpers import (MixinImplementationError, MixinNotImplementedError,
from plugin.helpers import MixinImplementationError, MixinNotImplementedError render_template, render_text)
from plugin.helpers import render_template, render_text
from plugin.models import PluginConfig, PluginSetting from plugin.models import PluginConfig, PluginSetting
from plugin.registry import registry from plugin.registry import registry
from plugin.urls import PLUGIN_BASE from plugin.urls import PLUGIN_BASE
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')

Some files were not shown because too many files have changed in this diff Show More