mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-12 01:55:39 +00:00
[PUI] Add licenses texts to PUI (#6855)
* compile a license texts bundle * add backend license extraction on install * change path for licenses * add to gitignore * Add api to expose license paths * add texts * add frontend rendering of licensing files * Handle errors when fetching license information * Format backend packages.txt in json * Improved API rendering: - Handle file errors - Render as JSON object * Improve frontend modal rendering - Separate frontend / backend into tabs - Split packages into accordion * Generate JSON file for fronten deps * Fix rendering for frontend deps * Update src/frontend/src/components/modals/LicenseModal.tsx Co-authored-by: Lukas <76838159+wolflu05@users.noreply.github.com> * Update src/frontend/src/components/modals/LicenseModal.tsx Co-authored-by: Lukas <76838159+wolflu05@users.noreply.github.com> * make reading of licenses objects dynamic * remove unsued import * style fixes * style fixes * default to first value * use new syntax to call docker compose * merge fix * fix path * Roll back #6942 * Update qc_checks.yaml Run migration checks when requirements file changes --------- Co-authored-by: Oliver Walters <oliver.henry.walters@gmail.com> Co-authored-by: Lukas <76838159+wolflu05@users.noreply.github.com>
This commit is contained in:
@ -1,6 +1,9 @@
|
||||
"""Main JSON interface views."""
|
||||
|
||||
import json
|
||||
import logging
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import transaction
|
||||
@ -31,6 +34,60 @@ from .status import check_system_health, is_worker_running
|
||||
from .version import inventreeApiText
|
||||
from .views import AjaxView
|
||||
|
||||
logger = logging.getLogger('inventree')
|
||||
|
||||
|
||||
class LicenseViewSerializer(serializers.Serializer):
|
||||
"""Serializer for license information."""
|
||||
|
||||
backend = serializers.CharField(help_text='Backend licenses texts', read_only=True)
|
||||
frontend = serializers.CharField(
|
||||
help_text='Frontend licenses texts', read_only=True
|
||||
)
|
||||
|
||||
|
||||
class LicenseView(APIView):
|
||||
"""Simple JSON endpoint for InvenTree license information."""
|
||||
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
|
||||
def read_license_file(self, path: Path) -> list:
|
||||
"""Extract license information from the provided file.
|
||||
|
||||
Arguments:
|
||||
path: Path to the license file
|
||||
|
||||
Returns: A list of items containing the license information
|
||||
"""
|
||||
# Check if the file exists
|
||||
if not path.exists():
|
||||
logger.error("License file not found at '%s'", path)
|
||||
return []
|
||||
|
||||
try:
|
||||
data = json.loads(path.read_text())
|
||||
except json.JSONDecodeError as e:
|
||||
logger.exception("Failed to parse license file '%s': %s", path, e)
|
||||
return []
|
||||
except Exception as e:
|
||||
logger.exception("Exception while reading license file '%s': %s", path, e)
|
||||
return []
|
||||
|
||||
# Ensure consistent string between backend and frontend licenses
|
||||
return [{key.lower(): value for key, value in entry.items()} for entry in data]
|
||||
|
||||
@extend_schema(responses={200: OpenApiResponse(response=LicenseViewSerializer)})
|
||||
def get(self, request, *args, **kwargs):
|
||||
"""Return information about the InvenTree server."""
|
||||
backend = Path(__file__).parent.joinpath('licenses.txt')
|
||||
frontend = Path(__file__).parent.parent.joinpath(
|
||||
'web/static/web/.vite/dependencies.json'
|
||||
)
|
||||
return JsonResponse({
|
||||
'backend': self.read_license_file(backend),
|
||||
'frontend': self.read_license_file(frontend),
|
||||
})
|
||||
|
||||
|
||||
class VersionViewSerializer(serializers.Serializer):
|
||||
"""Serializer for a single version."""
|
||||
|
@ -1,11 +1,14 @@
|
||||
"""InvenTree API version information."""
|
||||
|
||||
# InvenTree API version
|
||||
INVENTREE_API_VERSION = 185
|
||||
INVENTREE_API_VERSION = 186
|
||||
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
|
||||
|
||||
INVENTREE_API_TEXT = """
|
||||
|
||||
v186 - 2024-03-26 : https://github.com/inventree/InvenTree/pull/6855
|
||||
- Adds license information to the API
|
||||
|
||||
v185 - 2024-03-24 : https://github.com/inventree/InvenTree/pull/6836
|
||||
- Remove /plugin/activate endpoint
|
||||
- Update docstrings and typing for various API endpoints (no functional changes)
|
||||
|
@ -39,7 +39,14 @@ from stock.urls import stock_urls
|
||||
from web.urls import api_urls as web_api_urls
|
||||
from web.urls import urlpatterns as platform_urls
|
||||
|
||||
from .api import APISearchView, InfoView, NotFoundView, VersionTextView, VersionView
|
||||
from .api import (
|
||||
APISearchView,
|
||||
InfoView,
|
||||
LicenseView,
|
||||
NotFoundView,
|
||||
VersionTextView,
|
||||
VersionView,
|
||||
)
|
||||
from .magic_login import GetSimpleLoginView
|
||||
from .social_auth_urls import (
|
||||
EmailListView,
|
||||
@ -99,6 +106,7 @@ apipatterns = [
|
||||
name='schema',
|
||||
),
|
||||
# InvenTree information endpoints
|
||||
path('license/', LicenseView.as_view(), name='api-license'), # license info
|
||||
path(
|
||||
'version-text', VersionTextView.as_view(), name='api-version-text'
|
||||
), # version text
|
||||
|
@ -18,7 +18,7 @@ django-maintenance-mode # Shut down application while reloading
|
||||
django-markdownify # Markdown rendering
|
||||
django-mptt # Modified Preorder Tree Traversal
|
||||
django-markdownify # Markdown rendering
|
||||
django-money>=3.0.0,<3.5.0 # Django app for currency management # FIXED 2023-10-31 3.3.0 breaks due to https://github.com/django-money/django-money/issues/731
|
||||
django-money>=3.0.0,<3.3.0 # Django app for currency management # FIXED 2023-10-31 3.3.0 breaks due to https://github.com/django-money/django-money/issues/731
|
||||
django-mptt # Modified Preorder Tree Traversal
|
||||
django-redis>=5.0.0 # Redis integration
|
||||
django-q2 # Background task scheduling
|
||||
@ -41,6 +41,7 @@ gunicorn # Gunicorn web server
|
||||
pdf2image # PDF to image conversion
|
||||
pillow # Image manipulation
|
||||
pint==0.21 # Unit conversion # FIXED 2023-05-30 breaks tests https://github.com/matmair/InvenTree/actions/runs/5095665936/jobs/9160852560
|
||||
pip-licenses # License information for installed packages
|
||||
python-barcode[images] # Barcode generator
|
||||
python-dotenv # Environment variable management
|
||||
pyyaml>=6.0.1 # YAML parsing
|
||||
|
@ -96,7 +96,7 @@ django-js-asset==2.2.0
|
||||
# via django-mptt
|
||||
django-maintenance-mode==0.21.1
|
||||
django-markdownify==0.9.3
|
||||
django-money==3.4.1
|
||||
django-money==3.2.0
|
||||
django-mptt==0.16.0
|
||||
django-otp==1.3.0
|
||||
# via django-allauth-2fa
|
||||
@ -230,6 +230,9 @@ pillow==10.2.0
|
||||
# qrcode
|
||||
# weasyprint
|
||||
pint==0.21
|
||||
pip-licenses==4.3.4
|
||||
prettytable==3.10.0
|
||||
# via pip-licenses
|
||||
protobuf==4.25.3
|
||||
# via
|
||||
# googleapis-common-protos
|
||||
@ -329,6 +332,8 @@ urllib3==2.2.1
|
||||
# dulwich
|
||||
# requests
|
||||
# sentry-sdk
|
||||
wcwidth==0.2.13
|
||||
# via prettytable
|
||||
weasyprint==61.2
|
||||
# via django-weasyprint
|
||||
webencodings==0.5.1
|
||||
|
Reference in New Issue
Block a user