mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-18 13:05:42 +00:00
Merge branch 'master' of https://github.com/inventree/InvenTree into matmair/issue6281
This commit is contained in:
@ -285,6 +285,29 @@ QUERYCOUNT = {
|
||||
'RESPONSE_HEADER': 'X-Django-Query-Count',
|
||||
}
|
||||
|
||||
ADMIN_SHELL_ENABLE = False
|
||||
ADMIN_SHELL_IMPORT_DJANGO = False
|
||||
ADMIN_SHELL_IMPORT_MODELS = False
|
||||
|
||||
# In DEBUG mode, add support for django-admin-shell
|
||||
# Ref: https://github.com/djk2/django-admin-shell
|
||||
if (
|
||||
DEBUG
|
||||
and INVENTREE_ADMIN_ENABLED
|
||||
and get_boolean_setting('INVENTREE_DEBUG_SHELL', 'debug_shell', False)
|
||||
): # noqa
|
||||
try:
|
||||
import django_admin_shell
|
||||
|
||||
INSTALLED_APPS.append('django_admin_shell')
|
||||
ADMIN_SHELL_ENABLE = True
|
||||
|
||||
logger.warning('Admin shell is enabled')
|
||||
except ModuleNotFoundError:
|
||||
logger.warning(
|
||||
'django-admin-shell is not installed - Admin shell is not enabled'
|
||||
)
|
||||
|
||||
AUTHENTICATION_BACKENDS = CONFIG.get(
|
||||
'authentication_backends',
|
||||
[
|
||||
|
@ -434,7 +434,11 @@ classic_frontendpatterns = [
|
||||
urlpatterns = []
|
||||
|
||||
if settings.INVENTREE_ADMIN_ENABLED:
|
||||
admin_url = (settings.INVENTREE_ADMIN_URL,)
|
||||
admin_url = settings.INVENTREE_ADMIN_URL
|
||||
|
||||
if settings.ADMIN_SHELL_ENABLE: # noqa
|
||||
urlpatterns += [path(f'{admin_url}/shell/', include('django_admin_shell.urls'))]
|
||||
|
||||
urlpatterns += [
|
||||
path(f'{admin_url}/error_log/', include('error_report.urls')),
|
||||
path(f'{admin_url}/', admin.site.urls, name='inventree-admin'),
|
||||
|
@ -258,6 +258,13 @@ class UserSettingsList(SettingsList):
|
||||
common.models.InvenTreeUserSetting.build_default_values(user=request.user)
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
def get_queryset(self):
|
||||
"""Return prefetched queryset."""
|
||||
queryset = super().get_queryset()
|
||||
queryset = queryset.prefetch_related('user')
|
||||
|
||||
return queryset
|
||||
|
||||
def filter_queryset(self, queryset):
|
||||
"""Only list settings which apply to the current user."""
|
||||
try:
|
||||
|
@ -64,6 +64,7 @@ class TestSerialNumberMigration(MigratorTestCase):
|
||||
big_ref_item.serial,
|
||||
'9999999999999999999999999999999999999999999999999999999999999',
|
||||
)
|
||||
|
||||
self.assertEqual(big_ref_item.serial_int, 0x7FFFFFFF)
|
||||
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
-c requirements.txt
|
||||
coverage[toml] # Unit test coverage
|
||||
coveralls==2.1.2 # Coveralls linking (for tracking coverage) # PINNED 2022-06-28 - Old version needed for correct upload
|
||||
django-admin-shell # Remote shell access
|
||||
django-querycount # Display number of URL queries for requests
|
||||
django-slowtests # Show which unit tests are running slowly
|
||||
django-test-migrations # Unit testing for database migrations
|
||||
|
@ -24,7 +24,10 @@ cryptography==42.0.5
|
||||
distlib==0.3.8
|
||||
# via virtualenv
|
||||
django==4.2.11
|
||||
# via django-slowtests
|
||||
# via
|
||||
# django-admin-shell
|
||||
# django-slowtests
|
||||
django-admin-shell==2.0.1
|
||||
django-querycount==0.8.3
|
||||
django-slowtests==1.1.1
|
||||
django-test-migrations==1.3.0
|
||||
|
@ -268,7 +268,7 @@ pyyaml==6.0.1
|
||||
# tablib
|
||||
qrcode[pil]==7.4.2
|
||||
# via django-allauth
|
||||
rapidfuzz==3.6.2
|
||||
rapidfuzz==3.8.1
|
||||
redis==5.0.3
|
||||
# via django-redis
|
||||
referencing==0.34.0
|
||||
|
@ -6,7 +6,7 @@ export default defineConfig({
|
||||
forbidOnly: !!process.env.CI,
|
||||
retries: process.env.CI ? 1 : 0,
|
||||
workers: process.env.CI ? 2 : undefined,
|
||||
reporter: process.env.CI ? 'github' : 'list',
|
||||
reporter: process.env.CI ? [['html', { open: 'never' }], ['github']] : 'list',
|
||||
|
||||
/* Configure projects for major browsers */
|
||||
projects: [
|
||||
|
@ -23,9 +23,9 @@ import { getDetailUrl } from '../../functions/urls';
|
||||
import { base_url } from '../../main';
|
||||
import { apiUrl } from '../../states/ApiState';
|
||||
import { useGlobalSettingsState } from '../../states/SettingsState';
|
||||
import { YesNoButton } from '../buttons/YesNoButton';
|
||||
import { ProgressBar } from '../items/ProgressBar';
|
||||
import { StylishText } from '../items/StylishText';
|
||||
import { YesNoButton } from '../items/YesNoButton';
|
||||
import { getModelInfo } from '../render/ModelType';
|
||||
import { StatusRenderer } from '../render/StatusRenderer';
|
||||
|
||||
|
@ -6,7 +6,7 @@ import { IconCheck } from '@tabler/icons-react';
|
||||
import { useServerApiState } from '../../states/ApiState';
|
||||
import { useLocalState } from '../../states/LocalState';
|
||||
import { HostList } from '../../states/states';
|
||||
import { EditButton } from '../items/EditButton';
|
||||
import { EditButton } from '../buttons/EditButton';
|
||||
import { HostOptionsForm } from './HostOptionsForm';
|
||||
|
||||
export function InstanceOptions({
|
||||
|
@ -2,8 +2,8 @@ import { Trans } from '@lingui/macro';
|
||||
import { Code, Flex, Group, Text } from '@mantine/core';
|
||||
import { Link, To } from 'react-router-dom';
|
||||
|
||||
import { YesNoButton } from '../buttons/YesNoButton';
|
||||
import { DetailDrawerLink } from '../nav/DetailDrawer';
|
||||
import { YesNoButton } from './YesNoButton';
|
||||
|
||||
export function InfoItem({
|
||||
name,
|
||||
|
@ -19,7 +19,7 @@ import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { apiUrl, useServerApiState } from '../../states/ApiState';
|
||||
import { useLocalState } from '../../states/LocalState';
|
||||
import { useUserState } from '../../states/UserState';
|
||||
import { CopyButton } from '../items/CopyButton';
|
||||
import { CopyButton } from '../buttons/CopyButton';
|
||||
|
||||
type AboutLookupRef = {
|
||||
ref: string;
|
||||
|
@ -20,7 +20,7 @@ export function LicenceView(entries: Readonly<any[]>) {
|
||||
return (
|
||||
<Stack spacing="xs">
|
||||
<Divider />
|
||||
{entries?.length > 0 && (
|
||||
{entries?.length > 0 ? (
|
||||
<Accordion variant="contained" defaultValue="-">
|
||||
{entries?.map((entry: any, index: number) => (
|
||||
<Accordion.Item key={entry.name} value={`entry-${index}`}>
|
||||
@ -38,6 +38,10 @@ export function LicenceView(entries: Readonly<any[]>) {
|
||||
</Accordion.Item>
|
||||
))}
|
||||
</Accordion>
|
||||
) : (
|
||||
<Text>
|
||||
<Trans>No Information provided - this is likely a server issue</Trans>
|
||||
</Text>
|
||||
)}
|
||||
</Stack>
|
||||
);
|
||||
@ -53,6 +57,8 @@ export function LicenseModal() {
|
||||
.catch(() => {})
|
||||
});
|
||||
|
||||
const rspdata = !data ? [] : Object.keys(data ?? {});
|
||||
|
||||
return (
|
||||
<Stack spacing="xs">
|
||||
<Divider />
|
||||
@ -69,16 +75,16 @@ export function LicenseModal() {
|
||||
</Text>
|
||||
</Alert>
|
||||
) : (
|
||||
<Tabs defaultValue={Object.keys(data)[0] ?? ''}>
|
||||
<Tabs defaultValue={rspdata[0] ?? ''}>
|
||||
<Tabs.List>
|
||||
{Object.keys(data ?? {}).map((key) => (
|
||||
{rspdata.map((key) => (
|
||||
<Tabs.Tab key={key} value={key}>
|
||||
<Trans>{key} Packages</Trans>
|
||||
</Tabs.Tab>
|
||||
))}
|
||||
</Tabs.List>
|
||||
|
||||
{Object.keys(data ?? {}).map((key) => (
|
||||
{rspdata.map((key) => (
|
||||
<Tabs.Panel key={key} value={key}>
|
||||
{LicenceView(data[key] ?? [])}
|
||||
</Tabs.Panel>
|
||||
|
@ -10,7 +10,7 @@ import { navTabs as mainNavTabs } from '../../defaults/links';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { InvenTreeStyle } from '../../globalStyle';
|
||||
import { apiUrl } from '../../states/ApiState';
|
||||
import { ScanButton } from '../items/ScanButton';
|
||||
import { ScanButton } from '../buttons/ScanButton';
|
||||
import { MainMenu } from './MainMenu';
|
||||
import { NavHoverMenu } from './NavHoverMenu';
|
||||
import { NavigationDrawer } from './NavigationDrawer';
|
||||
|
@ -4,7 +4,7 @@ import { useForm } from '@mantine/form';
|
||||
import { useToggle } from '@mantine/hooks';
|
||||
|
||||
import { api } from '../../../../App';
|
||||
import { EditButton } from '../../../../components/items/EditButton';
|
||||
import { EditButton } from '../../../../components/buttons/EditButton';
|
||||
import { ApiEndpoints } from '../../../../enums/ApiEndpoints';
|
||||
import { apiUrl } from '../../../../states/ApiState';
|
||||
import { useUserState } from '../../../../states/UserState';
|
||||
|
@ -4,9 +4,9 @@
|
||||
import { t } from '@lingui/macro';
|
||||
import { Anchor } from '@mantine/core';
|
||||
|
||||
import { YesNoButton } from '../components/buttons/YesNoButton';
|
||||
import { Thumbnail } from '../components/images/Thumbnail';
|
||||
import { ProgressBar } from '../components/items/ProgressBar';
|
||||
import { YesNoButton } from '../components/items/YesNoButton';
|
||||
import { TableStatusRenderer } from '../components/render/StatusRenderer';
|
||||
import { RenderOwner } from '../components/render/User';
|
||||
import { formatCurrency, renderDate } from '../defaults/formatters';
|
||||
|
@ -8,8 +8,8 @@ import {
|
||||
import { ReactNode, useCallback, useMemo } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
import { YesNoButton } from '../../components/buttons/YesNoButton';
|
||||
import { Thumbnail } from '../../components/images/Thumbnail';
|
||||
import { YesNoButton } from '../../components/items/YesNoButton';
|
||||
import { formatPriceRange } from '../../defaults/formatters';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { ModelType } from '../../enums/ModelType';
|
||||
|
@ -2,8 +2,8 @@ import { t } from '@lingui/macro';
|
||||
import { useCallback, useMemo, useState } from 'react';
|
||||
|
||||
import { AddItemButton } from '../../components/buttons/AddItemButton';
|
||||
import { YesNoButton } from '../../components/buttons/YesNoButton';
|
||||
import { ApiFormFieldSet } from '../../components/forms/fields/ApiFormField';
|
||||
import { YesNoButton } from '../../components/items/YesNoButton';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { UserRoles } from '../../enums/Roles';
|
||||
import {
|
||||
|
@ -23,6 +23,7 @@ import { useNavigate } from 'react-router-dom';
|
||||
|
||||
import { api } from '../../App';
|
||||
import { AddItemButton } from '../../components/buttons/AddItemButton';
|
||||
import { YesNoButton } from '../../components/buttons/YesNoButton';
|
||||
import {
|
||||
ActionDropdown,
|
||||
DeleteItemAction,
|
||||
@ -30,7 +31,6 @@ import {
|
||||
} from '../../components/items/ActionDropdown';
|
||||
import { InfoItem } from '../../components/items/InfoItem';
|
||||
import { UnavailableIndicator } from '../../components/items/UnavailableIndicator';
|
||||
import { YesNoButton } from '../../components/items/YesNoButton';
|
||||
import {
|
||||
DetailDrawer,
|
||||
DetailDrawerLink
|
||||
|
@ -6,8 +6,8 @@ import { useQuery } from '@tanstack/react-query';
|
||||
import { useCallback, useMemo, useState } from 'react';
|
||||
|
||||
import { api } from '../../App';
|
||||
import { YesNoButton } from '../../components/buttons/YesNoButton';
|
||||
import { ApiFormFieldSet } from '../../components/forms/fields/ApiFormField';
|
||||
import { YesNoButton } from '../../components/items/YesNoButton';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { ModelType } from '../../enums/ModelType';
|
||||
import { UserRoles } from '../../enums/Roles';
|
||||
|
@ -3,7 +3,7 @@ import { useCallback, useMemo, useState } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
import { AddItemButton } from '../../components/buttons/AddItemButton';
|
||||
import { YesNoButton } from '../../components/items/YesNoButton';
|
||||
import { YesNoButton } from '../../components/buttons/YesNoButton';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { ModelType } from '../../enums/ModelType';
|
||||
import { UserRoles } from '../../enums/Roles';
|
||||
|
@ -3,8 +3,8 @@ import { Text } from '@mantine/core';
|
||||
import { useCallback, useMemo, useState } from 'react';
|
||||
|
||||
import { AddItemButton } from '../../components/buttons/AddItemButton';
|
||||
import { YesNoButton } from '../../components/buttons/YesNoButton';
|
||||
import { ApiFormFieldSet } from '../../components/forms/fields/ApiFormField';
|
||||
import { YesNoButton } from '../../components/items/YesNoButton';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
import { UserRoles } from '../../enums/Roles';
|
||||
import {
|
||||
|
@ -12,9 +12,9 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
|
||||
import { api } from '../../App';
|
||||
import { AddItemButton } from '../../components/buttons/AddItemButton';
|
||||
import { PassFailButton } from '../../components/buttons/YesNoButton';
|
||||
import { ApiFormFieldSet } from '../../components/forms/fields/ApiFormField';
|
||||
import { AttachmentLink } from '../../components/items/AttachmentLink';
|
||||
import { PassFailButton } from '../../components/items/YesNoButton';
|
||||
import { RenderUser } from '../../components/render/User';
|
||||
import { renderDate } from '../../defaults/formatters';
|
||||
import { ApiEndpoints } from '../../enums/ApiEndpoints';
|
||||
|
Reference in New Issue
Block a user