mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 03:26:45 +00:00
* update deps * remove @mantine/rte * add icons again * Create dependency-review.yml * Create scan.yml * Create sonar-project.properties * add option to use sections and refactro * translate error messages * remove unneeded vars * move function code * move data inside * add global section * add plugin section * use translated section titles * add translation strings * rename scan action * add user settings * use ordered data * fix settings url * use debounced value for strings (not choices!) * rename contex to context * move i18n provider up * move theme options into seperate context/ component * renmae statrtup vars * move translations out * reactivate sentry * move i18n provider to seperate context * move langauge state completly out of App * use theme out * move theme context * move LanguageContext * move function into state * make sentry optional for now * add key to accordion * init langauge context on top * remove unneeded css files * move errorpage to tsx * add translation for error page * Add error to title * add typecast for error * move type definition out * remove todo -> type was already added * upgrade deps * add bootstrap * remove @mantine/core * readd core * switch to bootstrap * simplify import * Add SPA views for react #2789 * split up frontend urls * Add settings for frontend url loading * add new UI scaffold * remove tracking insert * add platform app * ensure static indexes work too * add lingui * add lingui config * add mgmt tasks * add base locales * settings for frontend dev * fix typo * update deps * add pre-commit * add eslint * add testing scaffold * fix paths * remove error - tests trip correctly * merge workflow * cleanup samples * use name inline with other tests * Add real worl frontend tests * setup env * tun migrations first * optimize setup time * setup demo dataset * optimize run setup * add test for class ui * rename * fix typo * and another typo * do install * run migrations first * fix name * cleanup * use other credentials * use other credentials * fix qc * move envs to qc * remove create_site * reduce testing env * fix test * fix test call * allaccess user * add ui plattform check * add better check * remove unneeded env * enable debug * reduce wait time * also build frontend on static * add sekeleton * fix various issues * add locales * clean output before building * cleanup dir * remove bootstrap * clean up deps * fix settings panel * remove assets * move logo * split out router * split up chunks * fix zustand import syntax * bundl * update pre-render * use vendor splitting * maximes space usage * enlarge breakpoints * remove wired color changes * cleanup tabs * fix error * update auth functions * default to mail login * add placeholder marking * Add text to placeholder * readd codespell * add another test * add sort plugin * add sort plugin * sort imports * fix order * Add mega menu * run pre-commit fixes * add node min version * Docker container (#129) * Fix allocation check for completing build order (#5199) - Allocation check only applies to untracked line items * docker dev Install required node packages to docker development image * add import order settings * cleanup settings * cleanup dashboard * clanup part tab * refactor header to only use 1 line * cleanup reqs for py3.9 * remove compiled UI * revert reqs change * cleanup tasks * cleanout built ui * remove default user * cleanup package.json * fix doctip * remove sentry * optimize loading * reset versions * clean * factor out menu items * refactor Navtabs * refactor HoverMenu * remove part * remove prettier * remove default arg from build * remove eslint * Merge branch 'plattform' of https://github.com/matmair/InvenTree into platform-ui_base * optimize svg * add build step for plattform UI * fix install command * fix test * remove extra test * set default host if none is set * set nicer names * fix tests * fix logged-in test * update translations * ensure more path matches * make loading of serverrefs dynamic * use default radius * fix issues / code smells * clean code smell * fix password reset * fix error messages * detect small screens * use loader meachanism for views * refactor structure * move auth functions out * use text * refactor defaults * Add email login FR] Add email link based logins Closes #3531 * fix name error * fix reqs * fix backend for magic login * fix frontend * remove unused route * remove now unneeded test section * cleanup code * add navigation header * fix logo component for nesting * factor out menu * refactor style * clean code * Translate items and use unique ids * use alpine commands * increase margins to remove drawer scroller * only render plugins if they are defined * remove sample content * fix assertation * open on hover * refactor * merge fix * cleanup navigation drawer * change dependencies for UI testing * add highlight filter * Add correct menu items * move design component out * move pre-commit out * move deps again * move js styles in * revert CI changes * remove unneeded exclution * changed placeholder user * refactored EditButton to component * refactored app loading to useEffect * moved color lookup into global scope * reafactored UserPanel render block * marked placeholder pages in doc links * made doc tooltip optional for MenuLink * changed MenuLinkItem names * fixes missing Link item in MenuLink * fixed merge error --------- Co-authored-by: Oliver <oliver.henry.walters@gmail.com>
251 lines
12 KiB
Python
251 lines
12 KiB
Python
"""Top-level URL lookup for InvenTree application.
|
|
|
|
Passes URL lookup downstream to each app as required.
|
|
"""
|
|
|
|
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.decorators.csrf import csrf_exempt
|
|
from django.views.generic.base import RedirectView
|
|
|
|
from dj_rest_auth.registration.views import (SocialAccountDisconnectView,
|
|
SocialAccountListView)
|
|
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView
|
|
from sesame.views import LoginView
|
|
|
|
from build.api import build_api_urls
|
|
from build.urls import build_urls
|
|
from common.api import admin_api_urls, 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 web.urls import spa_view
|
|
from web.urls import urlpatterns as platform_urls
|
|
|
|
from .api import APISearchView, InfoView, NotFoundView
|
|
from .magic_login import GetSimpleLoginView
|
|
from .social_auth_urls import SocialProvierListView, social_auth_urlpatterns
|
|
from .views import (AboutView, AppearanceSelectView, CustomConnectionsView,
|
|
CustomEmailView, CustomLoginView,
|
|
CustomPasswordResetFromKeyView,
|
|
CustomSessionDeleteOtherView, CustomSessionDeleteView,
|
|
DatabaseStatsView, DynamicJsView, EditUserView, IndexView,
|
|
NotificationsView, SearchView, SetPasswordView,
|
|
SettingsView, auth_request)
|
|
|
|
admin.site.site_header = "InvenTree Admin"
|
|
|
|
|
|
apipatterns = [
|
|
|
|
# Global search
|
|
path('search/', APISearchView.as_view(), name='api-search'),
|
|
|
|
re_path(r'^settings/', include(settings_api_urls)),
|
|
re_path(r'^part/', include(part_api_urls)),
|
|
re_path(r'^bom/', include(bom_api_urls)),
|
|
re_path(r'^company/', include(company_api_urls)),
|
|
re_path(r'^stock/', include(stock_api_urls)),
|
|
re_path(r'^build/', include(build_api_urls)),
|
|
re_path(r'^order/', include(order_api_urls)),
|
|
re_path(r'^label/', include(label_api_urls)),
|
|
re_path(r'^report/', include(report_api_urls)),
|
|
re_path(r'^user/', include(user_urls)),
|
|
re_path(r'^admin/', include(admin_api_urls)),
|
|
|
|
# Plugin endpoints
|
|
path('', include(plugin_api_urls)),
|
|
|
|
# Common endpoints endpoint
|
|
path('', include(common_api_urls)),
|
|
|
|
# OpenAPI Schema
|
|
re_path('schema/', SpectacularAPIView.as_view(custom_settings={'SCHEMA_PATH_PREFIX': '/api/'}), name='schema'),
|
|
|
|
# InvenTree information endpoint
|
|
path('', InfoView.as_view(), name='api-inventree-info'),
|
|
|
|
# Third party API endpoints
|
|
path('auth/', include('dj_rest_auth.urls')),
|
|
path('auth/registration/', include('dj_rest_auth.registration.urls')),
|
|
path('auth/providers/', SocialProvierListView.as_view(), name='social_providers'),
|
|
path('auth/social/', include(social_auth_urlpatterns)),
|
|
path('auth/social/', SocialAccountListView.as_view(), name='social_account_list'),
|
|
path('auth/social/<int:pk>/disconnect/', SocialAccountDisconnectView.as_view(), name='social_account_disconnect'),
|
|
|
|
# Magic login URLs
|
|
path("email/generate/", csrf_exempt(GetSimpleLoginView().as_view()), name="sesame-generate",),
|
|
path("email/login/", LoginView.as_view(), name="sesame-login"),
|
|
|
|
# Unknown endpoint
|
|
re_path(r'^.*$', NotFoundView.as_view(), name='api-404'),
|
|
]
|
|
|
|
settings_urls = [
|
|
|
|
re_path(r'^i18n/?', include('django.conf.urls.i18n')),
|
|
|
|
re_path(r'^appearance/?', AppearanceSelectView.as_view(), name='settings-appearance'),
|
|
|
|
# Catch any other urls
|
|
re_path(r'^.*$', SettingsView.as_view(template_name='InvenTree/settings/settings.html'), name='settings'),
|
|
]
|
|
|
|
notifications_urls = [
|
|
|
|
# Catch any other urls
|
|
re_path(r'^.*$', NotificationsView.as_view(), name='notifications'),
|
|
]
|
|
|
|
# These javascript files are served "dynamically" - i.e. rendered on demand
|
|
dynamic_javascript_urls = [
|
|
re_path(r'^calendar.js', DynamicJsView.as_view(template_name='js/dynamic/calendar.js'), name='calendar.js'),
|
|
re_path(r'^nav.js', DynamicJsView.as_view(template_name='js/dynamic/nav.js'), name='nav.js'),
|
|
re_path(r'^permissions.js', DynamicJsView.as_view(template_name='js/dynamic/permissions.js'), name='permissions.js'),
|
|
re_path(r'^settings.js', DynamicJsView.as_view(template_name='js/dynamic/settings.js'), name='settings.js'),
|
|
]
|
|
|
|
# These javascript files are passed through the Django translation layer
|
|
translated_javascript_urls = [
|
|
re_path(r'^api.js', DynamicJsView.as_view(template_name='js/translated/api.js'), name='api.js'),
|
|
re_path(r'^attachment.js', DynamicJsView.as_view(template_name='js/translated/attachment.js'), name='attachment.js'),
|
|
re_path(r'^barcode.js', DynamicJsView.as_view(template_name='js/translated/barcode.js'), name='barcode.js'),
|
|
re_path(r'^bom.js', DynamicJsView.as_view(template_name='js/translated/bom.js'), name='bom.js'),
|
|
re_path(r'^build.js', DynamicJsView.as_view(template_name='js/translated/build.js'), name='build.js'),
|
|
re_path(r'^charts.js', DynamicJsView.as_view(template_name='js/translated/charts.js'), name='charts.js'),
|
|
re_path(r'^company.js', DynamicJsView.as_view(template_name='js/translated/company.js'), name='company.js'),
|
|
re_path(r'^filters.js', DynamicJsView.as_view(template_name='js/translated/filters.js'), name='filters.js'),
|
|
re_path(r'^forms.js', DynamicJsView.as_view(template_name='js/translated/forms.js'), name='forms.js'),
|
|
re_path(r'^helpers.js', DynamicJsView.as_view(template_name='js/translated/helpers.js'), name='helpers.js'),
|
|
re_path(r'^index.js', DynamicJsView.as_view(template_name='js/translated/index.js'), name='index.js'),
|
|
re_path(r'^label.js', DynamicJsView.as_view(template_name='js/translated/label.js'), name='label.js'),
|
|
re_path(r'^model_renderers.js', DynamicJsView.as_view(template_name='js/translated/model_renderers.js'), name='model_renderers.js'),
|
|
re_path(r'^modals.js', DynamicJsView.as_view(template_name='js/translated/modals.js'), name='modals.js'),
|
|
re_path(r'^order.js', DynamicJsView.as_view(template_name='js/translated/order.js'), name='order.js'),
|
|
re_path(r'^part.js', DynamicJsView.as_view(template_name='js/translated/part.js'), name='part.js'),
|
|
re_path(r'^purchase_order.js', DynamicJsView.as_view(template_name='js/translated/purchase_order.js'), name='purchase_order.js'),
|
|
re_path(r'^return_order.js', DynamicJsView.as_view(template_name='js/translated/return_order.js'), name='return_order.js'),
|
|
re_path(r'^report.js', DynamicJsView.as_view(template_name='js/translated/report.js'), name='report.js'),
|
|
re_path(r'^sales_order.js', DynamicJsView.as_view(template_name='js/translated/sales_order.js'), name='sales_order.js'),
|
|
re_path(r'^search.js', DynamicJsView.as_view(template_name='js/translated/search.js'), name='search.js'),
|
|
re_path(r'^stock.js', DynamicJsView.as_view(template_name='js/translated/stock.js'), name='stock.js'),
|
|
re_path(r'^status_codes.js', DynamicJsView.as_view(template_name='js/translated/status_codes.js'), name='status_codes.js'),
|
|
re_path(r'^plugin.js', DynamicJsView.as_view(template_name='js/translated/plugin.js'), name='plugin.js'),
|
|
re_path(r'^pricing.js', DynamicJsView.as_view(template_name='js/translated/pricing.js'), name='pricing.js'),
|
|
re_path(r'^news.js', DynamicJsView.as_view(template_name='js/translated/news.js'), name='news.js'),
|
|
re_path(r'^tables.js', DynamicJsView.as_view(template_name='js/translated/tables.js'), name='tables.js'),
|
|
re_path(r'^table_filters.js', DynamicJsView.as_view(template_name='js/translated/table_filters.js'), name='table_filters.js'),
|
|
re_path(r'^notification.js', DynamicJsView.as_view(template_name='js/translated/notification.js'), name='notification.js'),
|
|
]
|
|
|
|
backendpatterns = [
|
|
# "Dynamic" javascript files which are rendered using InvenTree templating.
|
|
re_path(r'^js/dynamic/', include(dynamic_javascript_urls)),
|
|
re_path(r'^js/i18n/', include(translated_javascript_urls)),
|
|
|
|
re_path(r'^auth/', include('rest_framework.urls', namespace='rest_framework')),
|
|
re_path(r'^auth/?', auth_request),
|
|
|
|
re_path(r'^api/', include(apipatterns)),
|
|
re_path(r'^api-doc/', SpectacularRedocView.as_view(url_name='schema'), name='api-doc'),
|
|
]
|
|
|
|
classic_frontendpatterns = [
|
|
|
|
# Apps
|
|
re_path(r'^build/', include(build_urls)),
|
|
re_path(r'^common/', include(common_urls)),
|
|
re_path(r'^company/', include(company_urls)),
|
|
re_path(r'^order/', include(order_urls)),
|
|
re_path(r'^manufacturer-part/', include(manufacturer_part_urls)),
|
|
re_path(r'^part/', include(part_urls)),
|
|
re_path(r'^stock/', include(stock_urls)),
|
|
re_path(r'^supplier-part/', include(supplier_part_urls)),
|
|
|
|
re_path(r'^edit-user/', EditUserView.as_view(), name='edit-user'),
|
|
re_path(r'^set-password/', SetPasswordView.as_view(), name='set-password'),
|
|
|
|
re_path(r'^index/', IndexView.as_view(), name='index'),
|
|
re_path(r'^notifications/', include(notifications_urls)),
|
|
re_path(r'^search/', SearchView.as_view(), name='search'),
|
|
re_path(r'^settings/', include(settings_urls)),
|
|
re_path(r'^about/', AboutView.as_view(), name='about'),
|
|
re_path(r'^stats/', DatabaseStatsView.as_view(), name='stats'),
|
|
|
|
# admin sites
|
|
re_path(f'^{settings.INVENTREE_ADMIN_URL}/error_log/', include('error_report.urls')),
|
|
re_path(f'^{settings.INVENTREE_ADMIN_URL}/', admin.site.urls, name='inventree-admin'),
|
|
|
|
# DB user sessions
|
|
path('accounts/sessions/other/delete/', view=CustomSessionDeleteOtherView.as_view(), name='session_delete_other', ),
|
|
re_path(r'^accounts/sessions/(?P<pk>\w+)/delete/$', view=CustomSessionDeleteView.as_view(), name='session_delete', ),
|
|
|
|
# Single Sign On / allauth
|
|
# overrides of urlpatterns
|
|
re_path(r'^accounts/email/', CustomEmailView.as_view(), name='account_email'),
|
|
re_path(r'^accounts/social/connections/', CustomConnectionsView.as_view(), name='socialaccount_connections'),
|
|
re_path(r"^accounts/password/reset/key/(?P<uidb36>[0-9A-Za-z]+)-(?P<key>.+)/$", CustomPasswordResetFromKeyView.as_view(), name="account_reset_password_from_key"),
|
|
|
|
# Override login page
|
|
re_path("accounts/login/", CustomLoginView.as_view(), name="account_login"),
|
|
|
|
re_path(r'^accounts/', include('allauth_2fa.urls')), # MFA support
|
|
re_path(r'^accounts/', include('allauth.urls')), # included urlpatterns
|
|
]
|
|
|
|
|
|
new_frontendpatterns = [
|
|
# Platform urls
|
|
re_path(r'^platform/', include(platform_urls)),
|
|
re_path(r'^platform', spa_view, name='platform'),
|
|
]
|
|
|
|
# Load patterns for frontend according to settings
|
|
frontendpatterns = []
|
|
if settings.ENABLE_CLASSIC_FRONTEND:
|
|
frontendpatterns.append(re_path('', include(classic_frontendpatterns)))
|
|
if settings.ENABLE_PLATFORM_FRONTEND:
|
|
frontendpatterns.append(re_path('', include(new_frontendpatterns)))
|
|
|
|
|
|
# Append custom plugin URLs (if plugin support is enabled)
|
|
if settings.PLUGINS_ENABLED:
|
|
frontendpatterns.append(get_plugin_urls())
|
|
|
|
urlpatterns = [
|
|
re_path('', include(frontendpatterns)),
|
|
re_path('', include(backendpatterns)),
|
|
]
|
|
|
|
# Server running in "DEBUG" mode?
|
|
if settings.DEBUG:
|
|
# Static file access
|
|
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
|
|
|
# Media file access
|
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
|
|
|
# Debug toolbar access (only allowed in DEBUG mode)
|
|
if settings.DEBUG_TOOLBAR_ENABLED:
|
|
import debug_toolbar
|
|
urlpatterns = [
|
|
path('__debug__/', include(debug_toolbar.urls)),
|
|
] + urlpatterns
|
|
|
|
# Send any unknown URLs to the parts page
|
|
urlpatterns += [re_path(r'^.*$', RedirectView.as_view(url='/index/', permanent=False), name='index')]
|