2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 03:26:45 +00:00

Refactor to use structlog (#8747)

* use structlog instead of normal logging

* more fixes

* more fixes

* fix test asserts

* use static name

* fix logger

* fix assert

* fix asserts
This commit is contained in:
Matthias Mair 2025-01-05 02:48:57 +01:00 committed by GitHub
parent 3479b0008c
commit ea9e3fb992
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
84 changed files with 214 additions and 203 deletions

View File

@ -1,7 +1,6 @@
"""Main JSON interface views."""
import json
import logging
import sys
from pathlib import Path
@ -10,6 +9,7 @@ from django.db import transaction
from django.http import JsonResponse
from django.utils.translation import gettext_lazy as _
import structlog
from django_q.models import OrmQ
from drf_spectacular.utils import OpenApiResponse, extend_schema
from rest_framework import permissions, serializers
@ -31,7 +31,7 @@ from .mixins import ListAPI, RetrieveUpdateAPI
from .status import check_system_health, is_worker_running
from .version import inventreeApiText
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class LicenseViewSerializer(serializers.Serializer):

View File

@ -1,6 +1,5 @@
"""AppConfig for InvenTree app."""
import logging
from importlib import import_module
from pathlib import Path
@ -11,6 +10,7 @@ from django.core.exceptions import AppRegistryNotReady
from django.db import transaction
from django.db.utils import IntegrityError, OperationalError
import structlog
from allauth.socialaccount.signals import social_account_updated
import InvenTree.conversion
@ -19,7 +19,7 @@ import InvenTree.tasks
from common.settings import get_global_setting, set_global_setting
from InvenTree.config import get_setting
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class InvenTreeConfig(AppConfig):

View File

@ -1,6 +1,5 @@
"""Overrides for allauth and adjacent packages to enforce InvenTree specific auth settings and restirctions."""
import logging
from urllib.parse import urlencode
from django import forms
@ -10,6 +9,7 @@ from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from allauth.account.adapter import DefaultAccountAdapter
from allauth.account.forms import LoginForm, SignupForm, set_form_field_order
from allauth.core.exceptions import ImmediateHttpResponse
@ -27,7 +27,7 @@ import InvenTree.sso
from common.settings import get_global_setting
from InvenTree.exceptions import log_error
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
# override allauth

View File

@ -1,16 +1,16 @@
"""Custom backend implementations."""
import datetime
import logging
import time
from django.db.utils import IntegrityError, OperationalError, ProgrammingError
import structlog
from maintenance_mode.backends import AbstractStateBackend
import common.models
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class InvenTreeMaintenanceModeBackend(AbstractStateBackend):

View File

@ -1,12 +1,13 @@
"""Configuration options for InvenTree external cache."""
import logging
import socket
import structlog
import InvenTree.config
import InvenTree.ready
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def cache_setting(name, default=None, **kwargs):

View File

@ -2,7 +2,6 @@
import datetime
import json
import logging
import os
import random
import shutil
@ -13,7 +12,9 @@ from pathlib import Path
from django.core.files.base import ContentFile
from django.core.files.storage import Storage
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
CONFIG_DATA = None
CONFIG_LOOKUPS = {}

View File

@ -1,6 +1,5 @@
"""Helper functions for converting between units."""
import logging
import re
from typing import Optional
@ -11,7 +10,9 @@ import pint
_unit_registry = None
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
def get_unit_registry():

View File

@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
import logging
import sys
import traceback
@ -11,11 +10,12 @@ from django.core.exceptions import ValidationError as DjangoValidationError
from django.utils.translation import gettext_lazy as _
import rest_framework.views as drfviews
import structlog
from rest_framework import serializers
from rest_framework.exceptions import ValidationError as DRFValidationError
from rest_framework.response import Response
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def log_error(path, error_name=None, error_info=None, error_data=None):

View File

@ -1,16 +1,15 @@
"""Custom exchange backend which hooks into the InvenTree plugin system to fetch exchange rates from an external API."""
import logging
from django.db.transaction import atomic
import structlog
from djmoney.contrib.exchange.backends.base import SimpleExchangeBackend
from djmoney.contrib.exchange.models import ExchangeBackend, Rate
from common.currency import currency_code_default, currency_codes
from common.settings import get_global_setting
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class InvenTreeExchange(SimpleExchangeBackend):

View File

@ -4,7 +4,6 @@ import datetime
import hashlib
import inspect
import io
import logging
import os
import os.path
import re
@ -22,6 +21,7 @@ from django.utils import timezone
from django.utils.translation import gettext_lazy as _
import bleach
import structlog
from bleach import clean
from djmoney.money import Money
from PIL import Image
@ -31,7 +31,7 @@ from common.currency import currency_code_default
from .settings import MEDIA_URL, STATIC_URL
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def extract_int(reference, clip=0x7FFFFFFF, allow_negative=False):

View File

@ -1,14 +1,14 @@
"""Code for managing email functionality in InvenTree."""
import logging
from django.conf import settings
from django.core import mail as django_mail
import structlog
import InvenTree.ready
import InvenTree.tasks
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def is_email_configured():

View File

@ -1,7 +1,6 @@
"""Provides helper functions used throughout the InvenTree project that access the database."""
import io
import logging
from decimal import Decimal
from typing import Optional
from urllib.parse import urljoin
@ -12,6 +11,7 @@ from django.db.utils import OperationalError, ProgrammingError
from django.utils.translation import gettext_lazy as _
import requests
import structlog
from djmoney.contrib.exchange.models import convert_money
from djmoney.money import Money
from PIL import Image
@ -24,7 +24,7 @@ from common.notifications import (
from common.settings import get_global_setting
from InvenTree.format import format_money
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def get_base_url(request=None):

View File

@ -1,12 +1,12 @@
"""Check if there are any pending database migrations, and run them."""
import logging
from django.core.management.base import BaseCommand
import structlog
from InvenTree.tasks import check_for_migrations
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class Command(BaseCommand):

View File

@ -1,10 +1,10 @@
"""Custom management command to cleanup old settings that are not defined anymore."""
import logging
from django.core.management.base import BaseCommand
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
class Command(BaseCommand):

View File

@ -3,13 +3,12 @@
- This is crucial after importing any fixtures, etc
"""
import logging
from django.core.management.base import BaseCommand
import structlog
from maintenance_mode.core import maintenance_mode_on, set_maintenance_mode
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class Command(BaseCommand):

View File

@ -3,18 +3,18 @@
- May be required after importing a new dataset, for example
"""
import logging
import os
from django.core.management.base import BaseCommand
from django.db.utils import OperationalError, ProgrammingError
import structlog
from PIL import UnidentifiedImageError
from company.models import Company
from part.models import Part
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class Command(BaseCommand):

View File

@ -1,12 +1,12 @@
"""Check if there are any pending database migrations, and run them."""
import logging
from django.core.management.base import BaseCommand
import structlog
from InvenTree.tasks import check_for_migrations
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class Command(BaseCommand):

View File

@ -1,10 +1,9 @@
"""Custom metadata for DRF."""
import logging
from django.core.exceptions import PermissionDenied
from django.http import Http404
import structlog
from rest_framework import exceptions, serializers
from rest_framework.fields import empty
from rest_framework.metadata import SimpleMetadata
@ -17,7 +16,7 @@ import users.models
from InvenTree.helpers import str2bool
from InvenTree.serializers import DependentField
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class InvenTreeMetadata(SimpleMetadata):
@ -389,7 +388,9 @@ class InvenTreeMetadata(SimpleMetadata):
model = field.queryset.model
else:
logger.debug(
'Could not extract model for:', field_info.get('label'), '->', field
'Could not extract model for: %s -> %s',
field_info.get('label'),
field,
)
model = None

View File

@ -1,6 +1,5 @@
"""Middleware for InvenTree."""
import logging
import sys
from django.conf import settings
@ -9,6 +8,7 @@ from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import Resolver404, include, path, resolve, reverse_lazy
import structlog
from allauth_2fa.middleware import AllauthTwoFactorMiddleware, BaseRequire2FAMiddleware
from error_report.middleware import ExceptionProcessor
@ -16,7 +16,7 @@ from common.settings import get_global_setting
from InvenTree.urls import frontendpatterns
from users.models import ApiToken
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def get_token_from_request(request):

View File

@ -1,6 +1,5 @@
"""Generic models which provide extra functionality over base Django model types."""
import logging
from datetime import datetime
from string import Formatter
@ -14,6 +13,7 @@ from django.urls import reverse
from django.urls.exceptions import NoReverseMatch
from django.utils.translation import gettext_lazy as _
import structlog
from django_q.models import Task
from error_report.models import Error
from mptt.exceptions import InvalidMove
@ -25,7 +25,7 @@ import InvenTree.format
import InvenTree.helpers
import InvenTree.helpers_model
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class DiffMixin:

View File

@ -1,19 +1,18 @@
"""Configuration for Sentry.io error reporting."""
import logging
from django.conf import settings
from django.core.exceptions import ValidationError
from django.http import Http404
import rest_framework.exceptions
import sentry_sdk
import structlog
from djmoney.contrib.exchange.exceptions import MissingRate
from sentry_sdk.integrations.django import DjangoIntegration
import InvenTree.version
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def default_sentry_dsn():

View File

@ -1,12 +1,12 @@
"""API endpoints for social authentication with allauth."""
import logging
from importlib import import_module
from django.conf import settings
from django.urls import NoReverseMatch, include, path, reverse
import allauth.socialaccount.providers.openid_connect.views as oidc_views
import structlog
from allauth.account.models import EmailAddress
from allauth.socialaccount import providers
from allauth.socialaccount.providers.oauth2.views import OAuth2Adapter, OAuth2LoginView
@ -22,7 +22,7 @@ from InvenTree.auth_overrides import registration_enabled
from InvenTree.mixins import CreateAPI, ListAPI, ListCreateAPI
from InvenTree.serializers import EmptySerializer, InvenTreeModelSerializer
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class GenericOAuth2ApiLoginView(OAuth2LoginView):

View File

@ -1,18 +1,18 @@
"""Helper functions for Single Sign On functionality."""
import json
import logging
from django.contrib.auth.models import Group
from django.db.models.signals import post_save
from django.dispatch import receiver
import structlog
from allauth.socialaccount.models import SocialAccount, SocialLogin
from common.settings import get_global_setting
from InvenTree.helpers import str2bool
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def get_provider_app(provider):

View File

@ -1,17 +1,17 @@
"""Provides system status functionality checks."""
import logging
from datetime import timedelta
from django.utils import timezone
import structlog
from django_q.models import Success
from django_q.status import Stat
import InvenTree.helpers_email
import InvenTree.ready
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def is_worker_running(**kwargs):

View File

@ -1,7 +1,6 @@
"""Functions for tasks and a few general async tasks."""
import json
import logging
import os
import random
import re
@ -21,6 +20,7 @@ from django.db.utils import NotSupportedError, OperationalError, ProgrammingErro
from django.utils import timezone
import requests
import structlog
from maintenance_mode.core import (
get_maintenance_mode,
maintenance_mode_on,
@ -33,7 +33,7 @@ from plugin import registry
from .version import isInvenTreeUpToDate
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def schedule_task(taskname, **kwargs):

View File

@ -1,6 +1,5 @@
"""This module provides template tags for extra functionality, over and above the built-in Django tags."""
import logging
from datetime import date, datetime
from django import template
@ -22,7 +21,9 @@ from plugin.plugin import InvenTreePlugin
register = template.Library()
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
@register.simple_tag()

View File

@ -1357,14 +1357,17 @@ class TestOffloadTask(InvenTreeTestCase):
# First call should run without issue
result = InvenTree.tasks.check_daily_holdoff('dummy_task')
self.assertTrue(result)
self.assertIn("Logging task attempt for 'dummy_task'", str(cm.output))
self.assertIn(
'Logging task attempt for dummy_task', str(cm.output).replace("\\'", '')
)
with self.assertLogs(logger='inventree', level='INFO') as cm:
# An attempt has been logged, but it is too recent
result = InvenTree.tasks.check_daily_holdoff('dummy_task')
self.assertFalse(result)
self.assertIn(
"Last attempt for 'dummy_task' was too recent", str(cm.output)
'Last attempt for dummy_task was too recent',
str(cm.output).replace("\\'", ''),
)
# Mark last attempt a few days ago - should now return True
@ -1385,7 +1388,8 @@ class TestOffloadTask(InvenTreeTestCase):
result = InvenTree.tasks.check_daily_holdoff('dummy_task')
self.assertFalse(result)
self.assertIn(
"Last attempt for 'dummy_task' was too recent", str(cm.output)
'Last attempt for dummy_task was too recent',
str(cm.output).replace("\\'", ''),
)
# Configure so a task was successful too recently

View File

@ -3,7 +3,6 @@
Provides information on the current InvenTree version
"""
import logging
import os
import pathlib
import platform
@ -21,7 +20,9 @@ from .api_version import INVENTREE_API_TEXT, INVENTREE_API_VERSION
INVENTREE_SW_VERSION = '0.18.0 dev'
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
# Discover git

View File

@ -1,7 +1,6 @@
"""Build database model definitions."""
import decimal
import logging
from datetime import datetime
from django.contrib.auth.models import User
@ -15,6 +14,7 @@ from django.dispatch.dispatcher import receiver
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from mptt.exceptions import InvalidMove
from mptt.models import MPTTModel, TreeForeignKey
from rest_framework import serializers
@ -47,7 +47,7 @@ from generic.states import StateTransitionMixin, StatusCodeMixin
from plugin.events import trigger_event
from stock.status_codes import StockHistoryCode, StockStatus
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class Build(

View File

@ -1,6 +1,5 @@
"""Background task definitions for the BuildOrder app."""
import logging
import random
import time
from datetime import timedelta
@ -11,6 +10,7 @@ from django.db import transaction
from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _
import structlog
from allauth.account.models import EmailAddress
import build.models as build_models
@ -25,7 +25,7 @@ from build.status_codes import BuildStatusGroups
from InvenTree.ready import isImportingData
from plugin.events import trigger_event
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def auto_allocate_build(build_id: int, **kwargs):

View File

@ -1,6 +1,5 @@
"""Unit tests for the 'build' models."""
import logging
import uuid
from datetime import datetime, timedelta
@ -11,6 +10,8 @@ from django.db.models import Sum
from django.test import TestCase
from django.test.utils import override_settings
import structlog
import build.tasks
import common.models
from build.models import Build, BuildItem, BuildLine, generate_next_build_reference
@ -22,7 +23,7 @@ from part.models import BomItem, BomItemSubstitute, Part, PartTestTemplate
from stock.models import StockItem, StockItemTestResult
from users.models import Owner
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class BuildTestBase(TestCase):

View File

@ -1,13 +1,13 @@
"""App config for common app."""
import logging
from django.apps import AppConfig
import structlog
import InvenTree.ready
from common.settings import get_global_setting, set_global_setting
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class CommonConfig(AppConfig):

View File

@ -1,7 +1,6 @@
"""Helper functions for currency support."""
import decimal
import logging
import math
from typing import Optional
@ -9,11 +8,12 @@ from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
import structlog
from moneyed import CURRENCIES
import InvenTree.helpers
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def currency_code_default():

View File

@ -1,7 +1,6 @@
"""Icon utilities for InvenTree."""
import json
import logging
from dataclasses import dataclass
from pathlib import Path
from typing import TypedDict
@ -9,7 +8,9 @@ from typing import TypedDict
from django.core.exceptions import ValidationError
from django.templatetags.static import static
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
_icon_packs = None

View File

@ -7,7 +7,6 @@ import base64
import hashlib
import hmac
import json
import logging
import os
import uuid
from datetime import timedelta, timezone
@ -34,6 +33,7 @@ from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
import structlog
from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import convert_money
from rest_framework.exceptions import PermissionDenied
@ -54,7 +54,7 @@ from generic.states import ColorEnum
from generic.states.custom import state_color_mappings
from InvenTree.sanitizer import sanitize_svg
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class MetaMixin(models.Model):

View File

@ -1,6 +1,5 @@
"""Base classes and functions for notifications."""
import logging
from dataclasses import dataclass
from datetime import timedelta
from typing import Optional
@ -9,6 +8,8 @@ from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.utils.translation import gettext_lazy as _
import structlog
import common.models
import InvenTree.helpers
from InvenTree.ready import isImportingData, isRebuildingData
@ -16,7 +17,7 @@ from plugin import registry
from plugin.models import NotificationUserSetting, PluginConfig
from users.models import Owner
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
# region methods

View File

@ -1,6 +1,5 @@
"""Tasks (processes that get offloaded) for common app."""
import logging
import os
from datetime import timedelta
@ -11,13 +10,14 @@ from django.utils import timezone
import feedparser
import requests
import structlog
import InvenTree.helpers
from InvenTree.helpers_model import getModelsWithMixin
from InvenTree.models import InvenTreeNotesMixin
from InvenTree.tasks import ScheduledTask, scheduled_task
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
@scheduled_task(ScheduledTask.DAILY)

View File

@ -1,7 +1,6 @@
"""Model definitions for the 'importer' app."""
import json
import logging
from typing import Optional
from django.contrib.auth.models import User
@ -11,6 +10,7 @@ from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from rest_framework.exceptions import ValidationError as DRFValidationError
import importer.operations
@ -20,7 +20,7 @@ import importer.validators
import InvenTree.helpers
from importer.status_codes import DataImportStatusCode
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class DataImportSession(models.Model):

View File

@ -1,12 +1,11 @@
"""Registry for supported serializers for data import operations."""
import logging
import structlog
from rest_framework.serializers import Serializer
from importer.mixins import DataImportSerializerMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class DataImportSerializerRegister:

View File

@ -1,12 +1,13 @@
"""Task definitions for the 'importer' app."""
import logging
from datetime import timedelta
import structlog
import InvenTree.helpers
import InvenTree.tasks
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def import_data(session_id: int):

View File

@ -1,10 +1,10 @@
"""Django machine app config."""
import logging
from django.apps import AppConfig
from django.db.utils import OperationalError, ProgrammingError
import structlog
from InvenTree.ready import (
canAppAccessDatabase,
isImportingData,
@ -13,7 +13,7 @@ from InvenTree.ready import (
isRunningMigrations,
)
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class MachineConfig(AppConfig):

View File

@ -1,15 +1,16 @@
"""Machine registry."""
import logging
from typing import Union, cast
from uuid import UUID
from django.core.cache import cache
import structlog
from InvenTree.helpers_mixin import get_shared_class_instance_state_mixin
from machine.machine_type import BaseDriver, BaseMachineType
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class MachineRegistry(

View File

@ -1,6 +1,5 @@
"""Order model definitions."""
import logging
from datetime import datetime
from decimal import Decimal
@ -15,6 +14,7 @@ from django.dispatch.dispatcher import receiver
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import convert_money
from djmoney.money import Money
@ -58,7 +58,7 @@ from part import models as PartModels
from plugin.events import trigger_event
from stock.status_codes import StockHistoryCode, StockStatus
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class TotalPriceMixin(models.Model):

View File

@ -1,12 +1,13 @@
"""Background tasks for the 'order' app."""
import logging
from datetime import datetime, timedelta
from django.contrib.auth.models import User
from django.db import transaction
from django.utils.translation import gettext_lazy as _
import structlog
import common.notifications
import InvenTree.helpers_model
import order.models
@ -15,7 +16,7 @@ from order.events import PurchaseOrderEvents, SalesOrderEvents
from order.status_codes import PurchaseOrderStatusGroups, SalesOrderStatusGroups
from plugin.events import trigger_event
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def notify_overdue_purchase_order(po: order.models.PurchaseOrder):

View File

@ -1,13 +1,13 @@
"""part app specification."""
import logging
from django.apps import AppConfig
from django.db.utils import OperationalError, ProgrammingError
import structlog
import InvenTree.ready
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class PartConfig(AppConfig):

View File

@ -1,15 +1,15 @@
"""Various helper functions for the part app."""
import logging
import os
from django.conf import settings
import structlog
from jinja2 import Environment, select_autoescape
from common.settings import get_global_setting
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
# Compiled template for rendering the 'full_name' attribute of a Part

View File

@ -5,7 +5,6 @@ from __future__ import annotations
import decimal
import hashlib
import inspect
import logging
import math
import os
import re
@ -25,6 +24,7 @@ from django.dispatch import receiver
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from django_cleanup import cleanup
from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import convert_money
@ -67,7 +67,7 @@ from order.status_codes import (
)
from stock import models as StockModels
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class PartCategory(InvenTree.models.InvenTreeTree):

View File

@ -2,7 +2,6 @@
import imghdr
import io
import logging
import os
from decimal import Decimal
@ -15,6 +14,7 @@ from django.db.models.functions import Coalesce
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
import structlog
from djmoney.contrib.exchange.exceptions import MissingRate
from djmoney.contrib.exchange.models import convert_money
from rest_framework import serializers
@ -56,7 +56,7 @@ from .models import (
PartTestTemplate,
)
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
@register_importer()

View File

@ -1,13 +1,13 @@
"""Stocktake report functionality."""
import io
import logging
import time
from django.contrib.auth.models import User
from django.core.files.base import ContentFile
from django.utils.translation import gettext_lazy as _
import structlog
import tablib
from djmoney.contrib.exchange.models import convert_money
from djmoney.money import Money
@ -18,7 +18,7 @@ import InvenTree.helpers
import part.models
import stock.models
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def perform_stocktake(

View File

@ -1,6 +1,5 @@
"""Background task definitions for the 'part' app."""
import logging
import random
import time
from datetime import datetime, timedelta
@ -8,6 +7,8 @@ from datetime import datetime, timedelta
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
import structlog
import common.currency
import common.notifications
import company.models
@ -24,7 +25,7 @@ from InvenTree.tasks import (
scheduled_task,
)
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def notify_low_stock(part: part_models.Part):

View File

@ -4,16 +4,15 @@ This initializes the plugin mechanisms and handles reloading throughout the life
The main code for plugin special sauce is in the plugin registry in `InvenTree/plugin/registry.py`.
"""
import logging
from django.apps import AppConfig
import structlog
from maintenance_mode.core import set_maintenance_mode
from InvenTree.ready import canAppAccessDatabase, isInMainThread, isInWorkerThread
from plugin import registry
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class PluginAppConfig(AppConfig):

View File

@ -1,11 +1,10 @@
"""API endpoints for barcode plugins."""
import logging
from django.db.models import F
from django.urls import include, path
from django.utils.translation import gettext_lazy as _
import structlog
from django_filters import rest_framework as rest_filters
from drf_spectacular.utils import extend_schema, extend_schema_view
from rest_framework import permissions, status
@ -29,7 +28,7 @@ from users.models import RuleSet
from . import serializers as barcode_serializers
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class BarcodeView(CreateAPIView):

View File

@ -1,12 +1,13 @@
"""Helper functions for barcode generation."""
import logging
from typing import Type, cast
import structlog
import InvenTree.helpers_model
from InvenTree.models import InvenTreeBarcodeMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def cache(func):

View File

@ -2,12 +2,12 @@
from __future__ import annotations
import logging
from django.core.exceptions import ValidationError
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
import structlog
from company.models import Company, ManufacturerPart, SupplierPart
from InvenTree.exceptions import log_error
from InvenTree.models import InvenTreeBarcodeMixin
@ -15,7 +15,7 @@ from order.models import PurchaseOrder
from part.models import Part
from plugin.base.integration.SettingsMixin import SettingsMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class BarcodeMixin:

View File

@ -1,19 +1,19 @@
"""Functions for triggering and responding to server side events."""
import logging
from django.conf import settings
from django.db import transaction
from django.db.models.signals import post_delete, post_save
from django.dispatch.dispatcher import receiver
import structlog
import InvenTree.exceptions
from common.settings import get_global_setting
from InvenTree.ready import canAppAccessDatabase, isImportingData
from InvenTree.tasks import offload_task
from plugin.registry import registry
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def trigger_event(event: str, *args, **kwargs) -> None:

View File

@ -1,11 +1,11 @@
"""Plugin mixin classes for icon pack plugin."""
import logging
import structlog
from common.icons import IconPack, reload_icon_packs
from plugin.helpers import MixinNotImplementedError
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class IconPackMixin:

View File

@ -1,15 +1,15 @@
"""Mixin class for making calls to an external API."""
import json as json_pkg
import logging
from collections.abc import Iterable
from typing import Optional
import requests
import structlog
from plugin.helpers import MixinNotImplementedError
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class APICallMixin:

View File

@ -1,6 +1,5 @@
"""Plugin mixin class for AppMixin."""
import logging
from importlib import reload
from pathlib import Path
from typing import Optional
@ -9,9 +8,11 @@ from django.apps import apps
from django.conf import settings
from django.contrib import admin
import structlog
from InvenTree.config import get_plugin_dir
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class AppMixin:

View File

@ -3,12 +3,12 @@
Allows integration of custom 'panels' into the user interface.
"""
import logging
import structlog
from InvenTree.helpers import generateTestKey
from plugin.helpers import MixinNotImplementedError, render_template, render_text
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class PanelMixin:

View File

@ -1,14 +1,14 @@
"""Plugin mixin class for ScheduleMixin."""
import logging
from django.conf import settings
from django.db.utils import OperationalError, ProgrammingError
import structlog
from common.settings import get_global_setting
from plugin.helpers import MixinImplementationError
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class ScheduleMixin:

View File

@ -1,11 +1,12 @@
"""Plugin mixin class for SettingsMixin."""
import logging
from typing import TYPE_CHECKING
from django.db.utils import OperationalError, ProgrammingError
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
# import only for typechecking, otherwise this throws a model is unready error
if TYPE_CHECKING:

View File

@ -1,14 +1,14 @@
"""Plugin mixin class for UrlsMixin."""
import logging
from django.conf import settings
from django.urls import include, re_path
import structlog
from common.settings import get_global_setting
from plugin.urls import PLUGIN_BASE
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class UrlsMixin:

View File

@ -1,10 +1,10 @@
"""Plugin mixin classes."""
import logging
import structlog
from plugin.helpers import MixinNotImplementedError
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class NavigationMixin:

View File

@ -1,15 +1,15 @@
"""Functions to print a label to a mixin printer."""
import logging
from django.conf import settings
from django.utils.translation import gettext_lazy as _
import structlog
import common.notifications
from InvenTree.exceptions import log_error
from plugin.registry import registry
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def print_label(plugin_slug: str, **kwargs):

View File

@ -1,10 +1,10 @@
"""Plugin mixin for locating stock items and locations."""
import logging
import structlog
from plugin.helpers import MixinNotImplementedError
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class LocateMixin:

View File

@ -3,12 +3,12 @@
Allows integration of custom UI elements into the React user interface.
"""
import logging
from typing import Literal, TypedDict
import structlog
from rest_framework.request import Request
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
# List of supported feature types

View File

@ -1,13 +1,13 @@
"""Builtin plugin for requesting exchange rates from an external API."""
import logging
from django.utils.translation import gettext_lazy as _
import structlog
from plugin import InvenTreePlugin
from plugin.mixins import APICallMixin, CurrencyExchangeMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class InvenTreeCurrencyExchange(APICallMixin, CurrencyExchangeMixin, InvenTreePlugin):

View File

@ -1,12 +1,12 @@
"""Label printing plugin which supports printing multiple labels on a single page."""
import logging
import math
from django.core.exceptions import ValidationError
from django.core.files.base import ContentFile
from django.utils.translation import gettext_lazy as _
import structlog
import weasyprint
from rest_framework import serializers
@ -16,7 +16,7 @@ from plugin import InvenTreePlugin
from plugin.mixins import LabelPrintingMixin, SettingsMixin
from report.models import LabelOutput, LabelTemplate
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class LabelPrintingOptionsSerializer(serializers.Serializer):

View File

@ -1,7 +1,6 @@
"""Helpers for plugin app."""
import inspect
import logging
import os
import pathlib
import pkgutil
@ -16,7 +15,9 @@ from django.conf import settings
from django.core.exceptions import AppRegistryNotReady
from django.db.utils import IntegrityError
logger = logging.getLogger('inventree')
import structlog
logger = structlog.get_logger('inventree')
# region logging / errors

View File

@ -1,6 +1,5 @@
"""Install a plugin into the python virtual environment."""
import logging
import re
import subprocess
import sys
@ -9,11 +8,13 @@ from django.conf import settings
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
import structlog
import plugin.models
import plugin.staticfiles
from InvenTree.exceptions import log_error
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def pip_command(*args):

View File

@ -1,7 +1,6 @@
"""Base Class for InvenTree plugins."""
import inspect
import logging
import warnings
from datetime import datetime
from distutils.sysconfig import get_python_lib
@ -13,10 +12,12 @@ from django.conf import settings
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
import structlog
import InvenTree.helpers
from plugin.helpers import get_git_log
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class MetaBase:

View File

@ -7,7 +7,6 @@
import importlib
import importlib.machinery
import importlib.util
import logging
import os
import sys
import time
@ -25,6 +24,8 @@ from django.urls import clear_url_caches, path
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
import structlog
from common.settings import get_global_setting, set_global_setting
from InvenTree.config import get_plugin_dir
from InvenTree.ready import canAppAccessDatabase
@ -38,7 +39,7 @@ from .helpers import (
)
from .plugin import InvenTreePlugin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class PluginsRegistry:

View File

@ -1,13 +1,13 @@
"""Sample plugin which responds to events."""
import logging
from django.conf import settings
import structlog
from plugin import InvenTreePlugin
from plugin.mixins import EventMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class EventPluginSample(EventMixin, InvenTreePlugin):

View File

@ -1,13 +1,13 @@
"""Sample plugin which responds to events."""
import logging
from django.conf import settings
import structlog
from plugin import InvenTreePlugin
from plugin.mixins import EventMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class FilteredEventPluginSample(EventMixin, InvenTreePlugin):

View File

@ -9,8 +9,6 @@ from plugin.base.event.events import trigger_event
from plugin.helpers import MixinNotImplementedError
from plugin.mixins import EventMixin
from .event_sample import logger
class EventPluginSampleTests(TestCase):
"""Tests for EventPluginSample."""
@ -27,11 +25,9 @@ class EventPluginSampleTests(TestCase):
# Enable event testing
settings.PLUGIN_TESTING_EVENTS = True
# Check that an event is issued
with self.assertLogs(logger=logger, level='DEBUG') as cm:
with self.assertLogs(logger='inventree', level='DEBUG') as cm:
trigger_event('test.event')
self.assertIn(
'DEBUG:inventree:Event `test.event` triggered in sample plugin', cm[1]
)
self.assertIn('Event `test.event` triggered in sample plugin', str(cm[1]))
# Disable again
settings.PLUGIN_TESTING_EVENTS = False

View File

@ -7,8 +7,6 @@ from common.models import InvenTreeSetting
from plugin import registry
from plugin.base.event.events import trigger_event
from .filtered_event_sample import logger
class FilteredEventPluginSampleTests(TestCase):
"""Tests for EventPluginSample."""
@ -25,11 +23,9 @@ class FilteredEventPluginSampleTests(TestCase):
# Enable event testing
settings.PLUGIN_TESTING_EVENTS = True
# Check that an event is issued
with self.assertLogs(logger=logger, level='DEBUG') as cm:
with self.assertLogs(logger='inventree', level='DEBUG') as cm:
trigger_event('test.event')
self.assertIn(
'DEBUG:inventree:Event `test.event` triggered in sample plugin', cm[1]
)
self.assertIn('Event `test.event` triggered in sample plugin', str(cm[1]))
# Disable again
settings.PLUGIN_TESTING_EVENTS = False
@ -46,7 +42,7 @@ class FilteredEventPluginSampleTests(TestCase):
# Enable event testing
settings.PLUGIN_TESTING_EVENTS = True
# Check that an event is issued
with self.assertLogs(logger=logger, level='DEBUG') as cm:
with self.assertLogs(logger='inventree', level='DEBUG') as cm:
trigger_event('test.some.other.event')
self.assertNotIn(
'DEBUG:inventree:Event `test.some.other.event` triggered in sample plugin',

View File

@ -3,12 +3,12 @@
Note: This plugin does not *actually* locate anything!
"""
import logging
import structlog
from plugin import InvenTreePlugin
from plugin.mixins import LocateMixin
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class SampleLocatePlugin(LocateMixin, InvenTreePlugin):

View File

@ -1,12 +1,12 @@
"""Static files management for InvenTree plugins."""
import logging
from django.contrib.staticfiles.storage import staticfiles_storage
import structlog
from plugin.registry import registry
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def clear_static_dir(path, recursive=True):

View File

@ -2,7 +2,6 @@
from __future__ import annotations
import logging
import os
from datetime import timedelta
from decimal import Decimal, InvalidOperation
@ -20,6 +19,7 @@ from django.dispatch import receiver
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from djmoney.contrib.exchange.models import convert_money
from mptt.managers import TreeManager
from mptt.models import MPTTModel, TreeForeignKey
@ -52,7 +52,7 @@ from stock.events import StockEvents
from stock.generators import generate_batch_code
from users.models import Owner
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class StockLocationType(InvenTree.models.MetadataMixin, models.Model):

View File

@ -1,6 +1,5 @@
"""JSON serializers for Stock app."""
import logging
from datetime import timedelta
from decimal import Decimal
@ -10,6 +9,7 @@ from django.db.models import BooleanField, Case, Count, Prefetch, Q, Value, When
from django.db.models.functions import Coalesce
from django.utils.translation import gettext_lazy as _
import structlog
from rest_framework import serializers
from rest_framework.serializers import ValidationError
from sql_util.utils import SubqueryCount, SubquerySum
@ -40,7 +40,7 @@ from .models import (
StockLocationType,
)
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class GenerateBatchCodeSerializer(serializers.Serializer):

View File

@ -1,8 +1,8 @@
"""Background tasks for the stock app."""
import logging
import structlog
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
def rebuild_stock_item_tree(tree_id=None):

View File

@ -1,13 +1,13 @@
"""App configuration class for the 'users' app."""
import logging
from django.apps import AppConfig
from django.db.utils import OperationalError, ProgrammingError
import structlog
import InvenTree.ready
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
class UsersConfig(AppConfig):

View File

@ -1,7 +1,6 @@
"""Database model definitions for the 'users' app."""
import datetime
import logging
from django.conf import settings
from django.contrib import admin
@ -19,6 +18,7 @@ from django.dispatch import receiver
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
import structlog
from rest_framework.authtoken.models import Token as AuthToken
import InvenTree.helpers
@ -26,7 +26,7 @@ import InvenTree.models
from common.settings import get_global_setting
from InvenTree.ready import canAppAccessDatabase, isImportingData
logger = logging.getLogger('inventree')
logger = structlog.get_logger('inventree')
# OVERRIDE START

View File

@ -1,7 +1,6 @@
"""Template tag to render SPA imports."""
import json
from logging import getLogger
from pathlib import Path
from typing import Union
@ -9,7 +8,9 @@ from django import template
from django.conf import settings
from django.utils.safestring import mark_safe
logger = getLogger('InvenTree')
import structlog
logger = structlog.get_logger('inventree')
register = template.Library()
FRONTEND_SETTINGS = json.dumps(settings.FRONTEND_SETTINGS)