From 26226fc795d8613ec949eafedd4121ef4b8c29cd Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 13 May 2023 22:59:09 +1000 Subject: [PATCH] Fixes for circlular imports --- InvenTree/InvenTree/api_tester.py | 6 ++++ InvenTree/InvenTree/ci_render_js.py | 2 +- InvenTree/InvenTree/helpers.py | 29 ++++++++----------- InvenTree/InvenTree/test_api.py | 3 +- InvenTree/InvenTree/test_middleware.py | 2 +- InvenTree/InvenTree/test_views.py | 2 +- InvenTree/build/models.py | 3 +- InvenTree/build/tests.py | 2 +- InvenTree/common/notifications.py | 20 ++++++------- InvenTree/common/tests.py | 4 +-- InvenTree/company/test_views.py | 2 +- InvenTree/order/test_views.py | 2 +- InvenTree/part/test_bom_export.py | 2 +- InvenTree/part/test_part.py | 2 +- InvenTree/part/test_pricing.py | 2 +- InvenTree/part/test_views.py | 2 +- InvenTree/plugin/base/action/test_action.py | 2 +- .../plugin/base/integration/test_mixins.py | 2 +- .../plugin/samples/integration/test_sample.py | 2 +- .../integration/test_simpleactionplugin.py | 2 +- InvenTree/stock/test_views.py | 2 +- InvenTree/stock/tests.py | 2 +- InvenTree/users/tests.py | 2 +- 23 files changed, 50 insertions(+), 49 deletions(-) diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index 56b691d69d..0ab21c49cd 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -7,6 +7,7 @@ import re from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.http.response import StreamingHttpResponse +from django.test import TestCase from djmoney.contrib.exchange.models import ExchangeBackend, Rate from rest_framework.test import APITestCase @@ -337,3 +338,8 @@ class InvenTreeAPITestCase(ExchangeRateMixin, UserMixin, APITestCase): data.append(entry) return data + + +class InvenTreeTestCase(ExchangeRateMixin, UserMixin, TestCase): + """Testcase with user setup buildin.""" + pass diff --git a/InvenTree/InvenTree/ci_render_js.py b/InvenTree/InvenTree/ci_render_js.py index 5c7c36a30c..89628a3588 100644 --- a/InvenTree/InvenTree/ci_render_js.py +++ b/InvenTree/InvenTree/ci_render_js.py @@ -6,7 +6,7 @@ Only used for testing the js files! - This file is omited from coverage. import os # pragma: no cover import pathlib # pragma: no cover -from InvenTree.helpers import InvenTreeTestCase # pragma: no cover +from InvenTree.api_tester import InvenTreeTestCase # pragma: no cover class RenderJavascriptFiles(InvenTreeTestCase): # pragma: no cover diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index 693c3c9241..2e7633027a 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -19,7 +19,6 @@ from django.core.files.storage import default_storage from django.core.validators import URLValidator from django.db.utils import OperationalError, ProgrammingError from django.http import StreamingHttpResponse -from django.test import TestCase from django.utils.translation import gettext_lazy as _ import moneyed.localization @@ -31,13 +30,8 @@ from djmoney.money import Money from PIL import Image import common.models +import common.settings import InvenTree.version -from common.notifications import (InvenTreeNotificationBodies, - NotificationBody, trigger_notification) -from common.settings import currency_code_default - -from .api_tester import ExchangeRateMixin, UserMixin -from .settings import MEDIA_URL, STATIC_URL logger = logging.getLogger('inventree') @@ -81,12 +75,12 @@ def constructPathString(path, max_chars=250): def getMediaUrl(filename): """Return the qualified access path for the given file, under the media directory.""" - return os.path.join(MEDIA_URL, str(filename)) + return os.path.join(settings.MEDIA_URL, str(filename)) def getStaticUrl(filename): """Return the qualified access path for the given file, under the static media directory.""" - return os.path.join(STATIC_URL, str(filename)) + return os.path.join(settings.STATIC_URL, str(filename)) def construct_absolute_url(*arg, **kwargs): @@ -470,7 +464,7 @@ def decimal2money(d, currency=None): A Money object from the input(s) """ if not currency: - currency = currency_code_default() + currency = common.settings.currency_code_default() return Money(d, currency) @@ -1091,12 +1085,7 @@ def inheritors(cls): return subcls -class InvenTreeTestCase(ExchangeRateMixin, UserMixin, TestCase): - """Testcase with user setup buildin.""" - pass - - -def notify_responsible(instance, sender, content: NotificationBody = InvenTreeNotificationBodies.NewOrder, exclude=None): +def notify_responsible(instance, sender, content=None, exclude=None): """Notify all responsible parties of a change in an instance. Parses the supplied content with the provided instance and sender and sends a notification to all responsible users, @@ -1108,6 +1097,12 @@ def notify_responsible(instance, sender, content: NotificationBody = InvenTreeNo content (NotificationBody, optional): _description_. Defaults to InvenTreeNotificationBodies.NewOrder. exclude (User, optional): User instance that should be excluded. Defaults to None. """ + + import common.notifications + + if content is None: + content = common.notifications.InvenTreeNotificationBodies.NewOrder + if instance.responsible is not None: # Setup context for notification parsing content_context = { @@ -1130,7 +1125,7 @@ def notify_responsible(instance, sender, content: NotificationBody = InvenTreeNo } # Create notification - trigger_notification( + common.notifications.trigger_notification( instance, content.slug.format(**content_context), targets=[instance.responsible], diff --git a/InvenTree/InvenTree/test_api.py b/InvenTree/InvenTree/test_api.py index fb2209257c..c6ae982d44 100644 --- a/InvenTree/InvenTree/test_api.py +++ b/InvenTree/InvenTree/test_api.py @@ -6,8 +6,7 @@ from django.urls import reverse from rest_framework import status -from InvenTree.api_tester import InvenTreeAPITestCase -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeAPITestCase, InvenTreeTestCase from users.models import RuleSet, update_group_roles diff --git a/InvenTree/InvenTree/test_middleware.py b/InvenTree/InvenTree/test_middleware.py index fcfc4fe933..5deea42843 100644 --- a/InvenTree/InvenTree/test_middleware.py +++ b/InvenTree/InvenTree/test_middleware.py @@ -6,8 +6,8 @@ from django.urls import reverse from error_report.models import Error +from InvenTree.api_tester import InvenTreeTestCase from InvenTree.exceptions import log_error -from InvenTree.helpers import InvenTreeTestCase class MiddlewareTests(InvenTreeTestCase): diff --git a/InvenTree/InvenTree/test_views.py b/InvenTree/InvenTree/test_views.py index f3630229b7..c95fb15045 100644 --- a/InvenTree/InvenTree/test_views.py +++ b/InvenTree/InvenTree/test_views.py @@ -5,7 +5,7 @@ import os from django.contrib.auth import get_user_model from django.urls import reverse -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase class ViewTests(InvenTreeTestCase): diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 7651b90641..2df0018503 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -25,6 +25,7 @@ from InvenTree.status_codes import BuildStatus, StockStatus, StockHistoryCode from build.validators import generate_next_build_reference, validate_build_order_reference +import common.models import InvenTree.fields import InvenTree.helpers import InvenTree.models @@ -299,7 +300,7 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. ) project_code = models.ForeignKey( - 'common.ProjectCode', + common.models.ProjectCode, on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('Project Code'), diff --git a/InvenTree/build/tests.py b/InvenTree/build/tests.py index f197479d5c..2dee6d95da 100644 --- a/InvenTree/build/tests.py +++ b/InvenTree/build/tests.py @@ -4,7 +4,7 @@ from django.urls import reverse from datetime import datetime, timedelta -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from .models import Build from stock.models import StockItem diff --git a/InvenTree/common/notifications.py b/InvenTree/common/notifications.py index fc87725ba4..0e0f527421 100644 --- a/InvenTree/common/notifications.py +++ b/InvenTree/common/notifications.py @@ -8,12 +8,12 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.utils.translation import gettext_lazy as _ +import common.models import InvenTree.helpers -from common.models import NotificationEntry, NotificationMessage +import plugin.models +import users.models from InvenTree.ready import isImportingData from plugin import registry -from plugin.models import NotificationUserSetting, PluginConfig -from users.models import Owner logger = logging.getLogger('inventree') @@ -142,7 +142,7 @@ class NotificationMethod: def usersetting(self, target): """Returns setting for this method for a given user.""" - return NotificationUserSetting.get_setting(f'NOTIFICATION_METHOD_{self.METHOD_NAME.upper()}', user=target, method=self.METHOD_NAME) + return plugin.models.NotificationUserSetting.get_setting(f'NOTIFICATION_METHOD_{self.METHOD_NAME.upper()}', user=target, method=self.METHOD_NAME) # endregion @@ -216,7 +216,7 @@ class MethodStorageClass: # make sure the setting exists self.user_settings[new_key] = item.USER_SETTING - NotificationUserSetting.get_setting( + plugin.models.NotificationUserSetting.get_setting( key=new_key, user=user, method=item.METHOD_NAME, @@ -247,7 +247,7 @@ class UIMessageNotification(SingleNotificationMethod): def send(self, target): """Send a UI notification to a user.""" - NotificationMessage.objects.create( + common.models.NotificationMessage.objects.create( target_object=self.obj, source_object=target, user=target, @@ -338,7 +338,7 @@ def trigger_notification(obj, category=None, obj_ref='pk', **kwargs): # Check if we have notified recently... delta = timedelta(days=1) - if NotificationEntry.check_recent(category, obj_ref_value, delta): + if common.models.NotificationEntry.check_recent(category, obj_ref_value, delta): logger.info(f"Notification '{category}' has recently been sent for '{str(obj)}' - SKIPPING") return @@ -369,7 +369,7 @@ def trigger_notification(obj, category=None, obj_ref='pk', **kwargs): if user not in target_exclude: target_users.add(user) # Owner instance (either 'user' or 'group' is provided) - elif isinstance(target, Owner): + elif isinstance(target, users.models.Owner): for owner in target.get_related_owners(include_group=False): user = owner.owner if user not in target_exclude: @@ -398,12 +398,12 @@ def trigger_notification(obj, category=None, obj_ref='pk', **kwargs): logger.error(error) # Set delivery flag - NotificationEntry.notify(category, obj_ref_value) + common.models.NotificationEntry.notify(category, obj_ref_value) else: logger.info(f"No possible users for notification '{category}'") -def trigger_superuser_notification(plugin: PluginConfig, msg: str): +def trigger_superuser_notification(plugin: plugin.models.PluginConfig, msg: str): """Trigger a notification to all superusers. Args: diff --git a/InvenTree/common/tests.py b/InvenTree/common/tests.py index 27fef1c9c1..80d91ac4b9 100644 --- a/InvenTree/common/tests.py +++ b/InvenTree/common/tests.py @@ -14,8 +14,8 @@ from django.urls import reverse import PIL -from InvenTree.api_tester import InvenTreeAPITestCase, PluginMixin -from InvenTree.helpers import InvenTreeTestCase, str2bool +from InvenTree.api_tester import (InvenTreeAPITestCase, InvenTreeTestCase, + PluginMixin, str2bool) from plugin import registry from plugin.models import NotificationUserSetting diff --git a/InvenTree/company/test_views.py b/InvenTree/company/test_views.py index b9e95af7e2..1cc886d8c1 100644 --- a/InvenTree/company/test_views.py +++ b/InvenTree/company/test_views.py @@ -2,7 +2,7 @@ from django.urls import reverse -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase class CompanyViewTest(InvenTreeTestCase): diff --git a/InvenTree/order/test_views.py b/InvenTree/order/test_views.py index d878cbc604..5249d7532f 100644 --- a/InvenTree/order/test_views.py +++ b/InvenTree/order/test_views.py @@ -2,7 +2,7 @@ from django.urls import reverse -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase class OrderViewTestCase(InvenTreeTestCase): diff --git a/InvenTree/part/test_bom_export.py b/InvenTree/part/test_bom_export.py index c40b7607ed..714ac47c2b 100644 --- a/InvenTree/part/test_bom_export.py +++ b/InvenTree/part/test_bom_export.py @@ -4,7 +4,7 @@ import csv from django.urls import reverse -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase class BomExportTest(InvenTreeTestCase): diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index e1a7db6006..827d15759f 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -14,7 +14,7 @@ from common.models import (InvenTreeSetting, InvenTreeUserSetting, NotificationEntry, NotificationMessage) from common.notifications import UIMessageNotification, storage from InvenTree import version -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from .models import (Part, PartCategory, PartCategoryStar, PartRelated, PartStar, PartStocktake, PartTestTemplate, diff --git a/InvenTree/part/test_pricing.py b/InvenTree/part/test_pricing.py index e470b2389d..3e676f4e3a 100644 --- a/InvenTree/part/test_pricing.py +++ b/InvenTree/part/test_pricing.py @@ -10,7 +10,7 @@ import company.models import order.models import part.models import stock.models -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from InvenTree.status_codes import PurchaseOrderStatus diff --git a/InvenTree/part/test_views.py b/InvenTree/part/test_views.py index 5471da647b..1d04cf266f 100644 --- a/InvenTree/part/test_views.py +++ b/InvenTree/part/test_views.py @@ -2,7 +2,7 @@ from django.urls import reverse -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from .models import Part diff --git a/InvenTree/plugin/base/action/test_action.py b/InvenTree/plugin/base/action/test_action.py index d343af677a..75415660fd 100644 --- a/InvenTree/plugin/base/action/test_action.py +++ b/InvenTree/plugin/base/action/test_action.py @@ -2,7 +2,7 @@ from django.test import TestCase -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from plugin import InvenTreePlugin from plugin.mixins import ActionMixin diff --git a/InvenTree/plugin/base/integration/test_mixins.py b/InvenTree/plugin/base/integration/test_mixins.py index c5e8c4e712..e29463a201 100644 --- a/InvenTree/plugin/base/integration/test_mixins.py +++ b/InvenTree/plugin/base/integration/test_mixins.py @@ -8,7 +8,7 @@ from django.urls import include, re_path, reverse from error_report.models import Error -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from plugin import InvenTreePlugin from plugin.base.integration.mixins import PanelMixin from plugin.helpers import MixinNotImplementedError diff --git a/InvenTree/plugin/samples/integration/test_sample.py b/InvenTree/plugin/samples/integration/test_sample.py index bd04377f97..08af8d034e 100644 --- a/InvenTree/plugin/samples/integration/test_sample.py +++ b/InvenTree/plugin/samples/integration/test_sample.py @@ -1,6 +1,6 @@ """Unit tests for action plugins.""" -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase class SampleIntegrationPluginTests(InvenTreeTestCase): diff --git a/InvenTree/plugin/samples/integration/test_simpleactionplugin.py b/InvenTree/plugin/samples/integration/test_simpleactionplugin.py index af5159458e..e7f6449bf1 100644 --- a/InvenTree/plugin/samples/integration/test_simpleactionplugin.py +++ b/InvenTree/plugin/samples/integration/test_simpleactionplugin.py @@ -1,6 +1,6 @@ """Unit tests for action plugins.""" -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from plugin.samples.integration.simpleactionplugin import SimpleActionPlugin diff --git a/InvenTree/stock/test_views.py b/InvenTree/stock/test_views.py index eed3023c6e..21e46cb2be 100644 --- a/InvenTree/stock/test_views.py +++ b/InvenTree/stock/test_views.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import Group from django.urls import reverse from common.models import InvenTreeSetting -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from InvenTree.status_codes import StockStatus from stock.models import StockItem, StockLocation from users.models import Owner diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py index b9f66f2df3..094459c2fc 100644 --- a/InvenTree/stock/tests.py +++ b/InvenTree/stock/tests.py @@ -9,7 +9,7 @@ from django.test import override_settings from build.models import Build from common.models import InvenTreeSetting from company.models import Company -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from InvenTree.status_codes import StockHistoryCode from order.models import SalesOrder from part.models import Part diff --git a/InvenTree/users/tests.py b/InvenTree/users/tests.py index 20455ba696..88a90b7ea4 100644 --- a/InvenTree/users/tests.py +++ b/InvenTree/users/tests.py @@ -7,7 +7,7 @@ from django.urls import reverse from rest_framework.authtoken.models import Token -from InvenTree.helpers import InvenTreeTestCase +from InvenTree.api_tester import InvenTreeTestCase from users.models import Owner, RuleSet