From e1d22f538dda1eff1b7915a6a17fffa889d5500f Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Fri, 20 May 2022 17:24:51 +0200 Subject: [PATCH] resort imports --- InvenTree/InvenTree/api.py | 11 ++- InvenTree/InvenTree/api_tester.py | 3 +- InvenTree/InvenTree/apps.py | 8 +-- InvenTree/InvenTree/ci_render_js.py | 6 +- InvenTree/InvenTree/config.py | 3 +- InvenTree/InvenTree/context.py | 8 +-- InvenTree/InvenTree/exceptions.py | 7 +- InvenTree/InvenTree/exchange.py | 11 +-- InvenTree/InvenTree/fields.py | 22 +++--- InvenTree/InvenTree/forms.py | 20 +++--- InvenTree/InvenTree/helpers.py | 24 +++---- .../management/commands/clean_settings.py | 1 - .../management/commands/prerender.py | 8 +-- .../management/commands/rebuild_thumbnails.py | 11 ++- .../management/commands/remove_mfa.py | 2 +- .../management/commands/wait_for_db.py | 9 ++- InvenTree/InvenTree/metadata.py | 6 +- InvenTree/InvenTree/middleware.py | 13 ++-- InvenTree/InvenTree/models.py | 12 ++-- InvenTree/InvenTree/serializers.py | 13 ++-- InvenTree/InvenTree/settings.py | 17 ++--- InvenTree/InvenTree/status.py | 10 ++- InvenTree/InvenTree/tasks.py | 19 ++--- InvenTree/InvenTree/test_api.py | 11 ++- InvenTree/InvenTree/test_middleware.py | 3 +- InvenTree/InvenTree/test_tasks.py | 5 +- InvenTree/InvenTree/test_urls.py | 7 +- InvenTree/InvenTree/test_views.py | 4 +- InvenTree/InvenTree/tests.py | 29 +++----- InvenTree/InvenTree/urls.py | 62 ++++++++-------- InvenTree/InvenTree/validators.py | 6 +- InvenTree/InvenTree/version.py | 6 +- InvenTree/InvenTree/views.py | 33 +++++---- InvenTree/common/api.py | 12 ++-- InvenTree/common/apps.py | 1 - InvenTree/common/files.py | 7 +- InvenTree/common/models.py | 36 +++++----- InvenTree/common/notifications.py | 3 +- InvenTree/common/serializers.py | 8 +-- InvenTree/common/settings.py | 4 +- InvenTree/common/tasks.py | 3 +- InvenTree/common/test_notifications.py | 7 +- InvenTree/common/test_tasks.py | 3 +- InvenTree/common/tests.py | 9 +-- InvenTree/common/views.py | 4 +- InvenTree/company/admin.py | 15 ++-- InvenTree/company/api.py | 29 ++++---- InvenTree/company/forms.py | 11 ++- InvenTree/company/models.py | 28 +++----- InvenTree/company/serializers.py | 21 +++--- InvenTree/company/test_api.py | 3 +- InvenTree/company/test_views.py | 4 +- InvenTree/company/tests.py | 11 +-- InvenTree/company/urls.py | 1 - InvenTree/company/views.py | 21 +++--- InvenTree/label/admin.py | 2 +- InvenTree/label/api.py | 25 +++---- InvenTree/label/apps.py | 5 +- InvenTree/label/models.py | 22 +++--- InvenTree/label/serializers.py | 6 +- InvenTree/label/tests.py | 10 +-- InvenTree/order/admin.py | 10 +-- InvenTree/order/api.py | 24 +++---- InvenTree/order/forms.py | 6 +- InvenTree/order/models.py | 34 ++++----- InvenTree/order/serializers.py | 34 ++++----- InvenTree/order/test_api.py | 13 ++-- InvenTree/order/test_sales_order.py | 17 ++--- InvenTree/order/test_views.py | 4 +- InvenTree/order/tests.py | 10 +-- InvenTree/order/views.py | 40 +++++------ InvenTree/part/admin.py | 4 +- InvenTree/part/api.py | 66 +++++++---------- InvenTree/part/apps.py | 3 +- InvenTree/part/bom.py | 2 +- InvenTree/part/forms.py | 14 ++-- InvenTree/part/models.py | 72 ++++++++----------- InvenTree/part/serializers.py | 31 ++++---- InvenTree/part/tasks.py | 3 +- .../part/templatetags/inventree_extras.py | 27 +++---- InvenTree/part/templatetags/status_codes.py | 5 +- InvenTree/part/test_api.py | 19 +++-- InvenTree/part/test_bom_export.py | 5 +- InvenTree/part/test_bom_import.py | 5 +- InvenTree/part/test_bom_item.py | 10 +-- InvenTree/part/test_category.py | 2 +- InvenTree/part/test_param.py | 7 +- InvenTree/part/test_part.py | 27 ++++--- InvenTree/part/test_views.py | 4 +- InvenTree/part/urls.py | 1 - InvenTree/part/views.py | 69 ++++++++---------- InvenTree/plugin/__init__.py | 4 +- InvenTree/plugin/api.py | 7 +- InvenTree/plugin/apps.py | 1 - InvenTree/plugin/base/action/test_action.py | 2 +- InvenTree/plugin/base/barcodes/api.py | 11 ++- InvenTree/plugin/base/barcodes/mixins.py | 6 +- .../plugin/base/barcodes/test_barcode.py | 2 +- InvenTree/plugin/base/event/events.py | 4 +- InvenTree/plugin/base/integration/mixins.py | 15 ++-- .../plugin/base/integration/test_mixins.py | 10 +-- InvenTree/plugin/base/label/label.py | 3 +- InvenTree/plugin/base/locate/api.py | 3 +- InvenTree/plugin/base/locate/test_locate.py | 1 - .../builtin/action/test_simpleactionplugin.py | 2 +- .../builtin/barcodes/inventree_barcode.py | 7 +- .../barcodes/test_inventree_barcode.py | 2 +- .../builtin/integration/core_notifications.py | 2 +- .../integration/test_core_notifications.py | 5 +- InvenTree/plugin/events.py | 3 +- InvenTree/plugin/helpers.py | 9 ++- InvenTree/plugin/mixins/__init__.py | 8 ++- InvenTree/plugin/models.py | 7 +- InvenTree/plugin/plugin.py | 9 ++- InvenTree/plugin/registry.py | 21 +++--- .../integration/custom_panel_sample.py | 3 +- .../plugin/samples/integration/sample.py | 8 +-- .../plugin/samples/integration/test_sample.py | 2 +- .../integration/test_scheduled_task.py | 4 +- .../plugin/samples/locate/locate_sample.py | 1 - InvenTree/plugin/serializers.py | 6 +- .../plugin/templatetags/plugin_extras.py | 4 +- InvenTree/plugin/test_api.py | 4 +- InvenTree/plugin/test_plugin.py | 7 +- InvenTree/plugin/urls.py | 1 - InvenTree/plugin/views.py | 1 - InvenTree/report/admin.py | 8 +-- InvenTree/report/api.py | 34 ++++----- InvenTree/report/apps.py | 3 +- InvenTree/report/models.py | 23 +++--- InvenTree/report/serializers.py | 10 ++- InvenTree/report/templatetags/barcode.py | 2 +- InvenTree/report/templatetags/report.py | 6 +- InvenTree/report/tests.py | 9 ++- InvenTree/script/translation_stats.py | 2 +- InvenTree/stock/admin.py | 13 ++-- InvenTree/stock/api.py | 42 ++++------- InvenTree/stock/models.py | 55 ++++++-------- InvenTree/stock/serializers.py | 28 +++----- InvenTree/stock/test_api.py | 13 ++-- InvenTree/stock/test_views.py | 4 +- InvenTree/stock/tests.py | 19 +++-- InvenTree/stock/views.py | 22 +++--- InvenTree/users/admin.py | 17 +++-- InvenTree/users/api.py | 11 ++- InvenTree/users/apps.py | 5 +- InvenTree/users/models.py | 16 ++--- InvenTree/users/serializers.py | 5 +- InvenTree/users/tests.py | 6 +- ci/check_api_endpoint.py | 1 + ci/check_js_templates.py | 4 +- ci/check_locale_files.py | 2 +- ci/check_migration_files.py | 2 +- ci/check_version_number.py | 6 +- docker/gunicorn.conf.py | 3 +- tasks.py | 4 +- 156 files changed, 807 insertions(+), 1042 deletions(-) diff --git a/InvenTree/InvenTree/api.py b/InvenTree/InvenTree/api.py index e58ef798fc..0713479f7a 100644 --- a/InvenTree/InvenTree/api.py +++ b/InvenTree/InvenTree/api.py @@ -2,18 +2,17 @@ Main JSON interface views """ -from django.utils.translation import gettext_lazy as _ from django.conf import settings from django.http import JsonResponse +from django.utils.translation import gettext_lazy as _ 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 .version import (inventreeApiVersion, inventreeInstanceName, + inventreeVersion) +from .views import AjaxView class InfoView(AjaxView): diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index 34976ffbfe..368ca3a765 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -6,9 +6,10 @@ import csv import io import re -from django.http.response import StreamingHttpResponse from django.contrib.auth import get_user_model from django.contrib.auth.models import Group +from django.http.response import StreamingHttpResponse + from rest_framework.test import APITestCase diff --git a/InvenTree/InvenTree/apps.py b/InvenTree/InvenTree/apps.py index 0284cd43aa..74dbca444c 100644 --- a/InvenTree/InvenTree/apps.py +++ b/InvenTree/InvenTree/apps.py @@ -3,16 +3,16 @@ import logging from django.apps import AppConfig -from django.core.exceptions import AppRegistryNotReady from django.conf import settings from django.contrib.auth import get_user_model +from django.core.exceptions import AppRegistryNotReady from django.db import transaction from django.db.utils import IntegrityError -from InvenTree.ready import isInTestMode, canAppAccessDatabase -from .config import get_setting import InvenTree.tasks +from InvenTree.ready import canAppAccessDatabase, isInTestMode +from .config import get_setting logger = logging.getLogger("inventree") @@ -111,8 +111,8 @@ class InvenTreeConfig(AppConfig): try: from djmoney.contrib.exchange.models import ExchangeBackend - from InvenTree.tasks import update_exchange_rates from common.settings import currency_code_default + from InvenTree.tasks import update_exchange_rates except AppRegistryNotReady: # pragma: no cover pass diff --git a/InvenTree/InvenTree/ci_render_js.py b/InvenTree/InvenTree/ci_render_js.py index 94530db096..2c9d05dfc4 100644 --- a/InvenTree/InvenTree/ci_render_js.py +++ b/InvenTree/InvenTree/ci_render_js.py @@ -3,12 +3,12 @@ Pull rendered copies of the templated 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 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 """ diff --git a/InvenTree/InvenTree/config.py b/InvenTree/InvenTree/config.py index 35671c1b26..d7691cf4cc 100644 --- a/InvenTree/InvenTree/config.py +++ b/InvenTree/InvenTree/config.py @@ -2,10 +2,9 @@ Helper functions for loading InvenTree configuration options """ +import logging import os import shutil -import logging - logger = logging.getLogger('inventree') diff --git a/InvenTree/InvenTree/context.py b/InvenTree/InvenTree/context.py index 7d65cb4231..c0b27ad5bf 100644 --- a/InvenTree/InvenTree/context.py +++ b/InvenTree/InvenTree/context.py @@ -4,12 +4,10 @@ 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 - +from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus, + SalesOrderStatus, StockHistoryCode, + StockStatus) from users.models import RuleSet diff --git a/InvenTree/InvenTree/exceptions.py b/InvenTree/InvenTree/exceptions.py index 46b1a1ee0a..55017affc0 100644 --- a/InvenTree/InvenTree/exceptions.py +++ b/InvenTree/InvenTree/exceptions.py @@ -5,20 +5,19 @@ Custom exception handling for the DRF API # -*- coding: utf-8 -*- from __future__ import unicode_literals -import traceback import sys +import traceback from django.conf import settings from django.core.exceptions import ValidationError as DjangoValidationError from django.utils.translation import gettext_lazy as _ from django.views.debug import ExceptionReporter +import rest_framework.views as drfviews from error_report.models import Error - +from rest_framework import serializers from rest_framework.exceptions import ValidationError as DRFValidationError from rest_framework.response import Response -from rest_framework import serializers -import rest_framework.views as drfviews def exception_handler(exc, context): diff --git a/InvenTree/InvenTree/exchange.py b/InvenTree/InvenTree/exchange.py index a79239568d..a46e1356a8 100644 --- a/InvenTree/InvenTree/exchange.py +++ b/InvenTree/InvenTree/exchange.py @@ -1,13 +1,14 @@ -import certifi import ssl +from urllib.error import URLError 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 +import certifi +from djmoney.contrib.exchange.backends.base import SimpleExchangeBackend + +from common.settings import currency_code_default, currency_codes + class InvenTreeExchange(SimpleExchangeBackend): """ diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py index 894b993e50..9995c5444c 100644 --- a/InvenTree/InvenTree/fields.py +++ b/InvenTree/InvenTree/fields.py @@ -1,24 +1,22 @@ """ Custom fields used in InvenTree """ 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 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.models.fields import MoneyField as ModelMoneyField from djmoney.models.validators import MinMoneyValidator import InvenTree.helpers +from .validators import allowable_url_schemes + class InvenTreeURLFormField(FormURLField): """ Custom URL form field with custom scheme validators """ @@ -39,7 +37,7 @@ class InvenTreeURLField(models.URLField): def money_kwargs(): """ 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['currency_choices'] = currency_code_mappings() diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py index 40e8509411..50e2d26fff 100644 --- a/InvenTree/InvenTree/forms.py +++ b/InvenTree/InvenTree/forms.py @@ -2,29 +2,29 @@ Helper forms which subclass Django forms to provide additional functionality """ -from urllib.parse import urlencode import logging +from urllib.parse import urlencode -from django.utils.translation import gettext_lazy as _ from django import forms -from django.contrib.auth.models import User, Group from django.conf import settings +from django.contrib.auth.models import Group, User from django.http import HttpResponseRedirect 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.socialaccount.adapter import DefaultSocialAccountAdapter +from allauth.account.forms import SignupForm, set_form_field_order from allauth.exceptions import ImmediateHttpResponse +from allauth.socialaccount.adapter import DefaultSocialAccountAdapter from allauth_2fa.adapter import OTPAdapter 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 part.models import PartCategory logger = logging.getLogger('inventree') diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index 9e6e24acb8..d5722a2e99 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -3,27 +3,25 @@ Provides helper functions used throughout the InvenTree project """ import io -import re import json import os.path -from PIL import Image - +import re from decimal import Decimal, InvalidOperation - 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 - -import InvenTree.version - -from common.models import InvenTreeSetting -from .settings import MEDIA_URL, STATIC_URL -from common.settings import currency_code_default +from django.core.exceptions import FieldError, ValidationError +from django.http import StreamingHttpResponse +from django.utils.translation import gettext_lazy as _ 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): diff --git a/InvenTree/InvenTree/management/commands/clean_settings.py b/InvenTree/InvenTree/management/commands/clean_settings.py index 283416de29..7607f2a574 100644 --- a/InvenTree/InvenTree/management/commands/clean_settings.py +++ b/InvenTree/InvenTree/management/commands/clean_settings.py @@ -6,7 +6,6 @@ import logging from django.core.management.base import BaseCommand - logger = logging.getLogger('inventree') diff --git a/InvenTree/InvenTree/management/commands/prerender.py b/InvenTree/InvenTree/management/commands/prerender.py index 28f4b21f15..efaaad80dc 100644 --- a/InvenTree/InvenTree/management/commands/prerender.py +++ b/InvenTree/InvenTree/management/commands/prerender.py @@ -2,15 +2,15 @@ Custom management command to prerender files """ -from django.core.management.base import BaseCommand +import os + 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.utils.module_loading import import_string -from django.http.request import HttpRequest from django.utils.translation import override as lang_over -import os - def render_file(file_name, source, target, locales, ctx): """ renders a file into all provided locales """ diff --git a/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py b/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py index d065516835..3d684df06d 100644 --- a/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py +++ b/InvenTree/InvenTree/management/commands/rebuild_thumbnails.py @@ -4,19 +4,18 @@ Custom management command to rebuild thumbnail images - May be required after importing a new dataset, for example """ -import os 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 django.core.management.base import BaseCommand -from django.conf import settings -from django.db.utils import OperationalError, ProgrammingError - from company.models import Company from part.models import Part - logger = logging.getLogger('inventree') diff --git a/InvenTree/InvenTree/management/commands/remove_mfa.py b/InvenTree/InvenTree/management/commands/remove_mfa.py index 8c84920cc3..53266348e2 100644 --- a/InvenTree/InvenTree/management/commands/remove_mfa.py +++ b/InvenTree/InvenTree/management/commands/remove_mfa.py @@ -2,8 +2,8 @@ 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.core.management.base import BaseCommand class Command(BaseCommand): diff --git a/InvenTree/InvenTree/management/commands/wait_for_db.py b/InvenTree/InvenTree/management/commands/wait_for_db.py index b9fa4e5025..ebd6999f7f 100644 --- a/InvenTree/InvenTree/management/commands/wait_for_db.py +++ b/InvenTree/InvenTree/management/commands/wait_for_db.py @@ -2,13 +2,12 @@ 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 +from django.core.management.base import BaseCommand +from django.db import connection +from django.db.utils import ImproperlyConfigured, OperationalError + class Command(BaseCommand): """ diff --git a/InvenTree/InvenTree/metadata.py b/InvenTree/InvenTree/metadata.py index 85c5a4c8cc..e2d42bb539 100644 --- a/InvenTree/InvenTree/metadata.py +++ b/InvenTree/InvenTree/metadata.py @@ -1,14 +1,12 @@ import logging from rest_framework import serializers +from rest_framework.fields import empty from rest_framework.metadata import SimpleMetadata from rest_framework.utils import model_meta -from rest_framework.fields import empty - -from InvenTree.helpers import str2bool import users.models - +from InvenTree.helpers import str2bool logger = logging.getLogger('inventree') diff --git a/InvenTree/InvenTree/middleware.py b/InvenTree/InvenTree/middleware.py index 5e122d4689..aaf13f7623 100644 --- a/InvenTree/InvenTree/middleware.py +++ b/InvenTree/InvenTree/middleware.py @@ -1,20 +1,19 @@ # -*- coding: utf-8 -*- +import logging + from django.conf import settings from django.contrib.auth.middleware import PersistentRemoteUserMiddleware from django.http import HttpResponse from django.shortcuts import redirect -from django.urls import reverse_lazy, Resolver404 -from django.urls import include, re_path - -import logging +from django.urls import Resolver404, include, re_path, reverse_lazy +from allauth_2fa.middleware import (AllauthTwoFactorMiddleware, + BaseRequire2FAMiddleware) 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 InvenTree.urls import frontendpatterns logger = logging.getLogger("inventree") diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py index 73b2bf4572..aba8b36763 100644 --- a/InvenTree/InvenTree/models.py +++ b/InvenTree/InvenTree/models.py @@ -2,27 +2,25 @@ Generic models which provide extra functionality over base Django model types. """ -import re -import os import logging +import os +import re -from django.db import models from django.conf import settings from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType -from django.utils.translation import gettext_lazy as _ from django.core.exceptions import ValidationError - +from django.db import models from django.db.models.signals import pre_delete 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.models import MPTTModel, TreeForeignKey from InvenTree.fields import InvenTreeURLField from InvenTree.validators import validate_tree_name - logger = logging.getLogger('inventree') diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index e16a4f1ba7..e91bcab484 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -3,27 +3,24 @@ Serializers used in various InvenTree apps """ import os -import tablib - -from decimal import Decimal - from collections import OrderedDict +from decimal import Decimal from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ValidationError as DjangoValidationError -from django.utils.translation import gettext_lazy as _ 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.money import Money from djmoney.utils import MONEY_CLASSES, get_currency_field_name - 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.fields import empty from rest_framework.serializers import DecimalField +from rest_framework.utils import model_meta from .models import extract_int diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 5c6bca4dea..a1259c7a5d 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -12,7 +12,6 @@ database setup in this file. """ import logging - import os import random import socket @@ -20,13 +19,13 @@ import string import sys from datetime import datetime -import moneyed - -import yaml -from django.utils.translation import gettext_lazy as _ +import django.conf.locale from django.contrib.messages import constants as messages 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 @@ -453,10 +452,8 @@ db_options = db_config.get("OPTIONS", db_config.get("options", {})) # Specific options for postgres backend if "postgres" in db_engine: # pragma: no cover - from psycopg2.extensions import ( - ISOLATION_LEVEL_READ_COMMITTED, - ISOLATION_LEVEL_SERIALIZABLE, - ) + from psycopg2.extensions import (ISOLATION_LEVEL_READ_COMMITTED, + ISOLATION_LEVEL_SERIALIZABLE) # Connection timeout if "connect_timeout" not in db_options: diff --git a/InvenTree/InvenTree/status.py b/InvenTree/InvenTree/status.py index 39b0afc57d..9ea57024d8 100644 --- a/InvenTree/InvenTree/status.py +++ b/InvenTree/InvenTree/status.py @@ -3,20 +3,18 @@ Provides system status functionality checks. """ # -*- coding: utf-8 -*- -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone - import logging 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.monitor import Stat -from django.conf import settings - import InvenTree.ready - logger = logging.getLogger("inventree") diff --git a/InvenTree/InvenTree/tasks.py b/InvenTree/InvenTree/tasks.py index 77f55df271..e118c607fb 100644 --- a/InvenTree/InvenTree/tasks.py +++ b/InvenTree/InvenTree/tasks.py @@ -1,17 +1,16 @@ -import re import json -import warnings -import requests import logging - +import re +import warnings 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.db.utils import OperationalError, ProgrammingError -from django.core import mail as django_mail -from django.conf import settings +from django.utils import timezone +import requests logger = logging.getLogger("inventree") @@ -72,9 +71,10 @@ def offload_task(taskname, *args, force_sync=False, **kwargs): """ try: + import importlib + from django_q.tasks import AsyncTask - import importlib from InvenTree.status import is_worker_running except AppRegistryNotReady: # pragma: no cover logger.warning(f"Could not offload task '{taskname}' - app registry not ready") @@ -254,9 +254,10 @@ def update_exchange_rates(): """ try: - from InvenTree.exchange import InvenTreeExchange from djmoney.contrib.exchange.models import ExchangeBackend, Rate + from common.settings import currency_code_default, currency_codes + from InvenTree.exchange import InvenTreeExchange except AppRegistryNotReady: # pragma: no cover # Apps not yet loaded! logger.info("Could not perform 'update_exchange_rates' - App registry not ready") diff --git a/InvenTree/InvenTree/test_api.py b/InvenTree/InvenTree/test_api.py index f55dfbcda2..b01c939d1c 100644 --- a/InvenTree/InvenTree/test_api.py +++ b/InvenTree/InvenTree/test_api.py @@ -1,20 +1,17 @@ """ Low level tests for the InvenTree API """ -from rest_framework import status - -from django.test import TestCase +from base64 import b64encode from django.contrib.auth import get_user_model from django.contrib.auth.models import Group - +from django.test import TestCase from django.urls import reverse +from rest_framework import status + from InvenTree.api_tester import InvenTreeAPITestCase - from users.models import RuleSet -from base64 import b64encode - class HTMLAPITests(TestCase): """ diff --git a/InvenTree/InvenTree/test_middleware.py b/InvenTree/InvenTree/test_middleware.py index 865e285783..0e86ec6a0f 100644 --- a/InvenTree/InvenTree/test_middleware.py +++ b/InvenTree/InvenTree/test_middleware.py @@ -1,8 +1,7 @@ """Tests for middleware functions""" -from django.test import TestCase - from django.contrib.auth import get_user_model +from django.test import TestCase from django.urls import reverse diff --git a/InvenTree/InvenTree/test_tasks.py b/InvenTree/InvenTree/test_tasks.py index c8497e2241..1b04e7da5b 100644 --- a/InvenTree/InvenTree/test_tasks.py +++ b/InvenTree/InvenTree/test_tasks.py @@ -4,16 +4,15 @@ Unit tests for task management from datetime import timedelta -from django.utils import timezone 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 import InvenTree.tasks from common.models import InvenTreeSetting - threshold = timezone.now() - timedelta(days=30) threshold_low = threshold - timedelta(days=1) diff --git a/InvenTree/InvenTree/test_urls.py b/InvenTree/InvenTree/test_urls.py index 8b55d4e042..7f41f6e9fe 100644 --- a/InvenTree/InvenTree/test_urls.py +++ b/InvenTree/InvenTree/test_urls.py @@ -2,14 +2,13 @@ Validate that all URLs specified in template files are correct. """ -from django.test import TestCase -from django.urls import reverse - import os import re - from pathlib import Path +from django.test import TestCase +from django.urls import reverse + class URLTest(TestCase): diff --git a/InvenTree/InvenTree/test_views.py b/InvenTree/InvenTree/test_views.py index 0a145ec508..509eea142e 100644 --- a/InvenTree/InvenTree/test_views.py +++ b/InvenTree/InvenTree/test_views.py @@ -2,12 +2,12 @@ Unit tests for the main web views """ -import re import os +import re +from django.contrib.auth import get_user_model from django.test import TestCase from django.urls import reverse -from django.contrib.auth import get_user_model class ViewTests(TestCase): diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index 26b50a0eca..fe13d75562 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -1,33 +1,26 @@ import json import os import time - +from decimal import Decimal from unittest import mock -from django.test import TestCase, override_settings 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.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 .validators import validate_overage, validate_part_name -from . import helpers -from . import version -from . import status -from . import ready -from . import config - -from decimal import Decimal +from djmoney.contrib.exchange.models import Rate, convert_money +from djmoney.money import Money import InvenTree.tasks - -from stock.models import StockLocation -from common.settings import currency_codes 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): diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index ab761c611d..c3f5b87169 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -4,47 +4,41 @@ Top-level URL lookup for InvenTree application. 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.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 rest_framework.documentation import include_docs_urls -from .views import auth_request -from .views import IndexView, SearchView, DatabaseStatsView -from .views import SettingsView, EditUserView, SetPasswordView, CustomEmailView, CustomConnectionsView, CustomPasswordResetFromKeyView -from .views import CustomSessionDeleteView, CustomSessionDeleteOtherView -from .views import CurrencyRefreshView -from .views import AppearanceSelectView, SettingCategorySelectView -from .views import DynamicJsView -from .views import NotificationsView +from build.api import build_api_urls +from build.urls import build_urls +from common.api import common_api_urls, settings_api_urls +from common.urls import common_urls +from company.api import company_api_urls +from company.urls import (company_urls, manufacturer_part_urls, + supplier_part_urls) +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 .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" diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py index 6bb2c1b350..8a23eae39b 100644 --- a/InvenTree/InvenTree/validators.py +++ b/InvenTree/InvenTree/validators.py @@ -2,19 +2,17 @@ Custom field validators for InvenTree """ +import re from decimal import Decimal, InvalidOperation 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.core.exceptions import FieldDoesNotExist from moneyed import CURRENCIES import common.models -import re - def validate_currency_code(code): """ diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 4663b6a111..7d9cbad102 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -3,12 +3,12 @@ Version information for InvenTree. Provides information on the current InvenTree version """ -import subprocess -import django import re +import subprocess + +import django import common.models - from InvenTree.api_version import INVENTREE_API_VERSION # InvenTree software version diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 5be5fa3519..b29ea7cd44 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -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). """ -import os 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.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.urls import reverse_lazy from django.utils.timezone import now -from django.shortcuts import redirect -from django.conf import settings - -from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin - +from django.utils.translation import gettext_lazy as _ 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 djmoney.contrib.exchange.models import ExchangeBackend, Rate from allauth.account.forms import AddEmailForm -from allauth.socialaccount.forms import DisconnectForm from allauth.account.models import EmailAddress from allauth.account.views import EmailView, PasswordResetFromKeyView +from allauth.socialaccount.forms import DisconnectForm 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 part.models import PartCategory -from common.models import InvenTreeSetting, ColorTheme -from users.models import check_user_role, RuleSet +from users.models import RuleSet, check_user_role -from .forms import DeleteForm, EditUserForm, SetPasswordForm -from .forms import SettingCategorySelectForm +from .forms import (DeleteForm, EditUserForm, SetPasswordForm, + SettingCategorySelectForm) from .helpers import str2bool diff --git a/InvenTree/common/api.py b/InvenTree/common/api.py index 646025ab2a..d805626da7 100644 --- a/InvenTree/common/api.py +++ b/InvenTree/common/api.py @@ -5,18 +5,16 @@ Provides a JSON API for common components. import json from django.http.response import HttpResponse +from django.urls import include, path, re_path from django.utils.decorators import method_decorator -from django.urls import path 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 rest_framework import filters, generics, permissions -from rest_framework import serializers 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.serializers diff --git a/InvenTree/common/apps.py b/InvenTree/common/apps.py index a2253c1066..629b5179e6 100644 --- a/InvenTree/common/apps.py +++ b/InvenTree/common/apps.py @@ -4,7 +4,6 @@ import logging from django.apps import AppConfig - logger = logging.getLogger('inventree') diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index e6d26be10f..704d02a681 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -2,12 +2,13 @@ Files management tools. """ -from rapidfuzz import fuzz -import tablib import os -from django.utils.translation import gettext_lazy as _ from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ + +import tablib +from rapidfuzz import fuzz class FileManager: diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index aa54c814ad..79c449002e 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -3,45 +3,41 @@ Common database model definitions. These models are 'generic' and do not fit a particular business logic object. """ -import os +import base64 import decimal -import math -import uuid +import hashlib import hmac import json -import hashlib -import base64 -from secrets import compare_digest +import logging +import math +import os +import uuid from datetime import datetime, timedelta +from secrets import compare_digest 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.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.models import ContentType 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.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.models import convert_money +from djmoney.settings import CURRENCY_CHOICES 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.helpers import InvenTree.validators -import logging - - logger = logging.getLogger('inventree') diff --git a/InvenTree/common/notifications.py b/InvenTree/common/notifications.py index 7f6aece282..c2e4f2d6aa 100644 --- a/InvenTree/common/notifications.py +++ b/InvenTree/common/notifications.py @@ -1,13 +1,12 @@ import logging from datetime import timedelta +from common.models import NotificationEntry, NotificationMessage from InvenTree.helpers import inheritors from InvenTree.ready import isImportingData -from common.models import NotificationEntry, NotificationMessage from plugin import registry from plugin.models import NotificationUserSetting - logger = logging.getLogger('inventree') diff --git a/InvenTree/common/serializers.py b/InvenTree/common/serializers.py index 7d0c8cc219..c91ad0f45d 100644 --- a/InvenTree/common/serializers.py +++ b/InvenTree/common/serializers.py @@ -2,12 +2,12 @@ JSON serializers for common components """ -from InvenTree.serializers import InvenTreeModelSerializer -from InvenTree.helpers import get_objectreference - 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): diff --git a/InvenTree/common/settings.py b/InvenTree/common/settings.py index 361284d831..f010e65567 100644 --- a/InvenTree/common/settings.py +++ b/InvenTree/common/settings.py @@ -2,15 +2,17 @@ User-configurable settings for the common app """ -from moneyed import CURRENCIES from django.conf import settings +from moneyed import CURRENCIES + def currency_code_default(): """ Returns the default currency code (or USD if not specified) """ from django.db.utils import ProgrammingError + from common.models import InvenTreeSetting try: diff --git a/InvenTree/common/tasks.py b/InvenTree/common/tasks.py index db63dc9c17..7fdd57999a 100644 --- a/InvenTree/common/tasks.py +++ b/InvenTree/common/tasks.py @@ -1,9 +1,8 @@ import logging -from datetime import timedelta, datetime +from datetime import datetime, timedelta from django.core.exceptions import AppRegistryNotReady - logger = logging.getLogger('inventree') diff --git a/InvenTree/common/test_notifications.py b/InvenTree/common/test_notifications.py index e16e28f339..e2acfb5c36 100644 --- a/InvenTree/common/test_notifications.py +++ b/InvenTree/common/test_notifications.py @@ -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 +from common.notifications import (BulkNotificationMethod, NotificationMethod, + SingleNotificationMethod, storage) +from part.test_part import BaseNotificationIntegrationTest +from plugin.models import NotificationUserSetting class BaseNotificationTests(BaseNotificationIntegrationTest): diff --git a/InvenTree/common/test_tasks.py b/InvenTree/common/test_tasks.py index c28a1d19fe..0f19720b95 100644 --- a/InvenTree/common/test_tasks.py +++ b/InvenTree/common/test_tasks.py @@ -2,9 +2,10 @@ from django.test import TestCase from common.models import NotificationEntry -from . import tasks as common_tasks from InvenTree.tasks import offload_task +from . import tasks as common_tasks + class TaskTest(TestCase): """ diff --git a/InvenTree/common/tests.py b/InvenTree/common/tests.py index 1f32b8e941..5820a6cda8 100644 --- a/InvenTree/common/tests.py +++ b/InvenTree/common/tests.py @@ -1,19 +1,20 @@ -from http import HTTPStatus import json from datetime import timedelta +from http import HTTPStatus -from django.test import TestCase, Client from django.contrib.auth import get_user_model +from django.test import Client, TestCase from django.urls import reverse from InvenTree.api_tester import InvenTreeAPITestCase from InvenTree.helpers import str2bool -from plugin.models import NotificationUserSetting, PluginConfig from plugin import registry +from plugin.models import NotificationUserSetting, PluginConfig -from .models import InvenTreeSetting, InvenTreeUserSetting, WebhookEndpoint, WebhookMessage, NotificationEntry, ColorTheme from .api import WebhookView +from .models import (ColorTheme, InvenTreeSetting, InvenTreeUserSetting, + NotificationEntry, WebhookEndpoint, WebhookMessage) CONTENT_TYPE_JSON = 'application/json' diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index f9a6a4f82a..ee5a02a288 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -4,12 +4,12 @@ Django views for interacting with common models import os -from django.utils.translation import gettext_lazy as _ from django.conf import settings 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 formtools.wizard.views import SessionWizardView from InvenTree.views import AjaxView diff --git a/InvenTree/company/admin.py b/InvenTree/company/admin.py index ce5f5945b6..d3bf75dab3 100644 --- a/InvenTree/company/admin.py +++ b/InvenTree/company/admin.py @@ -1,17 +1,16 @@ 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 - -from .models import Company -from .models import SupplierPart -from .models import SupplierPriceBreak -from .models import ManufacturerPart, ManufacturerPartAttachment, ManufacturerPartParameter +from import_export.admin import ImportExportModelAdmin +from import_export.fields import Field +from import_export.resources import ModelResource from part.models import Part +from .models import (Company, ManufacturerPart, ManufacturerPartAttachment, + ManufacturerPartParameter, SupplierPart, + SupplierPriceBreak) + class CompanyResource(ModelResource): """ Class for managing Company data import/export """ diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index 22c5c4b207..b63cd65c83 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -2,25 +2,24 @@ 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.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.helpers import str2bool -from .models import Company -from .models import ManufacturerPart, ManufacturerPartAttachment, ManufacturerPartParameter -from .models import SupplierPart, SupplierPriceBreak - -from .serializers import CompanySerializer -from .serializers import ManufacturerPartSerializer, ManufacturerPartAttachmentSerializer, ManufacturerPartParameterSerializer -from .serializers import SupplierPartSerializer, SupplierPriceBreakSerializer +from .models import (Company, ManufacturerPart, ManufacturerPartAttachment, + ManufacturerPartParameter, SupplierPart, + SupplierPriceBreak) +from .serializers import (CompanySerializer, + ManufacturerPartAttachmentSerializer, + ManufacturerPartParameterSerializer, + ManufacturerPartSerializer, SupplierPartSerializer, + SupplierPriceBreakSerializer) class CompanyList(generics.ListCreateAPIView): diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py index eaead82151..bf15038898 100644 --- a/InvenTree/company/forms.py +++ b/InvenTree/company/forms.py @@ -2,14 +2,13 @@ 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 +from django.utils.translation import gettext_lazy as _ -from .models import Company -from .models import SupplierPriceBreak +from InvenTree.fields import RoundingDecimalFormField +from InvenTree.forms import HelperForm + +from .models import Company, SupplierPriceBreak class CompanyImageDownloadForm(HelperForm): diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index e33580abff..1feac56f67 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -4,32 +4,26 @@ Company database model definitions 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.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 moneyed import CURRENCIES +from django.utils.translation import gettext_lazy as _ from markdownx.models import MarkdownxField - +from moneyed import CURRENCIES 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.settings +import InvenTree.validators 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): diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 54eeb2c191..e0c34d077f 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -5,22 +5,19 @@ JSON serializers for Company app from django.utils.translation import gettext_lazy as _ from rest_framework import serializers - from sql_util.utils import SubqueryCount -from InvenTree.serializers import InvenTreeAttachmentSerializer -from InvenTree.serializers import InvenTreeDecimalField -from InvenTree.serializers import InvenTreeImageSerializerField -from InvenTree.serializers import InvenTreeModelSerializer -from InvenTree.serializers import InvenTreeMoneySerializer - +from common.settings import currency_code_default, currency_code_mappings +from InvenTree.serializers import (InvenTreeAttachmentSerializer, + InvenTreeDecimalField, + InvenTreeImageSerializerField, + InvenTreeModelSerializer, + InvenTreeMoneySerializer) from part.serializers import PartBriefSerializer -from .models import Company -from .models import ManufacturerPart, ManufacturerPartAttachment, ManufacturerPartParameter -from .models import SupplierPart, SupplierPriceBreak - -from common.settings import currency_code_default, currency_code_mappings +from .models import (Company, ManufacturerPart, ManufacturerPartAttachment, + ManufacturerPartParameter, SupplierPart, + SupplierPriceBreak) class CompanyBriefSerializer(InvenTreeModelSerializer): diff --git a/InvenTree/company/test_api.py b/InvenTree/company/test_api.py index a1272103df..e0b54130ff 100644 --- a/InvenTree/company/test_api.py +++ b/InvenTree/company/test_api.py @@ -1,6 +1,7 @@ -from rest_framework import status from django.urls import reverse +from rest_framework import status + from InvenTree.api_tester import InvenTreeAPITestCase from .models import Company diff --git a/InvenTree/company/test_views.py b/InvenTree/company/test_views.py index 29900236bf..a39e2be041 100644 --- a/InvenTree/company/test_views.py +++ b/InvenTree/company/test_views.py @@ -1,9 +1,9 @@ """ 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.models import Group +from django.test import TestCase +from django.urls import reverse class CompanyViewTestBase(TestCase): diff --git a/InvenTree/company/tests.py b/InvenTree/company/tests.py index edc34e7f2d..008ac066b2 100644 --- a/InvenTree/company/tests.py +++ b/InvenTree/company/tests.py @@ -1,13 +1,14 @@ -from django.test import TestCase -from django.core.exceptions import ValidationError - import os from decimal import Decimal -from .models import Company, Contact, ManufacturerPart, SupplierPart -from .models import rename_company_image +from django.core.exceptions import ValidationError +from django.test import TestCase + from part.models import Part +from .models import (Company, Contact, ManufacturerPart, SupplierPart, + rename_company_image) + class CompanySimpleTest(TestCase): diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py index 25ebdbb771..a7b9584c54 100644 --- a/InvenTree/company/urls.py +++ b/InvenTree/company/urls.py @@ -6,7 +6,6 @@ from django.urls import include, re_path from . import views - company_detail_urls = [ re_path(r'^thumb-download/', views.CompanyImageDownloadFromURL.as_view(), name='company-image-download'), diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index 03514b51b3..6a21d1e57a 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -2,26 +2,21 @@ 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.views.generic import DetailView, ListView -from django.urls import reverse -from django.core.files.base import ContentFile - -from PIL import Image import requests -import io +from PIL import Image -from InvenTree.views import AjaxUpdateView -from InvenTree.views import InvenTreeRoleMixin - -from .models import Company -from .models import ManufacturerPart -from .models import SupplierPart +from InvenTree.views import AjaxUpdateView, InvenTreeRoleMixin +from plugin.views import InvenTreePluginViewMixin from .forms import CompanyImageDownloadForm - -from plugin.views import InvenTreePluginViewMixin +from .models import Company, ManufacturerPart, SupplierPart class CompanyIndex(InvenTreeRoleMixin, ListView): diff --git a/InvenTree/label/admin.py b/InvenTree/label/admin.py index 96e90363e0..112ac55a4b 100644 --- a/InvenTree/label/admin.py +++ b/InvenTree/label/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import StockItemLabel, StockLocationLabel, PartLabel +from .models import PartLabel, StockItemLabel, StockLocationLabel class LabelAdmin(admin.ModelAdmin): diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index 17aef828c0..5efbff518a 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -1,30 +1,27 @@ from io import BytesIO -from PIL import Image - -from django.utils.translation import gettext_lazy as _ from django.conf import settings -from django.urls import include, re_path -from django.core.exceptions import ValidationError, FieldError +from django.core.exceptions import FieldError, ValidationError 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 rest_framework import generics, filters +from PIL import Image +from rest_framework import filters, generics from rest_framework.response import Response +import common.models import InvenTree.helpers 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 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 .serializers import StockItemLabelSerializer, StockLocationLabelSerializer, PartLabelSerializer +from .models import PartLabel, StockItemLabel, StockLocationLabel +from .serializers import (PartLabelSerializer, StockItemLabelSerializer, + StockLocationLabelSerializer) class LabelListView(generics.ListAPIView): diff --git a/InvenTree/label/apps.py b/InvenTree/label/apps.py index f2c3c4ada5..01c9fe1fdf 100644 --- a/InvenTree/label/apps.py +++ b/InvenTree/label/apps.py @@ -1,7 +1,7 @@ +import hashlib +import logging import os import shutil -import logging -import hashlib import warnings from django.apps import AppConfig @@ -10,7 +10,6 @@ from django.core.exceptions import AppRegistryNotReady from InvenTree.ready import canAppAccessDatabase - logger = logging.getLogger("inventree") diff --git a/InvenTree/label/models.py b/InvenTree/label/models.py index 7a52ed5d02..c7a38f09eb 100644 --- a/InvenTree/label/models.py +++ b/InvenTree/label/models.py @@ -2,28 +2,24 @@ Label printing models """ -import sys -import os -import logging import datetime +import logging +import os +import sys from django.conf import settings -from django.db import models -from django.urls import reverse +from django.core.exceptions import FieldError, ValidationError from django.core.validators import FileExtensionValidator, MinValueValidator -from django.core.exceptions import ValidationError, FieldError - -from django.template import Template, Context +from django.db import models +from django.template import Context, Template from django.template.loader import render_to_string - +from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from InvenTree.helpers import validateFilterString, normalize - import common.models -import stock.models import part.models - +import stock.models +from InvenTree.helpers import normalize, validateFilterString try: from django_weasyprint import WeasyTemplateResponseMixin diff --git a/InvenTree/label/serializers.py b/InvenTree/label/serializers.py index af6ae49e28..5428424572 100644 --- a/InvenTree/label/serializers.py +++ b/InvenTree/label/serializers.py @@ -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): diff --git a/InvenTree/label/tests.py b/InvenTree/label/tests.py index 5bf7ff3c7c..f94efafb84 100644 --- a/InvenTree/label/tests.py +++ b/InvenTree/label/tests.py @@ -2,18 +2,18 @@ import os -from django.conf import settings from django.apps import apps -from django.urls import reverse +from django.conf import settings from django.core.exceptions import ValidationError +from django.urls import reverse -from InvenTree.helpers import validateFilterString from InvenTree.api_tester import InvenTreeAPITestCase - -from .models import StockItemLabel, StockLocationLabel, PartLabel +from InvenTree.helpers import validateFilterString from part.models import Part from stock.models import StockItem +from .models import PartLabel, StockItemLabel, StockLocationLabel + class LabelTest(InvenTreeAPITestCase): diff --git a/InvenTree/order/admin.py b/InvenTree/order/admin.py index ac74a004e3..a46fe62532 100644 --- a/InvenTree/order/admin.py +++ b/InvenTree/order/admin.py @@ -1,14 +1,14 @@ from django.contrib import admin +import import_export.widgets as widgets from import_export.admin import ImportExportModelAdmin - from import_export.fields import Field from import_export.resources import ModelResource -import import_export.widgets as widgets -from .models import PurchaseOrder, PurchaseOrderLineItem, PurchaseOrderExtraLine -from .models import SalesOrder, SalesOrderLineItem, SalesOrderExtraLine -from .models import SalesOrderShipment, SalesOrderAllocation +from .models import (PurchaseOrder, PurchaseOrderExtraLine, + PurchaseOrderLineItem, SalesOrder, SalesOrderAllocation, + SalesOrderExtraLine, SalesOrderLineItem, + SalesOrderShipment) # region general classes diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 2a9c3b99d2..e6e6767edb 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -2,29 +2,25 @@ JSON API for the Order app """ +from django.db.models import F, Q 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 rest_framework import generics -from rest_framework import filters, status +from rest_framework import filters, generics, status 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.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 users.models import Owner - from plugin.serializers import MetadataSerializer +from users.models import Owner class GeneralExtraLineList: diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index 120d1e0923..2b06a92d00 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -5,11 +5,9 @@ Django Forms for interacting with Order objects from django import forms 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 InvenTree.fields import InvenTreeMoneyField +from InvenTree.helpers import clean_decimal class OrderMatchItemForm(MatchItemForm): diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index f4688f3736..204130578f 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -5,42 +5,38 @@ Order model definitions # -*- coding: utf-8 -*- import os - from datetime import datetime 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.models import Q, F, Sum +from django.db.models import F, Q, Sum from django.db.models.functions import Coalesce from django.db.models.signals import post_save 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.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 mptt.models import TreeForeignKey -from djmoney.contrib.exchange.models import convert_money -from djmoney.money import Money +import InvenTree.helpers 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 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.models import MetadataMixin - -import InvenTree.helpers -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 +from stock import models as stock_models +from users import models as UserModels def get_next_po_number(): diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index 47eacc40a0..379b9d5fc4 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -4,36 +4,30 @@ JSON serializers for the Order API from decimal import Decimal -from django.utils.translation import gettext_lazy as _ - from django.core.exceptions import ValidationError as DjangoValidationError from django.db import models, transaction -from django.db.models import Case, When, Value -from django.db.models import BooleanField, ExpressionWrapper, F, Q +from django.db.models import (BooleanField, Case, ExpressionWrapper, F, Q, + Value, When) +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.serializers import ValidationError - 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 - -from part.serializers import PartBriefSerializer - import stock.models 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 diff --git a/InvenTree/order/test_api.py b/InvenTree/order/test_api.py index 6549b1d89d..ba95a243f0 100644 --- a/InvenTree/order/test_api.py +++ b/InvenTree/order/test_api.py @@ -3,20 +3,17 @@ Tests for the Order API """ import io - from datetime import datetime, timedelta -from rest_framework import status - from django.urls import reverse -from InvenTree.api_tester import InvenTreeAPITestCase -from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus - -from part.models import Part -from stock.models import StockItem +from rest_framework import status 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): diff --git a/InvenTree/order/test_sales_order.py b/InvenTree/order/test_sales_order.py index cbd572e24d..b357b14f55 100644 --- a/InvenTree/order/test_sales_order.py +++ b/InvenTree/order/test_sales_order.py @@ -1,21 +1,16 @@ # -*- coding: utf-8 -*- -from django.test import TestCase - -from django.core.exceptions import ValidationError - from datetime import datetime, timedelta -from company.models import Company - -from InvenTree import status_codes as status +from django.core.exceptions import ValidationError +from django.test import TestCase from common.models import InvenTreeSetting - -from order.models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation, SalesOrderShipment - +from company.models import Company +from InvenTree import status_codes as status +from order.models import (SalesOrder, SalesOrderAllocation, SalesOrderLineItem, + SalesOrderShipment) from part.models import Part - from stock.models import StockItem diff --git a/InvenTree/order/test_views.py b/InvenTree/order/test_views.py index e38ea7ecef..b1025959f1 100644 --- a/InvenTree/order/test_views.py +++ b/InvenTree/order/test_views.py @@ -1,9 +1,9 @@ """ 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.models import Group +from django.test import TestCase +from django.urls import reverse class OrderViewTestCase(TestCase): diff --git a/InvenTree/order/tests.py b/InvenTree/order/tests.py index b68e0c3ff1..1c23be2829 100644 --- a/InvenTree/order/tests.py +++ b/InvenTree/order/tests.py @@ -2,15 +2,15 @@ from datetime import datetime, timedelta -from django.test import TestCase 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 InvenTree.status_codes import PurchaseOrderStatus +from part.models import Part +from stock.models import StockLocation + +from .models import PurchaseOrder, PurchaseOrderLineItem class OrderTest(TestCase): diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 77b5741c3e..45b7402dc0 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -2,36 +2,32 @@ 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 from decimal import Decimal, InvalidOperation -from .models import PurchaseOrder, PurchaseOrderLineItem -from .models import SalesOrder, SalesOrderLineItem -from .admin import PurchaseOrderLineItemResource, SalesOrderLineItemResource -from company.models import SupplierPart # ManufacturerPart -from part.models import Part +from django.db.utils import IntegrityError +from django.forms import HiddenInput, IntegerField +from django.http import HttpResponseRedirect +from django.http.response import JsonResponse +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 . import forms as order_forms -from part.views import PartPricing - +from common.forms import MatchFieldForm, UploadFileForm +from common.views import FileManagementFormView +from company.models import SupplierPart # ManufacturerPart 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 . import forms as order_forms +from .admin import PurchaseOrderLineItemResource, SalesOrderLineItemResource +from .models import (PurchaseOrder, PurchaseOrderLineItem, SalesOrder, + SalesOrderLineItem) logger = logging.getLogger("inventree") diff --git a/InvenTree/part/admin.py b/InvenTree/part/admin.py index 5fafc37fea..88064ff275 100644 --- a/InvenTree/part/admin.py +++ b/InvenTree/part/admin.py @@ -1,12 +1,12 @@ from django.contrib import admin +import import_export.widgets as widgets from import_export.admin import ImportExportModelAdmin from import_export.fields import Field from import_export.resources import ModelResource -import import_export.widgets as widgets -from company.models import SupplierPart import part.models as models +from company.models import SupplierPart from stock.models import StockLocation diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index de335087f4..e0fce0e06c 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -3,53 +3,41 @@ Provides a JSON API for the Part app """ 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 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 .models import BomItem, BomItemSubstitute -from .models import PartParameter, PartParameterTemplate -from .models import PartAttachment, PartTestTemplate -from .models import PartSellPriceBreak, PartInternalPriceBreak -from .models import PartCategoryParameterTemplate +from django_filters import rest_framework as rest_filters +from django_filters.rest_framework import DjangoFilterBackend +from djmoney.contrib.exchange.exceptions import MissingRate +from djmoney.contrib.exchange.models import convert_money +from djmoney.money import Money +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 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 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 InvenTree.helpers import str2bool, isNull, increment -from InvenTree.helpers import DownloadFile -from InvenTree.api import AttachmentMixin, APIDownloadMixin - -from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus, SalesOrderStatus +from .models import (BomItem, BomItemSubstitute, Part, PartAttachment, + PartCategory, PartCategoryParameterTemplate, + PartInternalPriceBreak, PartParameter, + PartParameterTemplate, PartRelated, PartSellPriceBreak, + PartTestTemplate) class CategoryList(generics.ListCreateAPIView): diff --git a/InvenTree/part/apps.py b/InvenTree/part/apps.py index b1dfcbe8bc..9f66be5009 100644 --- a/InvenTree/part/apps.py +++ b/InvenTree/part/apps.py @@ -1,11 +1,10 @@ import logging -from django.db.utils import OperationalError, ProgrammingError from django.apps import AppConfig +from django.db.utils import OperationalError, ProgrammingError from InvenTree.ready import canAppAccessDatabase - logger = logging.getLogger("inventree") diff --git a/InvenTree/part/bom.py b/InvenTree/part/bom.py index 4010d542bb..fcb86f6204 100644 --- a/InvenTree/part/bom.py +++ b/InvenTree/part/bom.py @@ -7,11 +7,11 @@ from collections import OrderedDict from django.utils.translation import gettext as _ +from company.models import ManufacturerPart, SupplierPart from InvenTree.helpers import DownloadFile, GetExportFormats, normalize from .admin import BomItemResource from .models import BomItem -from company.models import ManufacturerPart, SupplierPart def IsValidBOMFormat(fmt): diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index 9a14d8ad25..e1fe938bd2 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -7,17 +7,15 @@ from django.utils.translation import gettext_lazy as _ from mptt.fields import TreeNodeChoiceField -from InvenTree.forms import HelperForm -from InvenTree.helpers import clean_decimal -from InvenTree.fields import RoundingDecimalFormField - import common.models 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 PartParameterTemplate -from .models import PartCategoryParameterTemplate -from .models import PartSellPriceBreak, PartInternalPriceBreak +from .models import (Part, PartCategory, PartCategoryParameterTemplate, + PartInternalPriceBreak, PartParameterTemplate, + PartSellPriceBreak) class PartModelChoiceField(forms.ModelChoiceField): diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index fa0f1816f8..0fa6c738aa 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -3,64 +3,52 @@ Part database model definitions """ import decimal - -import os +import hashlib import logging - -from django.utils.translation import gettext_lazy as _ -from django.core.exceptions import ValidationError -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 +import os +from datetime import datetime +from decimal import Decimal, InvalidOperation 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.utils import IntegrityError from django.dispatch import receiver - -from jinja2 import Template - -from markdownx.models import MarkdownxField +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ from django_cleanup import cleanup - from djmoney.contrib.exchange.exceptions import MissingRate - -from mptt.models import TreeForeignKey, MPTTModel +from djmoney.contrib.exchange.models import convert_money +from jinja2 import Template +from markdownx.models import MarkdownxField from mptt.exceptions import InvalidMove from mptt.managers import TreeManager - +from mptt.models import MPTTModel, TreeForeignKey from stdimage.models import StdImageField -from decimal import Decimal, InvalidOperation -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 common.models import InvenTree.ready 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 -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 stock import models as StockModels logger = logging.getLogger("inventree") diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 098c1d1aea..4675c529da 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -5,40 +5,35 @@ JSON serializers for Part app import imghdr from decimal import Decimal -from django.urls import reverse_lazy from django.db import models, transaction -from django.db.models import ExpressionWrapper, F, Q, Func -from django.db.models import Subquery, OuterRef, FloatField - +from django.db.models import (ExpressionWrapper, F, FloatField, Func, OuterRef, + Q, Subquery) from django.db.models.functions import Coalesce +from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ +from djmoney.contrib.django_rest_framework import MoneyField from rest_framework import serializers 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 InvenTree.serializers import (DataFileUploadSerializer, - DataFileExtractSerializer, +from InvenTree.serializers import (DataFileExtractSerializer, + DataFileUploadSerializer, + InvenTreeAttachmentSerializer, InvenTreeAttachmentSerializerField, InvenTreeDecimalField, InvenTreeImageSerializerField, InvenTreeModelSerializer, - InvenTreeAttachmentSerializer, InvenTreeMoneySerializer) - -from InvenTree.status_codes import (BuildStatus, - PurchaseOrderStatus, +from InvenTree.status_codes import (BuildStatus, PurchaseOrderStatus, SalesOrderStatus) - from stock.models import StockItem -from .models import (BomItem, BomItemSubstitute, - Part, PartAttachment, PartCategory, PartRelated, - PartParameter, PartParameterTemplate, PartSellPriceBreak, - PartStar, PartTestTemplate, PartCategoryParameterTemplate, - PartInternalPriceBreak) +from .models import (BomItem, BomItemSubstitute, Part, PartAttachment, + PartCategory, PartCategoryParameterTemplate, + PartInternalPriceBreak, PartParameter, + PartParameterTemplate, PartRelated, PartSellPriceBreak, + PartStar, PartTestTemplate) class CategorySerializer(InvenTreeModelSerializer): diff --git a/InvenTree/part/tasks.py b/InvenTree/part/tasks.py index 7ab15a7200..18188bed77 100644 --- a/InvenTree/part/tasks.py +++ b/InvenTree/part/tasks.py @@ -2,10 +2,9 @@ import logging from django.utils.translation import gettext_lazy as _ +import common.notifications import InvenTree.helpers import InvenTree.tasks -import common.notifications - import part.models logger = logging.getLogger("inventree") diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index a4af8a9383..7c7ee4de12 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -5,30 +5,25 @@ This module provides template tags for extra functionality, over and above the built-in Django tags. """ -from datetime import date, datetime +import logging import os import sys -import logging - -from django.utils.html import format_html - -from django.utils.translation import gettext_lazy as _ -from django.conf import settings as djangosettings +from datetime import date, datetime from django import template -from django.urls import reverse -from django.utils.safestring import mark_safe -from django.templatetags.static import StaticNode, static +from django.conf import settings as djangosettings from django.core.files.storage import default_storage - -from InvenTree import version, settings +from django.templatetags.static import StaticNode, static +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 - -from common.models import InvenTreeSetting, ColorTheme, InvenTreeUserSetting +from common.models import ColorTheme, InvenTreeSetting, InvenTreeUserSetting from common.settings import currency_code_default - -from plugin.models import PluginSetting, NotificationUserSetting +from InvenTree import settings, version +from plugin.models import NotificationUserSetting, PluginSetting register = template.Library() diff --git a/InvenTree/part/templatetags/status_codes.py b/InvenTree/part/templatetags/status_codes.py index ea334970c2..12072d3d40 100644 --- a/InvenTree/part/templatetags/status_codes.py +++ b/InvenTree/part/templatetags/status_codes.py @@ -4,8 +4,9 @@ Provide templates for the various model status codes. from django import template 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() diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index df24bdeaae..3819a01706 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -1,21 +1,18 @@ -import PIL - from django.urls import reverse +import PIL from rest_framework import status 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 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): diff --git a/InvenTree/part/test_bom_export.py b/InvenTree/part/test_bom_export.py index 4ae0b88269..04e666f248 100644 --- a/InvenTree/part/test_bom_export.py +++ b/InvenTree/part/test_bom_export.py @@ -4,11 +4,10 @@ Unit testing for BOM export functionality import csv -from django.test import TestCase - -from django.urls import reverse from django.contrib.auth import get_user_model from django.contrib.auth.models import Group +from django.test import TestCase +from django.urls import reverse class BomExportTest(TestCase): diff --git a/InvenTree/part/test_bom_import.py b/InvenTree/part/test_bom_import.py index 6f9006d487..a9c853ddc4 100644 --- a/InvenTree/part/test_bom_import.py +++ b/InvenTree/part/test_bom_import.py @@ -2,13 +2,12 @@ Unit testing for BOM upload / import functionality """ -import tablib - from django.core.files.uploadedfile import SimpleUploadedFile from django.urls import reverse -from InvenTree.api_tester import InvenTreeAPITestCase +import tablib +from InvenTree.api_tester import InvenTreeAPITestCase from part.models import Part diff --git a/InvenTree/part/test_bom_item.py b/InvenTree/part/test_bom_item.py index 1ee57e8d07..0a48733c85 100644 --- a/InvenTree/part/test_bom_item.py +++ b/InvenTree/part/test_bom_item.py @@ -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 .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): diff --git a/InvenTree/part/test_category.py b/InvenTree/part/test_category.py index 6eb76fa845..4da893f188 100644 --- a/InvenTree/part/test_category.py +++ b/InvenTree/part/test_category.py @@ -1,5 +1,5 @@ -from django.test import TestCase from django.core.exceptions import ValidationError +from django.test import TestCase from .models import Part, PartCategory, PartParameter, PartParameterTemplate diff --git a/InvenTree/part/test_param.py b/InvenTree/part/test_param.py index db617f6ffb..1db23f0be2 100644 --- a/InvenTree/part/test_param.py +++ b/InvenTree/part/test_param.py @@ -1,11 +1,10 @@ # Tests for Part Parameters -from django.test import TestCase, TransactionTestCase import django.core.exceptions as django_exceptions +from django.test import TestCase, TransactionTestCase -from .models import Part, PartCategory -from .models import PartParameter, PartParameterTemplate -from .models import PartCategoryParameterTemplate +from .models import (Part, PartCategory, PartCategoryParameterTemplate, + PartParameter, PartParameterTemplate) class TestParams(TestCase): diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index 2df3c10b01..293f13d63f 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -1,24 +1,23 @@ # 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 -from .models import Part, PartCategory, PartCategoryStar, PartStar, PartTestTemplate -from .models import rename_part_image -from .templatetags import inventree_extras +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.exceptions import ValidationError +from django.test import TestCase + +from allauth.account.models import EmailAddress import part.settings - +from common.models import (InvenTreeSetting, InvenTreeUserSetting, + NotificationEntry, NotificationMessage) +from common.notifications import UIMessageNotification, storage 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): diff --git a/InvenTree/part/test_views.py b/InvenTree/part/test_views.py index 2171a09b17..c0eff13a2e 100644 --- a/InvenTree/part/test_views.py +++ b/InvenTree/part/test_views.py @@ -1,9 +1,9 @@ """ 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.models import Group +from django.test import TestCase +from django.urls import reverse from .models import Part diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index a9da7329a6..f921cc6dfc 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -12,7 +12,6 @@ from django.urls import include, re_path from . import views - part_parameter_urls = [ re_path(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'), re_path(r'^template/(?P\d+)/edit/', views.PartParameterTemplateEdit.as_view(), name='part-param-template-edit'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 78dcc5b63f..982fd1fa53 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -2,55 +2,44 @@ 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 os from decimal import Decimal -from .models import PartCategory, Part -from .models import PartParameterTemplate -from .models import PartCategoryParameterTemplate +from django.conf import settings +from django.contrib import messages +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 -from company.models import SupplierPart -from common.files import FileManager -from common.views import FileManagementFormView, FileManagementAjaxView - -from stock.models import StockItem, StockLocation +import requests +from djmoney.contrib.exchange.exceptions import MissingRate +from djmoney.contrib.exchange.models import convert_money +from PIL import Image 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 settings as part_settings -from .bom import MakeBomTemplate, ExportBom, IsValidBOMFormat -from order.models import PurchaseOrderLineItem - -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 +from .bom import ExportBom, IsValidBOMFormat, MakeBomTemplate +from .models import (Part, PartCategory, PartCategoryParameterTemplate, + PartParameterTemplate) class PartIndex(InvenTreeRoleMixin, ListView): diff --git a/InvenTree/plugin/__init__.py b/InvenTree/plugin/__init__.py index 2f08d31eed..adb8235d29 100644 --- a/InvenTree/plugin/__init__.py +++ b/InvenTree/plugin/__init__.py @@ -2,9 +2,9 @@ Utility file to enable simper imports """ +from .helpers import MixinImplementationError, MixinNotImplementedError +from .plugin import IntegrationPluginBase, InvenTreePlugin from .registry import registry -from .plugin import InvenTreePlugin, IntegrationPluginBase -from .helpers import MixinNotImplementedError, MixinImplementationError __all__ = [ 'registry', diff --git a/InvenTree/plugin/api.py b/InvenTree/plugin/api.py index 4b0f809001..cfdd08d51b 100644 --- a/InvenTree/plugin/api.py +++ b/InvenTree/plugin/api.py @@ -5,18 +5,17 @@ JSON API for the plugin app from django.conf import settings 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.exceptions import NotFound from rest_framework.response import Response -from django_filters.rest_framework import DjangoFilterBackend - +import plugin.serializers as PluginSerializers from common.api import GlobalSettingsPermissions -from plugin.base.barcodes.api import barcode_api_urls 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.models import PluginConfig, PluginSetting -import plugin.serializers as PluginSerializers from plugin.registry import registry diff --git a/InvenTree/plugin/apps.py b/InvenTree/plugin/apps.py index c0e894fef1..9f9cb15d1a 100644 --- a/InvenTree/plugin/apps.py +++ b/InvenTree/plugin/apps.py @@ -11,7 +11,6 @@ from InvenTree.ready import canAppAccessDatabase from plugin import registry from plugin.helpers import check_git_version, log_error - logger = logging.getLogger('inventree') diff --git a/InvenTree/plugin/base/action/test_action.py b/InvenTree/plugin/base/action/test_action.py index 16790ccd62..995ce77be9 100644 --- a/InvenTree/plugin/base/action/test_action.py +++ b/InvenTree/plugin/base/action/test_action.py @@ -1,7 +1,7 @@ """ Unit tests for action plugins """ -from django.test import TestCase from django.contrib.auth import get_user_model +from django.test import TestCase from plugin import InvenTreePlugin from plugin.mixins import ActionMixin diff --git a/InvenTree/plugin/base/barcodes/api.py b/InvenTree/plugin/base/barcodes/api.py index edd9fc3dcc..a12150d88f 100644 --- a/InvenTree/plugin/base/barcodes/api.py +++ b/InvenTree/plugin/base/barcodes/api.py @@ -1,19 +1,18 @@ # -*- 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 rest_framework.exceptions import ValidationError from rest_framework import permissions +from rest_framework.exceptions import ValidationError from rest_framework.response import Response 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.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): """ diff --git a/InvenTree/plugin/base/barcodes/mixins.py b/InvenTree/plugin/base/barcodes/mixins.py index 417ca04bcd..ef3b6004ee 100644 --- a/InvenTree/plugin/base/barcodes/mixins.py +++ b/InvenTree/plugin/base/barcodes/mixins.py @@ -1,12 +1,12 @@ """ Plugin mixin classes for barcode plugin """ -import string import hashlib +import string -from stock.models import StockItem -from stock.serializers import StockItemSerializer, LocationSerializer from part.serializers import PartSerializer +from stock.models import StockItem +from stock.serializers import LocationSerializer, StockItemSerializer def hash_barcode(barcode_data): diff --git a/InvenTree/plugin/base/barcodes/test_barcode.py b/InvenTree/plugin/base/barcodes/test_barcode.py index 43a713a57b..88d4109069 100644 --- a/InvenTree/plugin/base/barcodes/test_barcode.py +++ b/InvenTree/plugin/base/barcodes/test_barcode.py @@ -7,8 +7,8 @@ Unit tests for Barcode endpoints from django.contrib.auth import get_user_model from django.urls import reverse -from rest_framework.test import APITestCase from rest_framework import status +from rest_framework.test import APITestCase from stock.models import StockItem diff --git a/InvenTree/plugin/base/event/events.py b/InvenTree/plugin/base/event/events.py index 4dea7525b3..d2294b4416 100644 --- a/InvenTree/plugin/base/event/events.py +++ b/InvenTree/plugin/base/event/events.py @@ -6,15 +6,13 @@ import logging from django.conf import settings 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 InvenTree.ready import canAppAccessDatabase, isImportingData from InvenTree.tasks import offload_task - from plugin.registry import registry - logger = logging.getLogger('inventree') diff --git a/InvenTree/plugin/base/integration/mixins.py b/InvenTree/plugin/base/integration/mixins.py index 6977ef3dd9..18b4cb0fd4 100644 --- a/InvenTree/plugin/base/integration/mixins.py +++ b/InvenTree/plugin/base/integration/mixins.py @@ -2,22 +2,21 @@ Plugin mixin classes """ -import logging import json +import logging + +from django.db.utils import OperationalError, ProgrammingError +from django.urls import include, re_path + import requests -from django.urls import include, re_path -from django.db.utils import OperationalError, ProgrammingError - import InvenTree.helpers - -from plugin.helpers import MixinImplementationError, MixinNotImplementedError -from plugin.helpers import render_template, render_text +from plugin.helpers import (MixinImplementationError, MixinNotImplementedError, + render_template, render_text) from plugin.models import PluginConfig, PluginSetting from plugin.registry import registry from plugin.urls import PLUGIN_BASE - logger = logging.getLogger('inventree') diff --git a/InvenTree/plugin/base/integration/test_mixins.py b/InvenTree/plugin/base/integration/test_mixins.py index c1afa39fc2..d5dac21746 100644 --- a/InvenTree/plugin/base/integration/test_mixins.py +++ b/InvenTree/plugin/base/integration/test_mixins.py @@ -1,19 +1,19 @@ """ Unit tests for base mixins for plugins """ -from django.test import TestCase from django.conf import settings -from django.urls import include, re_path, reverse from django.contrib.auth import get_user_model from django.contrib.auth.models import Group +from django.test import TestCase +from django.urls import include, re_path, reverse from error_report.models import Error from plugin import InvenTreePlugin -from plugin.mixins import AppMixin, SettingsMixin, UrlsMixin, NavigationMixin, APICallMixin -from plugin.urls import PLUGIN_BASE from plugin.helpers import MixinNotImplementedError - +from plugin.mixins import (APICallMixin, AppMixin, NavigationMixin, + SettingsMixin, UrlsMixin) from plugin.registry import registry +from plugin.urls import PLUGIN_BASE class BaseMixinDefinition: diff --git a/InvenTree/plugin/base/label/label.py b/InvenTree/plugin/base/label/label.py index 7f29ba70f4..daaaaedbe2 100644 --- a/InvenTree/plugin/base/label/label.py +++ b/InvenTree/plugin/base/label/label.py @@ -3,9 +3,8 @@ import logging from django.utils.translation import gettext_lazy as _ -from plugin.registry import registry import common.notifications - +from plugin.registry import registry logger = logging.getLogger('inventree') diff --git a/InvenTree/plugin/base/locate/api.py b/InvenTree/plugin/base/locate/api.py index 3004abb262..da0488591f 100644 --- a/InvenTree/plugin/base/locate/api.py +++ b/InvenTree/plugin/base/locate/api.py @@ -1,12 +1,11 @@ """API for location plugins""" from rest_framework import permissions -from rest_framework.exceptions import ParseError, NotFound +from rest_framework.exceptions import NotFound, ParseError from rest_framework.response import Response from rest_framework.views import APIView from InvenTree.tasks import offload_task - from plugin.registry import registry from stock.models import StockItem, StockLocation diff --git a/InvenTree/plugin/base/locate/test_locate.py b/InvenTree/plugin/base/locate/test_locate.py index e145c2360b..361b791c4b 100644 --- a/InvenTree/plugin/base/locate/test_locate.py +++ b/InvenTree/plugin/base/locate/test_locate.py @@ -5,7 +5,6 @@ Unit tests for the 'locate' plugin mixin class from django.urls import reverse from InvenTree.api_tester import InvenTreeAPITestCase - from plugin.registry import registry from stock.models import StockItem, StockLocation diff --git a/InvenTree/plugin/builtin/action/test_simpleactionplugin.py b/InvenTree/plugin/builtin/action/test_simpleactionplugin.py index 92e1affa67..f9276ba7c3 100644 --- a/InvenTree/plugin/builtin/action/test_simpleactionplugin.py +++ b/InvenTree/plugin/builtin/action/test_simpleactionplugin.py @@ -1,7 +1,7 @@ """ Unit tests for action plugins """ -from django.test import TestCase from django.contrib.auth import get_user_model +from django.test import TestCase from plugin.builtin.action.simpleactionplugin import SimpleActionPlugin diff --git a/InvenTree/plugin/builtin/barcodes/inventree_barcode.py b/InvenTree/plugin/builtin/barcodes/inventree_barcode.py index f9f498ccd8..bbc2d29c68 100644 --- a/InvenTree/plugin/builtin/barcodes/inventree_barcode.py +++ b/InvenTree/plugin/builtin/barcodes/inventree_barcode.py @@ -13,13 +13,12 @@ references model objects actually exist in the database. import json +from rest_framework.exceptions import ValidationError + +from part.models import Part from plugin import InvenTreePlugin from plugin.mixins import BarcodeMixin - from stock.models import StockItem, StockLocation -from part.models import Part - -from rest_framework.exceptions import ValidationError class InvenTreeBarcodePlugin(BarcodeMixin, InvenTreePlugin): diff --git a/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py b/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py index 1424d89ff2..4226ff055b 100644 --- a/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py +++ b/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py @@ -4,8 +4,8 @@ from django.contrib.auth import get_user_model from django.urls import reverse -from rest_framework.test import APITestCase from rest_framework import status +from rest_framework.test import APITestCase class TestInvenTreeBarcode(APITestCase): diff --git a/InvenTree/plugin/builtin/integration/core_notifications.py b/InvenTree/plugin/builtin/integration/core_notifications.py index 67b61eea3b..179fb7994f 100644 --- a/InvenTree/plugin/builtin/integration/core_notifications.py +++ b/InvenTree/plugin/builtin/integration/core_notifications.py @@ -5,9 +5,9 @@ from django.utils.translation import ugettext_lazy as _ from allauth.account.models import EmailAddress +import InvenTree.tasks from plugin import InvenTreePlugin from plugin.mixins import BulkNotificationMethod, SettingsMixin -import InvenTree.tasks class PlgMixin: diff --git a/InvenTree/plugin/builtin/integration/test_core_notifications.py b/InvenTree/plugin/builtin/integration/test_core_notifications.py index e93d2a84cd..3badac2562 100644 --- a/InvenTree/plugin/builtin/integration/test_core_notifications.py +++ b/InvenTree/plugin/builtin/integration/test_core_notifications.py @@ -1,7 +1,8 @@ -from plugin.models import NotificationUserSetting from part.test_part import BaseNotificationIntegrationTest -from plugin.builtin.integration.core_notifications import CoreNotificationsPlugin from plugin import registry +from plugin.builtin.integration.core_notifications import \ + CoreNotificationsPlugin +from plugin.models import NotificationUserSetting class CoreNotificationTestTests(BaseNotificationIntegrationTest): diff --git a/InvenTree/plugin/events.py b/InvenTree/plugin/events.py index 66c6267d53..452e71d4ef 100644 --- a/InvenTree/plugin/events.py +++ b/InvenTree/plugin/events.py @@ -2,7 +2,8 @@ Import helper for events """ -from plugin.base.event.events import process_event, register_event, trigger_event +from plugin.base.event.events import (process_event, register_event, + trigger_event) __all__ = [ 'process_event', diff --git a/InvenTree/plugin/helpers.py b/InvenTree/plugin/helpers.py index 90ffe61478..8a3a38a4ca 100644 --- a/InvenTree/plugin/helpers.py +++ b/InvenTree/plugin/helpers.py @@ -1,21 +1,20 @@ """ Helpers for plugin app """ +import inspect +import logging import os -import subprocess import pathlib +import pkgutil +import subprocess import sysconfig import traceback -import inspect -import pkgutil -import logging from django import template from django.conf import settings from django.core.exceptions import AppRegistryNotReady from django.db.utils import IntegrityError - logger = logging.getLogger('inventree') diff --git a/InvenTree/plugin/mixins/__init__.py b/InvenTree/plugin/mixins/__init__.py index 5a2bf95be6..80088de561 100644 --- a/InvenTree/plugin/mixins/__init__.py +++ b/InvenTree/plugin/mixins/__init__.py @@ -2,13 +2,15 @@ Utility class to enable simpler imports """ -from ..base.integration.mixins import APICallMixin, AppMixin, SettingsMixin, ScheduleMixin, UrlsMixin, NavigationMixin, PanelMixin - -from common.notifications import SingleNotificationMethod, BulkNotificationMethod +from common.notifications import (BulkNotificationMethod, + SingleNotificationMethod) from ..base.action.mixins import ActionMixin from ..base.barcodes.mixins import BarcodeMixin from ..base.event.mixins import EventMixin +from ..base.integration.mixins import (APICallMixin, AppMixin, NavigationMixin, + PanelMixin, ScheduleMixin, + SettingsMixin, UrlsMixin) from ..base.label.mixins import LabelPrintingMixin from ..base.locate.mixins import LocateMixin diff --git a/InvenTree/plugin/models.py b/InvenTree/plugin/models.py index 27f77a9eb5..35becb9c47 100644 --- a/InvenTree/plugin/models.py +++ b/InvenTree/plugin/models.py @@ -4,13 +4,12 @@ Plugin model definitions import warnings -from django.utils.translation import gettext_lazy as _ -from django.db import models -from django.contrib.auth.models import User from django.conf import settings +from django.contrib.auth.models import User +from django.db import models +from django.utils.translation import gettext_lazy as _ import common.models - from plugin import InvenTreePlugin, registry diff --git a/InvenTree/plugin/plugin.py b/InvenTree/plugin/plugin.py index b008865f5c..d5f6a7bccf 100644 --- a/InvenTree/plugin/plugin.py +++ b/InvenTree/plugin/plugin.py @@ -2,21 +2,20 @@ """ Base Class for InvenTree plugins """ +import inspect import logging import os -import inspect -from datetime import datetime import pathlib import warnings +from datetime import datetime from django.conf import settings from django.db.utils import OperationalError, ProgrammingError +from django.urls.base import reverse from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ -from django.urls.base import reverse - -from plugin.helpers import get_git_log, GitStatus +from plugin.helpers import GitStatus, get_git_log logger = logging.getLogger("inventree") diff --git a/InvenTree/plugin/registry.py b/InvenTree/plugin/registry.py index 1ec5adb161..40e5bd3ff5 100644 --- a/InvenTree/plugin/registry.py +++ b/InvenTree/plugin/registry.py @@ -6,28 +6,26 @@ Registry for loading and managing multiple plugins at run-time """ import importlib -import pathlib import logging import os +import pathlib import subprocess - +from importlib import metadata, reload from typing import OrderedDict -from importlib import reload, metadata from django.apps import apps from django.conf import settings -from django.db.utils import OperationalError, ProgrammingError, IntegrityError -from django.urls import include, re_path -from django.urls import clear_url_caches from django.contrib import admin +from django.db.utils import IntegrityError, OperationalError, ProgrammingError +from django.urls import clear_url_caches, include, re_path from django.utils.text import slugify -from maintenance_mode.core import maintenance_mode_on -from maintenance_mode.core import get_maintenance_mode, set_maintenance_mode +from maintenance_mode.core import (get_maintenance_mode, maintenance_mode_on, + set_maintenance_mode) +from .helpers import (IntegrationPluginError, get_plugins, handle_error, + log_error) from .plugin import InvenTreePlugin -from .helpers import handle_error, log_error, get_plugins, IntegrationPluginError - logger = logging.getLogger('inventree') @@ -576,7 +574,8 @@ class PluginsRegistry: self.plugins_inactive = {} def _update_urls(self): - from InvenTree.urls import urlpatterns as global_pattern, frontendpatterns as urlpatterns + from InvenTree.urls import frontendpatterns as urlpatterns + from InvenTree.urls import urlpatterns as global_pattern from plugin.urls import get_plugin_urls for index, a in enumerate(urlpatterns): diff --git a/InvenTree/plugin/samples/integration/custom_panel_sample.py b/InvenTree/plugin/samples/integration/custom_panel_sample.py index 3d44bc0c5b..cb1a938504 100644 --- a/InvenTree/plugin/samples/integration/custom_panel_sample.py +++ b/InvenTree/plugin/samples/integration/custom_panel_sample.py @@ -2,10 +2,9 @@ Sample plugin which renders custom panels on certain pages """ +from part.views import PartDetail from plugin import InvenTreePlugin from plugin.mixins import PanelMixin, SettingsMixin - -from part.views import PartDetail from stock.views import StockLocationDetail diff --git a/InvenTree/plugin/samples/integration/sample.py b/InvenTree/plugin/samples/integration/sample.py index e2f10fcabe..a768fb3de3 100644 --- a/InvenTree/plugin/samples/integration/sample.py +++ b/InvenTree/plugin/samples/integration/sample.py @@ -2,12 +2,12 @@ Sample implementations for IntegrationPlugin """ -from plugin import InvenTreePlugin -from plugin.mixins import AppMixin, SettingsMixin, UrlsMixin, NavigationMixin - from django.http import HttpResponse -from django.utils.translation import gettext_lazy as _ from django.urls import include, re_path +from django.utils.translation import gettext_lazy as _ + +from plugin import InvenTreePlugin +from plugin.mixins import AppMixin, NavigationMixin, SettingsMixin, UrlsMixin class SampleIntegrationPlugin(AppMixin, SettingsMixin, UrlsMixin, NavigationMixin, InvenTreePlugin): diff --git a/InvenTree/plugin/samples/integration/test_sample.py b/InvenTree/plugin/samples/integration/test_sample.py index 733e443638..aaff9f9624 100644 --- a/InvenTree/plugin/samples/integration/test_sample.py +++ b/InvenTree/plugin/samples/integration/test_sample.py @@ -1,7 +1,7 @@ """ Unit tests for action plugins """ -from django.test import TestCase from django.contrib.auth import get_user_model +from django.test import TestCase class SampleIntegrationPluginTests(TestCase): diff --git a/InvenTree/plugin/samples/integration/test_scheduled_task.py b/InvenTree/plugin/samples/integration/test_scheduled_task.py index a232324958..c99a662ff9 100644 --- a/InvenTree/plugin/samples/integration/test_scheduled_task.py +++ b/InvenTree/plugin/samples/integration/test_scheduled_task.py @@ -2,10 +2,10 @@ from django.test import TestCase -from plugin import registry, InvenTreePlugin +from plugin import InvenTreePlugin, registry from plugin.helpers import MixinImplementationError -from plugin.registry import call_function from plugin.mixins import ScheduleMixin +from plugin.registry import call_function class ExampleScheduledTaskPluginTests(TestCase): diff --git a/InvenTree/plugin/samples/locate/locate_sample.py b/InvenTree/plugin/samples/locate/locate_sample.py index 32a2dd713c..99242ead35 100644 --- a/InvenTree/plugin/samples/locate/locate_sample.py +++ b/InvenTree/plugin/samples/locate/locate_sample.py @@ -9,7 +9,6 @@ import logging from plugin import InvenTreePlugin from plugin.mixins import LocateMixin - logger = logging.getLogger('inventree') diff --git a/InvenTree/plugin/serializers.py b/InvenTree/plugin/serializers.py index b3c57d9291..4ab067eebb 100644 --- a/InvenTree/plugin/serializers.py +++ b/InvenTree/plugin/serializers.py @@ -5,15 +5,15 @@ JSON serializers for plugin app import os import subprocess -from django.core.exceptions import ValidationError from django.conf import settings -from django.utils.translation import gettext_lazy as _ +from django.core.exceptions import ValidationError from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers -from plugin.models import PluginConfig, PluginSetting, NotificationUserSetting from common.serializers import GenericReferencedSettingSerializer +from plugin.models import NotificationUserSetting, PluginConfig, PluginSetting class MetadataSerializer(serializers.ModelSerializer): diff --git a/InvenTree/plugin/templatetags/plugin_extras.py b/InvenTree/plugin/templatetags/plugin_extras.py index 5eca037104..b949ced8e3 100644 --- a/InvenTree/plugin/templatetags/plugin_extras.py +++ b/InvenTree/plugin/templatetags/plugin_extras.py @@ -2,13 +2,13 @@ """ This module provides template tags for handeling plugins """ -from django.conf import settings as djangosettings from django import template +from django.conf import settings as djangosettings from django.urls import reverse from common.models import InvenTreeSetting -from plugin import registry from common.notifications import storage +from plugin import registry register = template.Library() diff --git a/InvenTree/plugin/test_api.py b/InvenTree/plugin/test_api.py index e3685969af..e04c0ee84b 100644 --- a/InvenTree/plugin/test_api.py +++ b/InvenTree/plugin/test_api.py @@ -76,8 +76,8 @@ class PluginDetailAPITest(InvenTreeAPITestCase): """ Test the PluginConfig action commands """ - from plugin.models import PluginConfig from plugin import registry + from plugin.models import PluginConfig url = reverse('admin:plugin_pluginconfig_changelist') fixtures = PluginConfig.objects.all() @@ -135,8 +135,8 @@ class PluginDetailAPITest(InvenTreeAPITestCase): """ Test the PluginConfig model """ - from plugin.models import PluginConfig from plugin import registry + from plugin.models import PluginConfig fixtures = PluginConfig.objects.all() diff --git a/InvenTree/plugin/test_plugin.py b/InvenTree/plugin/test_plugin.py index 5de813150f..1516c4eee8 100644 --- a/InvenTree/plugin/test_plugin.py +++ b/InvenTree/plugin/test_plugin.py @@ -6,10 +6,11 @@ from datetime import datetime from django.test import TestCase -from plugin.samples.integration.sample import SampleIntegrationPlugin -from plugin.samples.integration.another_sample import WrongIntegrationPlugin, NoIntegrationPlugin import plugin.templatetags.plugin_extras as plugin_tags -from plugin import registry, InvenTreePlugin, IntegrationPluginBase +from plugin import IntegrationPluginBase, InvenTreePlugin, registry +from plugin.samples.integration.another_sample import (NoIntegrationPlugin, + WrongIntegrationPlugin) +from plugin.samples.integration.sample import SampleIntegrationPlugin class PluginTagTests(TestCase): diff --git a/InvenTree/plugin/urls.py b/InvenTree/plugin/urls.py index 08f547aca2..be90ff1618 100644 --- a/InvenTree/plugin/urls.py +++ b/InvenTree/plugin/urls.py @@ -6,7 +6,6 @@ from django.urls import include, re_path from plugin import registry - PLUGIN_BASE = 'plugin' # Constant for links diff --git a/InvenTree/plugin/views.py b/InvenTree/plugin/views.py index ad4d54daea..066047d33f 100644 --- a/InvenTree/plugin/views.py +++ b/InvenTree/plugin/views.py @@ -9,7 +9,6 @@ from error_report.models import Error from plugin.registry import registry - logger = logging.getLogger('inventree') diff --git a/InvenTree/report/admin.py b/InvenTree/report/admin.py index 6456bf72c5..6e1b919633 100644 --- a/InvenTree/report/admin.py +++ b/InvenTree/report/admin.py @@ -1,11 +1,7 @@ from django.contrib import admin -from .models import ReportSnippet, ReportAsset -from .models import TestReport -from .models import BuildReport -from .models import BillOfMaterialsReport -from .models import PurchaseOrderReport -from .models import SalesOrderReport +from .models import (BillOfMaterialsReport, BuildReport, PurchaseOrderReport, + ReportAsset, ReportSnippet, SalesOrderReport, TestReport) class ReportTemplateAdmin(admin.ModelAdmin): diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py index f8b31fef99..106da81f08 100644 --- a/InvenTree/report/api.py +++ b/InvenTree/report/api.py @@ -1,36 +1,26 @@ -from django.utils.translation import gettext_lazy as _ -from django.urls import include, path, re_path -from django.core.exceptions import ValidationError, FieldError +from django.core.exceptions import FieldError, ValidationError from django.http import HttpResponse - from django.template.exceptions import TemplateDoesNotExist +from django.urls import include, path, re_path +from django.utils.translation import gettext_lazy as _ from django_filters.rest_framework import DjangoFilterBackend - -from rest_framework import generics, filters +from rest_framework import filters, generics from rest_framework.response import Response +import build.models import common.models import InvenTree.helpers - +import order.models +import part.models from stock.models import StockItem -import build.models -import part.models -import order.models - -from .models import TestReport -from .models import BuildReport -from .models import BillOfMaterialsReport -from .models import PurchaseOrderReport -from .models import SalesOrderReport - -from .serializers import TestReportSerializer -from .serializers import BuildReportSerializer -from .serializers import BOMReportSerializer -from .serializers import PurchaseOrderReportSerializer -from .serializers import SalesOrderReportSerializer +from .models import (BillOfMaterialsReport, BuildReport, PurchaseOrderReport, + SalesOrderReport, TestReport) +from .serializers import (BOMReportSerializer, BuildReportSerializer, + PurchaseOrderReportSerializer, + SalesOrderReportSerializer, TestReportSerializer) class ReportListView(generics.ListAPIView): diff --git a/InvenTree/report/apps.py b/InvenTree/report/apps.py index fe01573ff5..cc7fd6eded 100644 --- a/InvenTree/report/apps.py +++ b/InvenTree/report/apps.py @@ -1,13 +1,12 @@ +import logging import os import shutil -import logging from django.apps import AppConfig from django.conf import settings from InvenTree.ready import canAppAccessDatabase - logger = logging.getLogger("inventree") diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py index dcaa2a842d..bc852b4faa 100644 --- a/InvenTree/report/models.py +++ b/InvenTree/report/models.py @@ -2,33 +2,28 @@ Report template model definitions """ +import datetime +import logging import os import sys -import logging -import datetime - -from django.urls import reverse -from django.db import models from django.conf import settings from django.core.cache import cache -from django.core.exceptions import ValidationError, FieldError - -from django.template.loader import render_to_string -from django.template import Template, Context - +from django.core.exceptions import FieldError, ValidationError from django.core.validators import FileExtensionValidator +from django.db import models +from django.template import Context, Template +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ import build.models import common.models +import order.models import part.models import stock.models -import order.models - from InvenTree.helpers import validateFilterString -from django.utils.translation import gettext_lazy as _ - try: from django_weasyprint import WeasyTemplateResponseMixin except OSError as err: # pragma: no cover diff --git a/InvenTree/report/serializers.py b/InvenTree/report/serializers.py index 1db0cca1b9..daa1e254d5 100644 --- a/InvenTree/report/serializers.py +++ b/InvenTree/report/serializers.py @@ -1,11 +1,9 @@ -from InvenTree.serializers import InvenTreeModelSerializer -from InvenTree.serializers import InvenTreeAttachmentSerializerField +from InvenTree.serializers import (InvenTreeAttachmentSerializerField, + InvenTreeModelSerializer) -from .models import TestReport -from .models import BuildReport -from .models import BillOfMaterialsReport -from .models import PurchaseOrderReport, SalesOrderReport +from .models import (BillOfMaterialsReport, BuildReport, PurchaseOrderReport, + SalesOrderReport, TestReport) class TestReportSerializer(InvenTreeModelSerializer): diff --git a/InvenTree/report/templatetags/barcode.py b/InvenTree/report/templatetags/barcode.py index a47d45fdf0..8d8397d50a 100644 --- a/InvenTree/report/templatetags/barcode.py +++ b/InvenTree/report/templatetags/barcode.py @@ -7,8 +7,8 @@ from io import BytesIO from django import template -import qrcode as python_qrcode import barcode as python_barcode +import qrcode as python_qrcode register = template.Library() diff --git a/InvenTree/report/templatetags/report.py b/InvenTree/report/templatetags/report.py index 9593db1885..8a14501933 100644 --- a/InvenTree/report/templatetags/report.py +++ b/InvenTree/report/templatetags/report.py @@ -8,14 +8,12 @@ from django import template from django.conf import settings from django.utils.safestring import mark_safe +import InvenTree.helpers +from common.models import InvenTreeSetting from company.models import Company from part.models import Part from stock.models import StockItem -from common.models import InvenTreeSetting - -import InvenTree.helpers - register = template.Library() diff --git a/InvenTree/report/tests.py b/InvenTree/report/tests.py index d30a5814d9..38fbb491bf 100644 --- a/InvenTree/report/tests.py +++ b/InvenTree/report/tests.py @@ -2,16 +2,15 @@ import os import shutil +from django.conf import settings from django.http.response import StreamingHttpResponse from django.urls import reverse -from django.conf import settings - -from InvenTree.api_tester import InvenTreeAPITestCase import report.models as report_models -from common.models import InvenTreeUserSetting -from stock.models import StockItem from build.models import Build +from common.models import InvenTreeUserSetting +from InvenTree.api_tester import InvenTreeAPITestCase +from stock.models import StockItem class ReportTest(InvenTreeAPITestCase): diff --git a/InvenTree/script/translation_stats.py b/InvenTree/script/translation_stats.py index 4ee83120eb..e96708d1f2 100644 --- a/InvenTree/script/translation_stats.py +++ b/InvenTree/script/translation_stats.py @@ -2,8 +2,8 @@ This script calculates translation coverage for various languages """ -import os import json +import os import sys diff --git a/InvenTree/stock/admin.py b/InvenTree/stock/admin.py index 4b7cf38bf5..85d7b7afe0 100644 --- a/InvenTree/stock/admin.py +++ b/InvenTree/stock/admin.py @@ -1,19 +1,18 @@ 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 - -from .models import StockLocation, StockItem, StockItemAttachment -from .models import StockItemTracking -from .models import StockItemTestResult +from import_export.admin import ImportExportModelAdmin +from import_export.fields import Field +from import_export.resources import ModelResource from build.models import Build from company.models import Company, SupplierPart from order.models import PurchaseOrder, SalesOrder from part.models import Part +from .models import (StockItem, StockItemAttachment, StockItemTestResult, + StockItemTracking, StockLocation) + class LocationResource(ModelResource): """ Class for managing StockLocation data import/export """ diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 7bb5d7000b..4bc21df5a9 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -6,48 +6,36 @@ from collections import OrderedDict from datetime import datetime, timedelta from django.core.exceptions import ValidationError as DjangoValidationError -from django.urls import include, path, re_path -from django.http import JsonResponse -from django.db.models import Q, F from django.db import transaction +from django.db.models import F, Q +from django.http import JsonResponse +from django.urls import include, path, re_path from django.utils.translation import gettext_lazy as _ -from django_filters.rest_framework import DjangoFilterBackend from django_filters import rest_framework as rest_filters - -from rest_framework import status -from rest_framework.serializers import ValidationError +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import filters, generics, status from rest_framework.response import Response -from rest_framework import generics, filters +from rest_framework.serializers import ValidationError -from build.models import Build - -import common.settings import common.models - +import common.settings +import stock.serializers as StockSerializers +from build.models import Build from company.models import Company, SupplierPart from company.serializers import CompanySerializer, SupplierPartSerializer - -from InvenTree.helpers import str2bool, isNull, extract_serial_numbers -from InvenTree.helpers import DownloadFile -from InvenTree.api import AttachmentMixin, APIDownloadMixin +from InvenTree.api import APIDownloadMixin, AttachmentMixin from InvenTree.filters import InvenTreeOrderingFilter - -from order.models import PurchaseOrder -from order.models import SalesOrder, SalesOrderAllocation +from InvenTree.helpers import (DownloadFile, extract_serial_numbers, isNull, + str2bool) +from order.models import PurchaseOrder, SalesOrder, SalesOrderAllocation from order.serializers import PurchaseOrderSerializer - from part.models import BomItem, Part, PartCategory from part.serializers import PartBriefSerializer - from plugin.serializers import MetadataSerializer - from stock.admin import StockItemResource -from stock.models import StockLocation, StockItem -from stock.models import StockItemTracking -from stock.models import StockItemAttachment -from stock.models import StockItemTestResult -import stock.serializers as StockSerializers +from stock.models import (StockItem, StockItemAttachment, StockItemTestResult, + StockItemTracking, StockLocation) class StockDetail(generics.RetrieveUpdateDestroyAPIView): diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 6cd0469b75..3faea832d9 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -3,49 +3,40 @@ Stock database model definitions """ import os +from datetime import datetime, timedelta +from decimal import Decimal, InvalidOperation + +from django.contrib.auth.models import User +from django.core.exceptions import FieldError, ValidationError +from django.core.validators import MinValueValidator +from django.db import models, transaction +from django.db.models import Q, Sum +from django.db.models.functions import Coalesce +from django.db.models.signals import post_delete, post_save, pre_delete +from django.dispatch import receiver +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ from jinja2 import Template - -from django.utils.translation import gettext_lazy as _ -from django.core.exceptions import ValidationError, FieldError -from django.urls import reverse - -from django.db import models, transaction -from django.db.models import Sum, Q -from django.db.models.functions import Coalesce -from django.core.validators import MinValueValidator -from django.contrib.auth.models import User -from django.db.models.signals import pre_delete, post_save, post_delete -from django.dispatch import receiver - from markdownx.models import MarkdownxField - -from mptt.models import MPTTModel, TreeForeignKey from mptt.managers import TreeManager +from mptt.models import MPTTModel, TreeForeignKey -from decimal import Decimal, InvalidOperation -from datetime import datetime, timedelta - +import common.models import InvenTree.helpers import InvenTree.ready import InvenTree.tasks - -import common.models -import report.models import label.models - -from plugin.models import MetadataMixin -from plugin.events import trigger_event - -from InvenTree.status_codes import StockStatus, StockHistoryCode -from InvenTree.models import InvenTreeTree, InvenTreeAttachment -from InvenTree.fields import InvenTreeModelMoneyField, InvenTreeURLField -from InvenTree.serializers import extract_int - -from users.models import Owner - +import report.models from company import models as CompanyModels +from InvenTree.fields import InvenTreeModelMoneyField, InvenTreeURLField +from InvenTree.models import InvenTreeAttachment, InvenTreeTree +from InvenTree.serializers import extract_int +from InvenTree.status_codes import StockHistoryCode, StockStatus from part import models as PartModels +from plugin.events import trigger_event +from plugin.models import MetadataMixin +from users.models import Owner class StockLocation(MetadataMixin, InvenTreeTree): diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 40303fc120..920052a0ec 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -2,39 +2,31 @@ JSON serializers for Stock app """ -from decimal import Decimal from datetime import datetime, timedelta -from django.db import transaction +from decimal import Decimal from django.core.exceptions import ValidationError as DjangoValidationError -from django.utils.translation import gettext_lazy as _ +from django.db import transaction +from django.db.models import BooleanField, Case, Q, Value, When from django.db.models.functions import Coalesce -from django.db.models import Case, When, Value -from django.db.models import BooleanField -from django.db.models import Q +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.serializers import ValidationError - -from sql_util.utils import SubquerySum, SubqueryCount - -from .models import StockItem, StockLocation -from .models import StockItemTracking -from .models import StockItemAttachment -from .models import StockItemTestResult +from sql_util.utils import SubqueryCount, SubquerySum import common.models -from common.settings import currency_code_default, currency_code_mappings - import company.models -from company.serializers import SupplierPartSerializer - import InvenTree.helpers import InvenTree.serializers +from common.settings import currency_code_default, currency_code_mappings +from company.serializers import SupplierPartSerializer from InvenTree.serializers import InvenTreeDecimalField, extract_int - from part.serializers import PartBriefSerializer +from .models import (StockItem, StockItemAttachment, StockItemTestResult, + StockItemTracking, StockLocation) + class LocationBriefSerializer(InvenTree.serializers.InvenTreeModelSerializer): """ diff --git a/InvenTree/stock/test_api.py b/InvenTree/stock/test_api.py index ccdac8d2c6..87d8bfaada 100644 --- a/InvenTree/stock/test_api.py +++ b/InvenTree/stock/test_api.py @@ -2,22 +2,21 @@ Unit testing for the Stock API """ -import os import io -import tablib - +import os from datetime import datetime, timedelta import django.http from django.urls import reverse + +import tablib from rest_framework import status -from InvenTree.status_codes import StockStatus -from InvenTree.api_tester import InvenTreeAPITestCase - -from common.models import InvenTreeSetting import company.models import part.models +from common.models import InvenTreeSetting +from InvenTree.api_tester import InvenTreeAPITestCase +from InvenTree.status_codes import StockStatus from stock.models import StockItem, StockLocation diff --git a/InvenTree/stock/test_views.py b/InvenTree/stock/test_views.py index d656201f81..dbe9a2a87e 100644 --- a/InvenTree/stock/test_views.py +++ b/InvenTree/stock/test_views.py @@ -1,9 +1,9 @@ """ Unit tests for Stock 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.models import Group +from django.test import TestCase +from django.urls import reverse # from common.models import InvenTreeSetting diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py index 97639b15bd..e0c09d8e34 100644 --- a/InvenTree/stock/tests.py +++ b/InvenTree/stock/tests.py @@ -1,17 +1,16 @@ -from django.test import TestCase -from django.db.models import Sum -from django.contrib.auth import get_user_model -from django.core.exceptions import ValidationError - import datetime -from InvenTree.status_codes import StockHistoryCode +from django.contrib.auth import get_user_model +from django.core.exceptions import ValidationError +from django.db.models import Sum +from django.test import TestCase -from .models import StockLocation, StockItem, StockItemTracking -from .models import StockItemTestResult - -from part.models import Part from build.models import Build +from InvenTree.status_codes import StockHistoryCode +from part.models import Part + +from .models import (StockItem, StockItemTestResult, StockItemTracking, + StockLocation) class StockTest(TestCase): diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 15191b5fb7..f38d1777a6 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -4,26 +4,20 @@ Django views for interacting with Stock app from datetime import datetime -from django.views.generic import DetailView, ListView -from django.urls import reverse from django.http import HttpResponseRedirect - +from django.urls import reverse from django.utils.translation import gettext_lazy as _ - -from InvenTree.views import AjaxUpdateView, AjaxDeleteView, AjaxCreateView -from InvenTree.views import QRCodeView -from InvenTree.views import InvenTreeRoleMixin -from InvenTree.forms import ConfirmForm - -from InvenTree.helpers import str2bool - -from .models import StockItem, StockLocation, StockItemTracking +from django.views.generic import DetailView, ListView import common.settings +from InvenTree.forms import ConfirmForm +from InvenTree.helpers import str2bool +from InvenTree.views import (AjaxCreateView, AjaxDeleteView, AjaxUpdateView, + InvenTreeRoleMixin, QRCodeView) +from plugin.views import InvenTreePluginViewMixin from . import forms as StockForms - -from plugin.views import InvenTreePluginViewMixin +from .models import StockItem, StockItemTracking, StockLocation class StockIndex(InvenTreeRoleMixin, InvenTreePluginViewMixin, ListView): diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py index 2784f28efe..2be478fa0e 100644 --- a/InvenTree/users/admin.py +++ b/InvenTree/users/admin.py @@ -1,15 +1,14 @@ +from django import forms +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.models import Group +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ -from django.contrib import admin, messages -from django import forms -from django.contrib.auth import get_user_model -from django.contrib.admin.widgets import FilteredSelectMultiple -from django.contrib.auth.models import Group -from django.contrib.auth.admin import UserAdmin -from django.utils.safestring import mark_safe - -from users.models import RuleSet, Owner +from users.models import Owner, RuleSet User = get_user_model() diff --git a/InvenTree/users/api.py b/InvenTree/users/api.py index 2a78abcbbf..d2b25ceb5b 100644 --- a/InvenTree/users/api.py +++ b/InvenTree/users/api.py @@ -1,19 +1,16 @@ from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist - from django.urls import include, path, re_path from django_filters.rest_framework import DjangoFilterBackend - -from rest_framework import filters, generics, permissions -from rest_framework.views import APIView +from rest_framework import filters, generics, permissions, status from rest_framework.authtoken.models import Token from rest_framework.response import Response -from rest_framework import status +from rest_framework.views import APIView -from users.models import RuleSet, Owner, check_user_role -from users.serializers import UserSerializer, OwnerSerializer +from users.models import Owner, RuleSet, check_user_role +from users.serializers import OwnerSerializer, UserSerializer class OwnerList(generics.ListAPIView): diff --git a/InvenTree/users/apps.py b/InvenTree/users/apps.py index b610e23488..b20927f0ed 100644 --- a/InvenTree/users/apps.py +++ b/InvenTree/users/apps.py @@ -1,6 +1,5 @@ -from django.db.utils import OperationalError, ProgrammingError - from django.apps import AppConfig +from django.db.utils import OperationalError, ProgrammingError from InvenTree.ready import canAppAccessDatabase @@ -25,6 +24,7 @@ class UsersConfig(AppConfig): def assign_permissions(self): from django.contrib.auth.models import Group + from users.models import RuleSet, update_group_roles # First, delete any rule_set objects which have become outdated! @@ -42,6 +42,7 @@ class UsersConfig(AppConfig): from django.contrib.auth import get_user_model from django.contrib.auth.models import Group + from users.models import Owner # Create group owners diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index 3c33614b97..be5fac1641 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -1,23 +1,21 @@ # -*- coding: utf-8 -*- -from django.urls import reverse +import logging + from django.contrib.auth import get_user_model from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType -from django.db.models import UniqueConstraint, Q -from django.db.utils import IntegrityError from django.db import models +from django.db.models import Q, UniqueConstraint +from django.db.models.signals import post_delete, post_save +from django.db.utils import IntegrityError +from django.dispatch import receiver +from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from django.dispatch import receiver -from django.db.models.signals import post_save, post_delete - -import logging - from InvenTree.ready import canAppAccessDatabase - logger = logging.getLogger("inventree") diff --git a/InvenTree/users/serializers.py b/InvenTree/users/serializers.py index 2202cf299c..fcf1ed5678 100644 --- a/InvenTree/users/serializers.py +++ b/InvenTree/users/serializers.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- -from rest_framework import serializers from django.contrib.auth.models import User -from .models import Owner +from rest_framework import serializers from InvenTree.serializers import InvenTreeModelSerializer +from .models import Owner + class UserSerializer(InvenTreeModelSerializer): """ Serializer for a User diff --git a/InvenTree/users/tests.py b/InvenTree/users/tests.py index 9dc90f5d2c..f545acc682 100644 --- a/InvenTree/users/tests.py +++ b/InvenTree/users/tests.py @@ -1,12 +1,12 @@ -from django.test import TestCase from django.apps import apps -from django.urls import reverse from django.contrib.auth import get_user_model from django.contrib.auth.models import Group +from django.test import TestCase +from django.urls import reverse from rest_framework.authtoken.models import Token -from users.models import RuleSet, Owner +from users.models import Owner, RuleSet class RuleSetModelTest(TestCase): diff --git a/ci/check_api_endpoint.py b/ci/check_api_endpoint.py index 0d110379ef..dffacfcf3a 100644 --- a/ci/check_api_endpoint.py +++ b/ci/check_api_endpoint.py @@ -3,6 +3,7 @@ Test that the root API endpoint is available. """ import json + import requests # We expect the server to be running on the local host diff --git a/ci/check_js_templates.py b/ci/check_js_templates.py index 4f35e57eb4..84e5198982 100644 --- a/ci/check_js_templates.py +++ b/ci/check_js_templates.py @@ -7,10 +7,10 @@ This is because the "translated" javascript files are compiled into the "static" They should only contain template tags that render static information. """ -import sys -import re import os import pathlib +import re +import sys here = os.path.abspath(os.path.dirname(__file__)) template_dir = os.path.abspath(os.path.join(here, '..', 'InvenTree', 'templates')) diff --git a/ci/check_locale_files.py b/ci/check_locale_files.py index d17fe27e3d..808e3ab797 100644 --- a/ci/check_locale_files.py +++ b/ci/check_locale_files.py @@ -1,7 +1,7 @@ """ Check that there are no database migration files which have not been committed. """ -import sys import subprocess +import sys print("Checking for uncommitted locale files...") diff --git a/ci/check_migration_files.py b/ci/check_migration_files.py index 16bd87485d..2f40d49a9d 100644 --- a/ci/check_migration_files.py +++ b/ci/check_migration_files.py @@ -1,7 +1,7 @@ """ Check that there are no database migration files which have not been committed. """ -import sys import subprocess +import sys print("Checking for unstaged migration files...") diff --git a/ci/check_version_number.py b/ci/check_version_number.py index 732102ff52..3845cdfe27 100644 --- a/ci/check_version_number.py +++ b/ci/check_version_number.py @@ -2,10 +2,10 @@ On release, ensure that the release tag matches the InvenTree version number! """ -import sys -import re -import os import argparse +import os +import re +import sys if __name__ == '__main__': diff --git a/docker/gunicorn.conf.py b/docker/gunicorn.conf.py index 67b098fcb4..291f3ff198 100644 --- a/docker/gunicorn.conf.py +++ b/docker/gunicorn.conf.py @@ -1,7 +1,6 @@ +import logging import multiprocessing import os -import logging - logger = logging.getLogger('inventree') diff --git a/tasks.py b/tasks.py index 43b240e6bf..a5d1ac0e5b 100644 --- a/tasks.py +++ b/tasks.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- -import os import json -import sys +import os import pathlib import re +import sys from invoke import task