django-cfg 1.4.88__py3-none-any.whl → 1.4.89__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-cfg might be problematic. Click here for more details.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/centrifugo/views/__init__.py +0 -2
- django_cfg/apps/dashboard/services/__init__.py +2 -0
- django_cfg/apps/dashboard/services/overview_service.py +205 -0
- django_cfg/apps/frontend/test_routing.py +134 -0
- django_cfg/apps/frontend/views.py +69 -28
- django_cfg/apps/urls.py +0 -1
- django_cfg/core/builders/apps_builder.py +0 -58
- django_cfg/modules/django_unfold/__init__.py +5 -24
- django_cfg/modules/django_unfold/models/__init__.py +0 -23
- django_cfg/modules/django_unfold/models/config.py +11 -65
- django_cfg/modules/django_unfold/{dashboard.py → navigation.py} +21 -152
- django_cfg/modules/django_unfold/tailwind.py +2 -4
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/third_party.py +0 -9
- django_cfg/routing/callbacks.py +1 -43
- django_cfg/static/frontend/admin/404/index.html +1 -1
- django_cfg/static/frontend/admin/404.html +1 -1
- django_cfg/static/frontend/admin/500/index.html +1 -1
- django_cfg/static/frontend/admin/_next/static/{D_d9HRw5Yn7BRHAX5q89_ → 0sN9ktsgXH48ygtGSrhfu}/_buildManifest.js +1 -1
- django_cfg/static/frontend/admin/_next/static/chunks/50314-9443faa6df24aebf.js +1 -0
- django_cfg/static/frontend/admin/_next/static/chunks/pages/{_app-1c0fff0f59a6d683.js → _app-c7dcd3aa616fab68.js} +1 -1
- django_cfg/static/frontend/admin/_next/static/chunks/pages/private/{centrifugo-44a8313fa040e9ad.js → centrifugo-f9ecbc3ae0052a03.js} +1 -1
- django_cfg/static/frontend/admin/auth/index.html +1 -1
- django_cfg/static/frontend/admin/index.html +1 -1
- django_cfg/static/frontend/admin/legal/cookies/index.html +1 -1
- django_cfg/static/frontend/admin/legal/privacy/index.html +1 -1
- django_cfg/static/frontend/admin/legal/security/index.html +1 -1
- django_cfg/static/frontend/admin/legal/terms/index.html +1 -1
- django_cfg/static/frontend/admin/private/centrifugo/index.html +1 -1
- django_cfg/static/frontend/admin/private/index.html +1 -1
- django_cfg/static/frontend/admin/private/profile/index.html +1 -1
- django_cfg/static/frontend/admin/private/ui/index.html +2 -2
- {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/METADATA +1 -1
- {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/RECORD +39 -143
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/css/dashboard.css +0 -260
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/live_channels.mjs +0 -313
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/live_testing.mjs +0 -803
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/main.mjs +0 -341
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/overview.mjs +0 -432
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/testing.mjs +0 -33
- django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/websocket.mjs +0 -210
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/channels_content.html +0 -46
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/live_channels_content.html +0 -123
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/overview_content.html +0 -45
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/publishes_content.html +0 -84
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/stat_cards.html +0 -53
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/system_status.html +0 -91
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/tab_navigation.html +0 -29
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/testing_tools.html +0 -415
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/layout/base.html +0 -61
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/pages/dashboard.html +0 -58
- django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/tags/connection_script.html +0 -48
- django_cfg/apps/centrifugo/templatetags/__init__.py +0 -1
- django_cfg/apps/centrifugo/templatetags/centrifugo_tags.py +0 -81
- django_cfg/apps/centrifugo/urls_admin.py +0 -20
- django_cfg/apps/centrifugo/views/dashboard.py +0 -28
- django_cfg/modules/django_dashboard/__init__.py +0 -23
- django_cfg/modules/django_dashboard/components.py +0 -312
- django_cfg/modules/django_dashboard/debug.py +0 -174
- django_cfg/modules/django_dashboard/management/__init__.py +0 -0
- django_cfg/modules/django_dashboard/management/commands/__init__.py +0 -0
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +0 -109
- django_cfg/modules/django_dashboard/sections/__init__.py +0 -1
- django_cfg/modules/django_dashboard/sections/base.py +0 -129
- django_cfg/modules/django_dashboard/sections/commands.py +0 -33
- django_cfg/modules/django_dashboard/sections/documentation.py +0 -393
- django_cfg/modules/django_dashboard/sections/overview.py +0 -398
- django_cfg/modules/django_dashboard/sections/stats.py +0 -48
- django_cfg/modules/django_dashboard/sections/system.py +0 -74
- django_cfg/modules/django_dashboard/sections/widgets.py +0 -222
- django_cfg/modules/django_unfold/callbacks/__init__.py +0 -9
- django_cfg/modules/django_unfold/callbacks/actions.py +0 -51
- django_cfg/modules/django_unfold/callbacks/apizones.py +0 -122
- django_cfg/modules/django_unfold/callbacks/base.py +0 -290
- django_cfg/modules/django_unfold/callbacks/charts.py +0 -223
- django_cfg/modules/django_unfold/callbacks/commands.py +0 -40
- django_cfg/modules/django_unfold/callbacks/main.py +0 -322
- django_cfg/modules/django_unfold/callbacks/statistics.py +0 -240
- django_cfg/modules/django_unfold/callbacks/system.py +0 -180
- django_cfg/modules/django_unfold/callbacks/users.py +0 -65
- django_cfg/modules/django_unfold/models/dashboard.py +0 -207
- django_cfg/modules/django_unfold/models/tabs.py +0 -26
- django_cfg/modules/django_unfold/models.py +0 -98
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +0 -102
- django_cfg/static/frontend/admin/_next/static/chunks/50314-5ec79b293c2283dd.js +0 -1
- django_cfg/templates/admin/sections/commands_section.html +0 -5
- django_cfg/templates/admin/sections/documentation_section.html +0 -5
- django_cfg/templates/admin/sections/overview_section.html +0 -5
- django_cfg/templates/admin/sections/stats_section.html +0 -5
- django_cfg/templates/admin/sections/system_section.html +0 -5
- django_cfg/templates/admin/sections/widgets_section.html +0 -11
- django_cfg/templates/admin_old/components/action_grid.html +0 -49
- django_cfg/templates/admin_old/components/card.html +0 -50
- django_cfg/templates/admin_old/components/data_table.html +0 -67
- django_cfg/templates/admin_old/components/metric_card.html +0 -39
- django_cfg/templates/admin_old/components/modal.html +0 -58
- django_cfg/templates/admin_old/components/progress_bar.html +0 -20
- django_cfg/templates/admin_old/components/section_header.html +0 -26
- django_cfg/templates/admin_old/components/stat_item.html +0 -32
- django_cfg/templates/admin_old/components/stats_grid.html +0 -72
- django_cfg/templates/admin_old/components/status_badge.html +0 -28
- django_cfg/templates/admin_old/components/user_avatar.html +0 -27
- django_cfg/templates/admin_old/constance/change_list.html +0 -74
- django_cfg/templates/admin_old/constance/includes/default_value.html +0 -24
- django_cfg/templates/admin_old/constance/includes/fieldset_header.html +0 -15
- django_cfg/templates/admin_old/constance/includes/results_list.html +0 -16
- django_cfg/templates/admin_old/constance/includes/setting_row.html +0 -50
- django_cfg/templates/admin_old/constance/includes/table_headers.html +0 -10
- django_cfg/templates/admin_old/examples/component_class_example.html +0 -156
- django_cfg/templates/admin_old/import_export/change_list_export.html +0 -24
- django_cfg/templates/admin_old/import_export/change_list_import.html +0 -24
- django_cfg/templates/admin_old/import_export/change_list_import_export.html +0 -34
- django_cfg/templates/admin_old/index.html +0 -80
- django_cfg/templates/admin_old/index_new.html +0 -119
- django_cfg/templates/admin_old/layouts/base_dashboard.html +0 -62
- django_cfg/templates/admin_old/layouts/dashboard_with_tabs.html +0 -176
- django_cfg/templates/admin_old/sections/commands_section.html +0 -549
- django_cfg/templates/admin_old/sections/documentation_section.html +0 -152
- django_cfg/templates/admin_old/sections/overview_section.html +0 -112
- django_cfg/templates/admin_old/sections/stats_section.html +0 -35
- django_cfg/templates/admin_old/sections/system_section.html +0 -99
- django_cfg/templates/admin_old/sections/widgets_section.html +0 -129
- django_cfg/templates/admin_old/snippets/components/activity_tracker.html +0 -70
- django_cfg/templates/admin_old/snippets/components/charts_section.html +0 -113
- django_cfg/templates/admin_old/snippets/components/django_commands.html +0 -270
- django_cfg/templates/admin_old/snippets/components/quick_actions.html +0 -66
- django_cfg/templates/admin_old/snippets/components/recent_activity_improved.html +0 -25
- django_cfg/templates/admin_old/snippets/components/recent_users_table.html +0 -102
- django_cfg/templates/admin_old/snippets/components/stats_cards.html +0 -4
- django_cfg/templates/admin_old/snippets/components/stats_tiles.html +0 -92
- django_cfg/templates/admin_old/snippets/components/system_health.html +0 -22
- django_cfg/templates/admin_old/snippets/components/system_metrics.html +0 -199
- django_cfg/templates/admin_old/snippets/components/user_permissions.html +0 -57
- django_cfg/templates/admin_old/snippets/tabs/app_stats_tab.html +0 -201
- django_cfg/templates/admin_old/snippets/tabs/commands_tab.html +0 -114
- django_cfg/templates/admin_old/snippets/tabs/documentation_tab.html +0 -42
- django_cfg/templates/admin_old/snippets/tabs/overview_tab.html +0 -116
- django_cfg/templates/admin_old/snippets/tabs/stats_tab.html +0 -89
- django_cfg/templates/admin_old/snippets/tabs/users_tab.html +0 -51
- django_cfg/templates/admin_old/snippets/tabs/widgets_tab.html +0 -38
- django_cfg/templates/admin_old/snippets/zones/zones_table.html +0 -176
- /django_cfg/static/frontend/admin/_next/static/{D_d9HRw5Yn7BRHAX5q89_ → 0sN9ktsgXH48ygtGSrhfu}/_ssgManifest.js +0 -0
- {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Tab Configuration Models for Unfold Dashboard
|
|
3
|
-
|
|
4
|
-
Pydantic models for tab configurations.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from typing import List, Optional
|
|
8
|
-
|
|
9
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TabItem(BaseModel):
|
|
13
|
-
"""Tab item configuration."""
|
|
14
|
-
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
|
15
|
-
|
|
16
|
-
title: str = Field(..., min_length=1, description="Tab title")
|
|
17
|
-
link: str = Field(..., min_length=1, description="Tab URL")
|
|
18
|
-
permission: Optional[str] = Field(None, description="Permission callback")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class TabConfiguration(BaseModel):
|
|
22
|
-
"""Tab configuration for admin models."""
|
|
23
|
-
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
|
24
|
-
|
|
25
|
-
models: List[str] = Field(..., min_length=1, description="Model names for tab")
|
|
26
|
-
items: List[TabItem] = Field(..., min_length=1, description="Tab items")
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Dashboard Pydantic Models for Django CFG Unfold Module
|
|
3
|
-
|
|
4
|
-
All dashboard data models with type safety.
|
|
5
|
-
Following CRITICAL_REQUIREMENTS.md - NO raw dicts, ALL type-safe.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from typing import List, Optional
|
|
9
|
-
|
|
10
|
-
from pydantic import BaseModel, Field
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class StatCard(BaseModel):
|
|
14
|
-
"""Statistics card model for dashboard."""
|
|
15
|
-
|
|
16
|
-
title: str = Field(..., description="Card title")
|
|
17
|
-
value: str = Field(..., description="Main value to display")
|
|
18
|
-
icon: str = Field(..., description="Material icon name")
|
|
19
|
-
change: Optional[str] = Field(None, description="Change indicator (e.g., '+5', '-2%')")
|
|
20
|
-
change_type: str = Field("neutral", description="Change type: positive, negative, neutral")
|
|
21
|
-
description: Optional[str] = Field(None, description="Additional description")
|
|
22
|
-
color: str = Field("primary", description="Card color theme")
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class SystemHealthItem(BaseModel):
|
|
26
|
-
"""System health status item."""
|
|
27
|
-
|
|
28
|
-
component: str = Field(..., description="Component name (database, cache, etc.)")
|
|
29
|
-
status: str = Field(..., description="Status: healthy, warning, error, unknown")
|
|
30
|
-
description: str = Field(..., description="Status description")
|
|
31
|
-
last_check: str = Field(..., description="Last check time")
|
|
32
|
-
health_percentage: Optional[int] = Field(None, description="Health percentage (0-100)")
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class QuickAction(BaseModel):
|
|
36
|
-
"""Quick action button for dashboard."""
|
|
37
|
-
|
|
38
|
-
title: str = Field(..., description="Action title")
|
|
39
|
-
description: str = Field(..., description="Action description")
|
|
40
|
-
icon: str = Field(..., description="Material icon name")
|
|
41
|
-
link: str = Field(..., description="Action URL or URL name")
|
|
42
|
-
color: str = Field("primary", description="Button color")
|
|
43
|
-
category: str = Field("general", description="Action category")
|
|
44
|
-
|
|
45
|
-
def get_resolved_url(self) -> str:
|
|
46
|
-
"""
|
|
47
|
-
Resolve URL name to full URL if needed.
|
|
48
|
-
|
|
49
|
-
Returns:
|
|
50
|
-
Full URL string - either the original link if it's already a URL,
|
|
51
|
-
or the resolved URL if it's a URL name.
|
|
52
|
-
"""
|
|
53
|
-
# If link starts with '/' or 'http', it's already a full URL
|
|
54
|
-
if self.link.startswith(("/", "http")):
|
|
55
|
-
return self.link
|
|
56
|
-
|
|
57
|
-
# Try to resolve as URL name
|
|
58
|
-
try:
|
|
59
|
-
from django.urls import reverse
|
|
60
|
-
from django.urls.exceptions import NoReverseMatch
|
|
61
|
-
return reverse(self.link)
|
|
62
|
-
except (NoReverseMatch, ImportError, Exception):
|
|
63
|
-
# If reverse fails, return the original link
|
|
64
|
-
return self.link
|
|
65
|
-
|
|
66
|
-
def model_dump(self, **kwargs) -> dict:
|
|
67
|
-
"""Override model_dump to include resolved URL."""
|
|
68
|
-
data = super().model_dump(**kwargs)
|
|
69
|
-
# Replace link with resolved URL
|
|
70
|
-
data["link"] = self.get_resolved_url()
|
|
71
|
-
return data
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
class DashboardData(BaseModel):
|
|
75
|
-
"""Main dashboard data container."""
|
|
76
|
-
|
|
77
|
-
stat_cards: List[StatCard] = Field(default_factory=list, description="Statistics cards")
|
|
78
|
-
system_health: List[SystemHealthItem] = Field(default_factory=list, description="System health items")
|
|
79
|
-
quick_actions: List[QuickAction] = Field(default_factory=list, description="Quick action buttons")
|
|
80
|
-
last_updated: str = Field(..., description="Last update timestamp")
|
|
81
|
-
environment: str = Field("development", description="Current environment")
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class ChartDataset(BaseModel):
|
|
85
|
-
"""Chart dataset for dashboard charts."""
|
|
86
|
-
|
|
87
|
-
label: str = Field(..., description="Dataset label")
|
|
88
|
-
data: List[int] = Field(default_factory=list, description="Data points")
|
|
89
|
-
backgroundColor: str = Field(..., description="Background color")
|
|
90
|
-
borderColor: str = Field(..., description="Border color")
|
|
91
|
-
tension: float = Field(0.4, description="Line tension")
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class ChartData(BaseModel):
|
|
95
|
-
"""Chart data structure."""
|
|
96
|
-
|
|
97
|
-
labels: List[str] = Field(default_factory=list, description="Chart labels")
|
|
98
|
-
datasets: List[ChartDataset] = Field(default_factory=list, description="Chart datasets")
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
{% load i18n unfold %}
|
|
2
|
-
|
|
3
|
-
{% if sidebar_navigation %}
|
|
4
|
-
<div class="h-0 grow overflow-auto" data-simplebar>
|
|
5
|
-
{% for group in sidebar_navigation %}
|
|
6
|
-
{% if group.items %}
|
|
7
|
-
{% has_nav_item_active group.items as has_active %}
|
|
8
|
-
|
|
9
|
-
<div class="hidden mb-2 has-[ol]:has-[li]:block" {% if group.collapsible %}x-data="{navigationOpen: {% if group.open %}true{% elif has_active %}true{% else %}false{% endif %}}"{% endif %}>
|
|
10
|
-
{% if group.separator %}
|
|
11
|
-
<hr class="border-t border-base-200 mx-6 my-2 dark:border-base-800" />
|
|
12
|
-
{% endif %}
|
|
13
|
-
|
|
14
|
-
{% if group.title %}
|
|
15
|
-
<h2 class="font-semibold flex flex-row group items-center mb-1 mx-3 py-1.5 px-3 select-none text-font-important-light text-sm dark:text-font-important-dark {% if group.collapsible %}cursor-pointer hover:text-primary-600 dark:hover:text-primary-500{% endif %}" {% if group.collapsible %}x-on:click="navigationOpen = !navigationOpen"{% endif %}>
|
|
16
|
-
{{ group.title }}
|
|
17
|
-
|
|
18
|
-
{% if group.collapsible %}
|
|
19
|
-
<span class="material-symbols-outlined ml-auto transition-all group-hover:text-primary-600 dark:group-hover:text-primary-500" x-bind:class="{'rotate-90': navigationOpen}">
|
|
20
|
-
chevron_right
|
|
21
|
-
</span>
|
|
22
|
-
{% endif %}
|
|
23
|
-
</h2>
|
|
24
|
-
{% endif %}
|
|
25
|
-
|
|
26
|
-
<ol class="flex flex-col gap-1 px-6" {% if group.collapsible %}x-show="navigationOpen"{% endif %}>
|
|
27
|
-
{% for item in group.items %}
|
|
28
|
-
{% if item.has_permission %}
|
|
29
|
-
<li>
|
|
30
|
-
<a href="{% if item.link_callback %}{{ item.link_callback }}{% else %}{{ item.link }}{% endif %}" class="flex h-[38px] items-center -mx-3 px-3 rounded-default hover:text-primary-600 dark:hover:text-primary-500 {% if item.active %}bg-base-100 font-semibold text-primary-600 dark:bg-white/[.06] dark:text-primary-500{% endif %}">
|
|
31
|
-
{% if item.icon %}
|
|
32
|
-
<span class="material-symbols-outlined md-18 mr-3 w-[18px]">
|
|
33
|
-
{{ item.icon }}
|
|
34
|
-
</span>
|
|
35
|
-
{% endif %}
|
|
36
|
-
|
|
37
|
-
<span class="text-sm">
|
|
38
|
-
{{ item.title|safe }}
|
|
39
|
-
</span>
|
|
40
|
-
|
|
41
|
-
{% if item.badge %}
|
|
42
|
-
<span class="bg-red-600 font-semibold ml-2 px-1 relative rounded-xs text-xs text-white">
|
|
43
|
-
{% if item.badge_callback %}
|
|
44
|
-
{{ item.badge_callback }}
|
|
45
|
-
{% else %}
|
|
46
|
-
{{ item.badge }}
|
|
47
|
-
{% endif %}
|
|
48
|
-
</span>
|
|
49
|
-
{% endif %}
|
|
50
|
-
</a>
|
|
51
|
-
</li>
|
|
52
|
-
{% endif %}
|
|
53
|
-
{% endfor %}
|
|
54
|
-
</ol>
|
|
55
|
-
</div>
|
|
56
|
-
{% endif %}
|
|
57
|
-
{% endfor %}
|
|
58
|
-
</div>
|
|
59
|
-
|
|
60
|
-
{% if sidebar_show_all_applications and app_list|length > 0 %}
|
|
61
|
-
<div class="mt-auto" x-data="{ openAllApplications: false }">
|
|
62
|
-
<a class="cursor-pointer flex items-center h-[64px] px-6 py-3 text-sm dark:text-font-default-dark hover:text-primary-600 dark:hover:text-primary-500" x-on:click="openAllApplications = !openAllApplications">
|
|
63
|
-
<span class="material-symbols-outlined md-18 mr-3">
|
|
64
|
-
apps
|
|
65
|
-
</span>
|
|
66
|
-
|
|
67
|
-
<span>
|
|
68
|
-
{% trans "All applications" %}
|
|
69
|
-
</span>
|
|
70
|
-
</a>
|
|
71
|
-
|
|
72
|
-
<div class="absolute bottom-0 left-0 right-0 top-0 z-50 md:left-72" x-cloak x-show="openAllApplications">
|
|
73
|
-
<div class="absolute bg-base-900/80 backdrop-blur-xs bottom-0 left-0 right-0 top-0 z-10 w-screen"></div>
|
|
74
|
-
|
|
75
|
-
<div class="bg-white flex flex-col h-full overflow-x-hidden overflow-y-auto py-5 px-8 relative text-sm w-80 z-20 dark:bg-base-900 dark:border-r dark:border-base-800" x-on:click.outside="openAllApplications = false" x-on:keydown.escape.window="openAllApplications = false" data-simplebar>
|
|
76
|
-
{% for app in app_list %}
|
|
77
|
-
<div class="mb-6 last:mb-0">
|
|
78
|
-
<h2 class="mb-4 font-semibold text-font-important-light truncate dark:text-font-important-dark">
|
|
79
|
-
{{ app.name }}
|
|
80
|
-
</h2>
|
|
81
|
-
|
|
82
|
-
<ul>
|
|
83
|
-
{% for model in app.models %}
|
|
84
|
-
<li class="block mb-4 last:mb-0">
|
|
85
|
-
<a href="{{ model.admin_url }}" class="block truncate hover:text-primary-600 dark:hover:text-primary-500">
|
|
86
|
-
{{ model.name }}
|
|
87
|
-
</a>
|
|
88
|
-
</li>
|
|
89
|
-
{% endfor %}
|
|
90
|
-
</ul>
|
|
91
|
-
</div>
|
|
92
|
-
{% endfor %}
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
{% endif %}
|
|
97
|
-
{% else %}
|
|
98
|
-
<p>
|
|
99
|
-
{% trans "You don’t have permission to view or edit anything." as error_message %}
|
|
100
|
-
{% include "unfold/helpers/messages/error.html" with error=error_message %}
|
|
101
|
-
</p>
|
|
102
|
-
{% endif %}
|