kopia lustrzana https://github.com/jedie/PyInventory
commit
8c4d3c8d83
Plik diff jest za duży
Load Diff
|
@ -1,27 +1,5 @@
|
||||||
import os
|
from django_tools.management.commands.run_testserver import Command as RunServerCommand
|
||||||
|
|
||||||
from django.core.management import call_command
|
|
||||||
from django.core.management.commands.runserver import Command as RunServerCommand
|
|
||||||
|
|
||||||
|
|
||||||
class Command(RunServerCommand):
|
class Command(RunServerCommand):
|
||||||
help = "Run Django dev. Server"
|
pass
|
||||||
|
|
||||||
def verbose_call(self, command, **kwargs):
|
|
||||||
self.stdout.write("\n")
|
|
||||||
self.stdout.write("_" * 79)
|
|
||||||
self.stdout.write(self.style.NOTICE(f" *** call '{command}' command with {kwargs}:"))
|
|
||||||
self.stdout.write("\n")
|
|
||||||
call_command(command, **kwargs)
|
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
|
||||||
"""
|
|
||||||
INFO: The django reloader will call this multiple times!
|
|
||||||
We check RUN_MAIN, that will be set in django.utils.autoreload
|
|
||||||
So we can skip the first migrate run.
|
|
||||||
"""
|
|
||||||
if os.environ.get("RUN_MAIN"):
|
|
||||||
self.verbose_call("migrate", run_syncdb=True, interactive=False, verbosity=1)
|
|
||||||
self.verbose_call("showmigrations", verbosity=1)
|
|
||||||
|
|
||||||
self.verbose_call("runserver", **options)
|
|
||||||
|
|
|
@ -13,9 +13,6 @@ from inventory_project.settings.base import * # noqa
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
TEMPLATE_DEBUG = True
|
TEMPLATE_DEBUG = True
|
||||||
|
|
||||||
# Serve static/media files for local development:
|
|
||||||
SERVE_FILES = True
|
|
||||||
|
|
||||||
|
|
||||||
# Disable caches:
|
# Disable caches:
|
||||||
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache'}}
|
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache'}}
|
||||||
|
@ -53,11 +50,11 @@ DEFAULT_USERPASS = 'test'
|
||||||
DEFAULT_USEREMAIL = 'nobody@local.intranet'
|
DEFAULT_USEREMAIL = 'nobody@local.intranet'
|
||||||
|
|
||||||
MIDDLEWARE = MIDDLEWARE.copy()
|
MIDDLEWARE = MIDDLEWARE.copy()
|
||||||
MIDDLEWARE.append('inventory_project.tests.middleware.AlwaysLoggedInAsSuperUser')
|
MIDDLEWARE.append('django_tools.middlewares.local_auto_login.AlwaysLoggedInAsSuperUserMiddleware')
|
||||||
|
|
||||||
# _____________________________________________________________________________
|
# _____________________________________________________________________________
|
||||||
# Django-Debug-Toolbar
|
# Django-Debug-Toolbar
|
||||||
|
|
||||||
|
INSTALLED_APPS.copy()
|
||||||
INSTALLED_APPS += ['debug_toolbar']
|
INSTALLED_APPS += ['debug_toolbar']
|
||||||
MIDDLEWARE.append('debug_toolbar.middleware.DebugToolbarMiddleware')
|
MIDDLEWARE.append('debug_toolbar.middleware.DebugToolbarMiddleware')
|
||||||
|
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib import messages
|
|
||||||
from django.contrib.auth import authenticate, login
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
|
|
||||||
|
|
||||||
def _print_and_message(request, msg, level=messages.WARNING):
|
|
||||||
print(f' *** {msg} ***', file=sys.stderr)
|
|
||||||
messages.add_message(request, level, msg)
|
|
||||||
|
|
||||||
|
|
||||||
class AlwaysLoggedInAsSuperUser:
|
|
||||||
"""
|
|
||||||
Auto login all users as default superuser.
|
|
||||||
Default user will be created, if not exist.
|
|
||||||
|
|
||||||
Disable it by deactivate the default user.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, get_response):
|
|
||||||
assert 'RUN_MAIN' in os.environ, 'Only allowed running by Django dev. server !'
|
|
||||||
self.get_response = get_response
|
|
||||||
|
|
||||||
def __call__(self, request):
|
|
||||||
self._auto_login(request)
|
|
||||||
response = self.get_response(request)
|
|
||||||
|
|
||||||
return response
|
|
||||||
|
|
||||||
def _auto_login(self, request):
|
|
||||||
if request.user.is_authenticated:
|
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
|
||||||
user = User.objects.get(username=settings.DEFAULT_USERNAME)
|
|
||||||
except User.DoesNotExist:
|
|
||||||
_print_and_message(request, f'Create test django user: {settings.DEFAULT_USERNAME!r}')
|
|
||||||
User.objects.create_superuser(
|
|
||||||
username=settings.DEFAULT_USERNAME,
|
|
||||||
email=settings.DEFAULT_USEREMAIL,
|
|
||||||
password=settings.DEFAULT_USERPASS
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
if not user.is_active:
|
|
||||||
_print_and_message(request, 'Default User was deactivated!', level=messages.ERROR)
|
|
||||||
return
|
|
||||||
|
|
||||||
user.set_password(settings.DEFAULT_USERPASS)
|
|
||||||
user.save()
|
|
||||||
|
|
||||||
_print_and_message(
|
|
||||||
request,
|
|
||||||
f'Autologin applied. Your logged in as {settings.DEFAULT_USERNAME!r}'
|
|
||||||
)
|
|
||||||
user = authenticate(
|
|
||||||
request=request,
|
|
||||||
username=settings.DEFAULT_USERNAME,
|
|
||||||
password=settings.DEFAULT_USERPASS
|
|
||||||
)
|
|
||||||
login(request, user)
|
|
|
@ -42,7 +42,7 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="?create_dt__day=1&create_dt__month=1&create_dt__year=2000">
|
<a href="?create_dt__day=1&create_dt__month=1&create_dt__year=2000">
|
||||||
January 1
|
January 1
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -160,13 +160,13 @@
|
||||||
---------
|
---------
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/itemmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_parent" title="Change selected Item">
|
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/itemmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_parent" title="Change selected Item">
|
||||||
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/itemmodel/add/?_to_field=id&_popup=1" id="add_id_parent" title="Add another Item">
|
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/itemmodel/add/?_to_field=id&_popup=1" id="add_id_parent" title="Add another Item">
|
||||||
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/itemmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_parent" title="Delete selected Item">
|
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/itemmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_parent" title="Delete selected Item">
|
||||||
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -186,13 +186,13 @@
|
||||||
---------
|
---------
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/locationmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_location" title="Change selected Location">
|
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/locationmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_location" title="Change selected Location">
|
||||||
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/locationmodel/add/?_to_field=id&_popup=1" id="add_id_location" title="Add another Location">
|
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/locationmodel/add/?_to_field=id&_popup=1" id="add_id_location" title="Add another Location">
|
||||||
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/locationmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_location" title="Delete selected Location">
|
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/locationmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_location" title="Delete selected Location">
|
||||||
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -180,7 +180,7 @@
|
||||||
<div id="content-main">
|
<div id="content-main">
|
||||||
<ul class="object-tools">
|
<ul class="object-tools">
|
||||||
<li>
|
<li>
|
||||||
<a class="historylink" href="/admin/inventory/itemmodel/<removed-UUID>/history/">
|
<a class="historylink" href="/admin/inventory/itemmodel/<removed-UUID>/history/">
|
||||||
History
|
History
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -366,17 +366,17 @@
|
||||||
<option selected="" value="">
|
<option selected="" value="">
|
||||||
---------
|
---------
|
||||||
</option>
|
</option>
|
||||||
<option value="<removed-UUID>">
|
<option value="<removed-UUID>">
|
||||||
name
|
name
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/itemmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_parent" title="Change selected Item">
|
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/itemmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_parent" title="Change selected Item">
|
||||||
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/itemmodel/add/?_to_field=id&_popup=1" id="add_id_parent" title="Add another Item">
|
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/itemmodel/add/?_to_field=id&_popup=1" id="add_id_parent" title="Add another Item">
|
||||||
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/itemmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_parent" title="Delete selected Item">
|
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/itemmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_parent" title="Delete selected Item">
|
||||||
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -396,13 +396,13 @@
|
||||||
---------
|
---------
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/locationmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_location" title="Change selected Location">
|
<a class="related-widget-wrapper-link change-related" data-href-template="/admin/inventory/locationmodel/__fk__/change/?_to_field=id&_popup=1" id="change_id_location" title="Change selected Location">
|
||||||
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
<img alt="Change" src="/static/admin/img/icon-changelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/locationmodel/add/?_to_field=id&_popup=1" id="add_id_location" title="Add another Location">
|
<a class="related-widget-wrapper-link add-related" href="/admin/inventory/locationmodel/add/?_to_field=id&_popup=1" id="add_id_location" title="Add another Location">
|
||||||
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
<img alt="Add" src="/static/admin/img/icon-addlink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/locationmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_location" title="Delete selected Location">
|
<a class="related-widget-wrapper-link delete-related" data-href-template="/admin/inventory/locationmodel/__fk__/delete/?_to_field=id&_popup=1" id="delete_id_location" title="Delete selected Location">
|
||||||
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
<img alt="Delete" src="/static/admin/img/icon-deletelink.svg"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -551,7 +551,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="original">
|
<td class="original">
|
||||||
<input id="id_itemimagemodel_set-__prefix__-id" name="itemimagemodel_set-__prefix__-id" type="hidden"/>
|
<input id="id_itemimagemodel_set-__prefix__-id" name="itemimagemodel_set-__prefix__-id" type="hidden"/>
|
||||||
<input id="id_itemimagemodel_set-__prefix__-item" name="itemimagemodel_set-__prefix__-item" type="hidden" value="<removed-UUID>"/>
|
<input id="id_itemimagemodel_set-__prefix__-item" name="itemimagemodel_set-__prefix__-item" type="hidden" value="<removed-UUID>"/>
|
||||||
<input id="id_itemimagemodel_set-__prefix__-position" name="itemimagemodel_set-__prefix__-position" type="hidden" value="0"/>
|
<input id="id_itemimagemodel_set-__prefix__-position" name="itemimagemodel_set-__prefix__-position" type="hidden" value="0"/>
|
||||||
</td>
|
</td>
|
||||||
<td class="field-preview">
|
<td class="field-preview">
|
||||||
|
@ -629,7 +629,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="original">
|
<td class="original">
|
||||||
<input id="id_itemfilemodel_set-__prefix__-id" name="itemfilemodel_set-__prefix__-id" type="hidden"/>
|
<input id="id_itemfilemodel_set-__prefix__-id" name="itemfilemodel_set-__prefix__-id" type="hidden"/>
|
||||||
<input id="id_itemfilemodel_set-__prefix__-item" name="itemfilemodel_set-__prefix__-item" type="hidden" value="<removed-UUID>"/>
|
<input id="id_itemfilemodel_set-__prefix__-item" name="itemfilemodel_set-__prefix__-item" type="hidden" value="<removed-UUID>"/>
|
||||||
<input id="id_itemfilemodel_set-__prefix__-position" name="itemfilemodel_set-__prefix__-position" type="hidden" value="0"/>
|
<input id="id_itemfilemodel_set-__prefix__-position" name="itemfilemodel_set-__prefix__-position" type="hidden" value="0"/>
|
||||||
</td>
|
</td>
|
||||||
<td class="field-file">
|
<td class="field-file">
|
||||||
|
@ -699,7 +699,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="original">
|
<td class="original">
|
||||||
<input id="id_itemlinkmodel_set-__prefix__-id" name="itemlinkmodel_set-__prefix__-id" type="hidden"/>
|
<input id="id_itemlinkmodel_set-__prefix__-id" name="itemlinkmodel_set-__prefix__-id" type="hidden"/>
|
||||||
<input id="id_itemlinkmodel_set-__prefix__-item" name="itemlinkmodel_set-__prefix__-item" type="hidden" value="<removed-UUID>"/>
|
<input id="id_itemlinkmodel_set-__prefix__-item" name="itemlinkmodel_set-__prefix__-item" type="hidden" value="<removed-UUID>"/>
|
||||||
<input id="id_itemlinkmodel_set-__prefix__-position" name="itemlinkmodel_set-__prefix__-position" type="hidden" value="0"/>
|
<input id="id_itemlinkmodel_set-__prefix__-position" name="itemlinkmodel_set-__prefix__-position" type="hidden" value="0"/>
|
||||||
</td>
|
</td>
|
||||||
<td class="field-tags">
|
<td class="field-tags">
|
||||||
|
@ -733,7 +733,7 @@
|
||||||
<div class="submit-row">
|
<div class="submit-row">
|
||||||
<input class="default" name="_save" type="submit" value="Save"/>
|
<input class="default" name="_save" type="submit" value="Save"/>
|
||||||
<p class="deletelink-box">
|
<p class="deletelink-box">
|
||||||
<a class="deletelink" href="/admin/inventory/itemmodel/<removed-UUID>/delete/">
|
<a class="deletelink" href="/admin/inventory/itemmodel/<removed-UUID>/delete/">
|
||||||
Delete
|
Delete
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -23,16 +23,25 @@ def call_devshell_commands(*args):
|
||||||
class DevShellTestCase(TestCase):
|
class DevShellTestCase(TestCase):
|
||||||
def test_run_testserver(self):
|
def test_run_testserver(self):
|
||||||
output = call_devshell_commands('run_testserver', '--help')
|
output = call_devshell_commands('run_testserver', '--help')
|
||||||
assert 'usage: manage.py run_testserver' in output
|
assert 'Setup test project and run django developer server' in output
|
||||||
assert 'Run Django dev. Server' in output
|
|
||||||
assert 'Optional port number, or ipaddr:port' in output
|
|
||||||
|
|
||||||
def test_pass_wrong_addrport(self):
|
# From own run_testserver command:
|
||||||
output = call_devshell_commands('run_testserver', 'not-ip:no-port')
|
assert '--nomakemigrations' in output
|
||||||
assert "call 'runserver' command with" in output
|
assert '--nomigrate' in output
|
||||||
assert (
|
|
||||||
'CommandError: "not-ip:no-port" is not a valid port number or address:port pair.'
|
# From django.core.management.commands.runserver command:
|
||||||
) in output
|
assert '[addrport]' in output
|
||||||
|
|
||||||
|
def test_run_testserver_invalid_addr(self):
|
||||||
|
output = call_devshell_commands(
|
||||||
|
'run_testserver',
|
||||||
|
'--nomigrate',
|
||||||
|
'--nomakemigrations',
|
||||||
|
'invalid:addr',
|
||||||
|
)
|
||||||
|
|
||||||
|
assert 'Call "runserver"' in output
|
||||||
|
assert 'is not a valid port number or address' in output
|
||||||
|
|
||||||
def test_manage_command(self):
|
def test_manage_command(self):
|
||||||
output = call_devshell_commands('manage', 'diffsettings')
|
output = call_devshell_commands('manage', 'diffsettings')
|
||||||
|
|
|
@ -6,6 +6,7 @@ from pathlib import Path
|
||||||
from creole.setup_utils import update_rst_readme
|
from creole.setup_utils import update_rst_readme
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core import checks
|
from django.core import checks
|
||||||
|
from django.core.cache import cache
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django_tools.unittest_utils.project_setup import check_editor_config
|
from django_tools.unittest_utils.project_setup import check_editor_config
|
||||||
|
|
||||||
|
@ -115,6 +116,21 @@ class ProjectSettingsTestCase(TestCase):
|
||||||
print('=' * 100)
|
print('=' * 100)
|
||||||
raise AssertionError('There are check issues!')
|
raise AssertionError('There are check issues!')
|
||||||
|
|
||||||
|
def test_cache(self):
|
||||||
|
# django cache should work in tests, because some tests "depends" on it
|
||||||
|
cache_key = 'a-cache-key'
|
||||||
|
assert cache.get(cache_key) is None
|
||||||
|
cache.set(cache_key, 'the cache content', timeout=1)
|
||||||
|
assert cache.get(cache_key) == 'the cache content'
|
||||||
|
cache.delete(cache_key)
|
||||||
|
assert cache.get(cache_key) is None
|
||||||
|
|
||||||
|
def test_settings(self):
|
||||||
|
assert settings.SETTINGS_MODULE == 'inventory_project.settings.tests'
|
||||||
|
middlewares = [entry.rsplit('.', 1)[-1] for entry in settings.MIDDLEWARE]
|
||||||
|
assert 'AlwaysLoggedInAsSuperUserMiddleware' not in middlewares
|
||||||
|
assert 'DebugToolbarMiddleware' not in middlewares
|
||||||
|
|
||||||
|
|
||||||
def test_check_editor_config():
|
def test_check_editor_config():
|
||||||
check_editor_config(package_root=PACKAGE_ROOT)
|
check_editor_config(package_root=PACKAGE_ROOT)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls import include, re_path, static
|
from django.conf.urls import include, re_path
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.views.generic import RedirectView
|
from django.views.generic import RedirectView
|
||||||
|
@ -17,10 +17,6 @@ urlpatterns = [ # Don't use i18n_patterns() here
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
if settings.SERVE_FILES:
|
|
||||||
urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
|
||||||
|
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
import debug_toolbar
|
import debug_toolbar
|
||||||
urlpatterns = [re_path(r'^__debug__/', include(debug_toolbar.urls))] + urlpatterns
|
urlpatterns = [re_path(r'^__debug__/', include(debug_toolbar.urls))] + urlpatterns
|
||||||
|
|
Ładowanie…
Reference in New Issue