Dashboard Ready
20
.drone.yml
@ -1,21 +1,20 @@
|
|||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
name: default
|
name: deploy-polisplexity
|
||||||
|
|
||||||
clone:
|
clone:
|
||||||
depth: 1
|
depth: 1
|
||||||
submodules: true # Ensure submodules like pxy_city_digital_twins are cloned
|
submodules: true
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: install dependencies and check Django project
|
- name: install dependencies and run Django checks
|
||||||
image: python:3.10
|
image: python:3.10
|
||||||
environment:
|
environment:
|
||||||
DATABASE_URL:
|
DATABASE_URL:
|
||||||
from_secret: DATABASE_URL
|
from_secret: DATABASE_URL
|
||||||
SECRET_KEY:
|
SECRET_KEY:
|
||||||
from_secret: SECRET_KEY
|
from_secret: SECRET_KEY
|
||||||
DEBUG:
|
DEBUG: "False"
|
||||||
from_secret: DEBUG
|
|
||||||
NEO4J_URI:
|
NEO4J_URI:
|
||||||
from_secret: NEO4J_URI
|
from_secret: NEO4J_URI
|
||||||
NEO4J_USERNAME:
|
NEO4J_USERNAME:
|
||||||
@ -31,10 +30,10 @@ steps:
|
|||||||
commands:
|
commands:
|
||||||
- python -m pip install --upgrade pip
|
- python -m pip install --upgrade pip
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
- python manage.py check
|
- python manage.py check --deploy --fail-level WARNING
|
||||||
- echo "✅ Django check completed"
|
- echo "✅ Django deploy checks passed"
|
||||||
|
|
||||||
- name: deploy to production
|
- name: deploy to production server
|
||||||
image: appleboy/ssh
|
image: appleboy/ssh
|
||||||
settings:
|
settings:
|
||||||
host:
|
host:
|
||||||
@ -49,4 +48,7 @@ steps:
|
|||||||
- git pull origin main
|
- git pull origin main
|
||||||
- docker compose down
|
- docker compose down
|
||||||
- docker compose up -d --build
|
- docker compose up -d --build
|
||||||
- echo "🚀 Deployment complete"
|
- docker compose exec web python manage.py migrate --noinput
|
||||||
|
- docker compose exec web python manage.py collectstatic --noinput
|
||||||
|
- echo "🚀 Production deployment complete"
|
||||||
|
|
33
Dockerfile
@ -1,14 +1,12 @@
|
|||||||
# Use official Python image
|
# Etapa base: Python oficial
|
||||||
FROM python:3.10
|
FROM python:3.10-slim as base
|
||||||
|
|
||||||
# Set working directory
|
# Variables de entorno para producción
|
||||||
WORKDIR /app
|
ENV PYTHONDONTWRITEBYTECODE 1
|
||||||
|
ENV PYTHONUNBUFFERED 1
|
||||||
|
|
||||||
# Copy application code
|
# Instala dependencias del sistema
|
||||||
COPY . .
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
|
||||||
# Add before pip install step
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
build-essential \
|
build-essential \
|
||||||
libgeos-dev \
|
libgeos-dev \
|
||||||
libspatialindex-dev \
|
libspatialindex-dev \
|
||||||
@ -20,11 +18,20 @@ RUN apt-get update && apt-get install -y \
|
|||||||
python3-dev \
|
python3-dev \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Install dependencies
|
# Crea directorio de trabajo
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copia requirements primero (mejor cacheo)
|
||||||
|
COPY requirements.txt .
|
||||||
|
|
||||||
|
# Instala dependencias Python
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
# Expose the application port
|
# Copia el resto del proyecto
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Expone el puerto del contenedor
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
# Run Gunicorn server
|
# Comando por defecto para producción con Gunicorn
|
||||||
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "polisplexity.wsgi:application"]
|
CMD ["gunicorn", "polisplexity.wsgi:application", "--bind", "0.0.0.0:8000", "--workers=3", "--timeout=120"]
|
||||||
|
@ -5,12 +5,12 @@ services:
|
|||||||
image: postgres:15
|
image: postgres:15
|
||||||
container_name: polisplexity_postgres
|
container_name: polisplexity_postgres
|
||||||
restart: always
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "5434:5432"
|
||||||
volumes:
|
volumes:
|
||||||
- pgdata:/var/lib/postgresql/data
|
- pgdata:/var/lib/postgresql/data
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
|
||||||
- "5434:5432"
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
@ -24,14 +24,20 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
volumes:
|
|
||||||
- .:/app # Sync local code into container for live reload
|
|
||||||
ports:
|
ports:
|
||||||
- "8001:8001"
|
- "8001:8001"
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
command: python manage.py runserver 0.0.0.0:8001
|
command: >
|
||||||
|
sh -c "python manage.py migrate &&
|
||||||
|
python manage.py collectstatic --noinput &&
|
||||||
|
gunicorn polisplexity.wsgi:application --bind 0.0.0.0:8001"
|
||||||
|
volumes:
|
||||||
|
- static_data:/app/static
|
||||||
|
- media_data:/app/media
|
||||||
|
# - .:/app # ←❌ No lo uses en producción: desactiva para evitar sobrescribir
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
pgdata:
|
pgdata:
|
||||||
|
static_data:
|
||||||
|
media_data:
|
||||||
|
@ -1,33 +1,16 @@
|
|||||||
"""
|
|
||||||
Django settings for polisplexity project.
|
|
||||||
|
|
||||||
Generated by 'django-admin startproject' using Django 5.0.3.
|
|
||||||
|
|
||||||
For more information on this file, see
|
|
||||||
https://docs.djangoproject.com/en/5.0/topics/settings/
|
|
||||||
|
|
||||||
For the full list of settings and their values, see
|
|
||||||
https://docs.djangoproject.com/en/5.0/ref/settings/
|
|
||||||
"""
|
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import os
|
import os
|
||||||
import dj_database_url
|
import dj_database_url
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
# Load environment variables from .env file
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
BASE_URL = "https://app.polisplexity.tech"
|
BASE_URL = "https://app.polisplexity.tech"
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# Core security settings
|
||||||
SECRET_KEY = os.getenv("SECRET_KEY")
|
SECRET_KEY = os.getenv("SECRET_KEY")
|
||||||
|
DEBUG = os.getenv("DEBUG", "False") == "True"
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
|
||||||
DEBUG = os.getenv("DEBUG") == "True"
|
|
||||||
|
|
||||||
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",")
|
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",")
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
@ -38,6 +21,8 @@ INSTALLED_APPS = [
|
|||||||
"django.contrib.sessions",
|
"django.contrib.sessions",
|
||||||
"django.contrib.messages",
|
"django.contrib.messages",
|
||||||
"django.contrib.staticfiles",
|
"django.contrib.staticfiles",
|
||||||
|
|
||||||
|
# App modules
|
||||||
"core",
|
"core",
|
||||||
"pxy_de",
|
"pxy_de",
|
||||||
"pxy_cr",
|
"pxy_cr",
|
||||||
@ -48,6 +33,11 @@ INSTALLED_APPS = [
|
|||||||
"pxy_meta_pages",
|
"pxy_meta_pages",
|
||||||
"pxy_langchain",
|
"pxy_langchain",
|
||||||
"pxy_neo4j",
|
"pxy_neo4j",
|
||||||
|
"pxy_dashboard",
|
||||||
|
"pxy_dashboard.custom",
|
||||||
|
"pxy_dashboard.apps",
|
||||||
|
"pxy_dashboard.components",
|
||||||
|
"pxy_dashboard.layouts",
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@ -80,7 +70,7 @@ TEMPLATES = [
|
|||||||
|
|
||||||
WSGI_APPLICATION = "polisplexity.wsgi.application"
|
WSGI_APPLICATION = "polisplexity.wsgi.application"
|
||||||
|
|
||||||
# Database Configuration
|
# Database
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": dj_database_url.config(default=os.getenv("DATABASE_URL"))
|
"default": dj_database_url.config(default=os.getenv("DATABASE_URL"))
|
||||||
}
|
}
|
||||||
@ -99,26 +89,31 @@ TIME_ZONE = "UTC"
|
|||||||
USE_I18N = True
|
USE_I18N = True
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
|
||||||
# Static and Media Files
|
# Static & Media Files
|
||||||
STATIC_URL = "/static/"
|
STATIC_URL = "/static/"
|
||||||
STATIC_ROOT = os.getenv("STATIC_ROOT", os.path.join(BASE_DIR, "static"))
|
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
|
||||||
|
|
||||||
|
STATICFILES_DIRS = [
|
||||||
|
os.path.join(BASE_DIR, "polisplexity/pxy_dashboard/static/dashboard"), # Jidox assets
|
||||||
|
]
|
||||||
|
|
||||||
MEDIA_URL = "/media/"
|
MEDIA_URL = "/media/"
|
||||||
MEDIA_ROOT = os.getenv("MEDIA_ROOT", os.path.join(BASE_DIR, "media"))
|
MEDIA_ROOT = os.path.join(BASE_DIR, "mediafiles")
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
||||||
|
|
||||||
# Facebook API Tokens
|
# External services
|
||||||
PAGE_ACCESS_TOKEN = os.getenv("PAGE_ACCESS_TOKEN")
|
PAGE_ACCESS_TOKEN = os.getenv("PAGE_ACCESS_TOKEN")
|
||||||
VERIFY_TOKEN = os.getenv("VERIFY_TOKEN")
|
VERIFY_TOKEN = os.getenv("VERIFY_TOKEN")
|
||||||
|
|
||||||
|
# Async-safe for Neo4j or Celery
|
||||||
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
|
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
|
||||||
|
|
||||||
# Neo4j Database Configuration
|
# Neo4j
|
||||||
NEO4J_URI = os.getenv("NEO4J_URI")
|
NEO4J_URI = os.getenv("NEO4J_URI")
|
||||||
NEO4J_USERNAME = os.getenv("NEO4J_USERNAME")
|
NEO4J_USERNAME = os.getenv("NEO4J_USERNAME")
|
||||||
NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD")
|
NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD")
|
||||||
|
|
||||||
# OpenAI API Key
|
# OpenAI
|
||||||
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
||||||
|
@ -25,11 +25,13 @@ admin.site.index_title = "Welcome to Polisplexity City Technologies Portal"
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("admin/", admin.site.urls),
|
path("admin/", admin.site.urls),
|
||||||
|
path('', include('pxy_dashboard.urls')),
|
||||||
path('', include('core.urls')),
|
path('', include('core.urls')),
|
||||||
path('', include('pxy_city_digital_twins.urls')),
|
path('', include('pxy_city_digital_twins.urls')),
|
||||||
path('pxy_whatsapp/', include('pxy_whatsapp.urls')),
|
path('pxy_whatsapp/', include('pxy_whatsapp.urls')),
|
||||||
path('bots/', include('pxy_bots.urls')), # Webhook URL: /bots/webhook/<bot_name>/
|
path('bots/', include('pxy_bots.urls')), # Webhook URL: /bots/webhook/<bot_name>/
|
||||||
path('pxy_meta_pages/', include('pxy_meta_pages.urls', namespace='pxy_meta_pages')),
|
path('pxy_meta_pages/', include('pxy_meta_pages.urls', namespace='pxy_meta_pages')),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
|
0
pxy_dashboard/__init__.py
Normal file
3
pxy_dashboard/admin.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
6
pxy_dashboard/apps.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class PxyDashboardConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'pxy_dashboard'
|
0
pxy_dashboard/apps/__init__.py
Normal file
3
pxy_dashboard/apps/admin.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
5
pxy_dashboard/apps/apps.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
class AppsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'pxy_dashboard.apps'
|
3
pxy_dashboard/apps/models.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
3
pxy_dashboard/apps/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
31
pxy_dashboard/apps/urls.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from pxy_dashboard.apps.views import (
|
||||||
|
apps_calendar_view,
|
||||||
|
apps_chat_view,
|
||||||
|
apps_email_inbox_view,
|
||||||
|
apps_email_read,
|
||||||
|
apps_tasks,
|
||||||
|
apps_tasks_details,
|
||||||
|
apps_kanban_board,
|
||||||
|
apps_file_manager,
|
||||||
|
)
|
||||||
|
app_name = "apps"
|
||||||
|
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
# Calaendar
|
||||||
|
path("calendar", view=apps_calendar_view, name="calendar"),
|
||||||
|
# Chat
|
||||||
|
path("chat", view=apps_chat_view, name="chat"),
|
||||||
|
# Email
|
||||||
|
path("email-inbox", view=apps_email_inbox_view, name="email-inbox"),
|
||||||
|
path("email-read", view=apps_email_read, name="email-read"),
|
||||||
|
# Tasks
|
||||||
|
path("tasks", view=apps_tasks, name="tasks"),
|
||||||
|
path("tasks-details", view=apps_tasks_details, name="tasks-details"),
|
||||||
|
# Kanban
|
||||||
|
path("kanban-board", view=apps_kanban_board, name="kanban"),
|
||||||
|
# File Manager
|
||||||
|
path("file-manager", view=apps_file_manager, name="file-manager"),
|
||||||
|
|
||||||
|
]
|
22
pxy_dashboard/apps/views.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
from django.views.generic.base import TemplateView
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
|
||||||
|
|
||||||
|
class AppsView(LoginRequiredMixin,TemplateView):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Calendar
|
||||||
|
apps_calendar_view = AppsView.as_view(template_name="apps/apps-calendar.html")
|
||||||
|
# Chat
|
||||||
|
apps_chat_view = AppsView.as_view(template_name="apps/apps-chat.html")
|
||||||
|
# Mail Box
|
||||||
|
apps_email_inbox_view = AppsView.as_view(template_name="apps/apps-email-inbox.html")
|
||||||
|
apps_email_read = AppsView.as_view(template_name="apps/apps-email-read.html")
|
||||||
|
# Tasks
|
||||||
|
apps_tasks = AppsView.as_view(template_name="apps/apps-tasks.html")
|
||||||
|
apps_tasks_details = AppsView.as_view(template_name="apps/apps-tasks-details.html")
|
||||||
|
# Kanban
|
||||||
|
apps_kanban_board = AppsView.as_view(template_name="apps/apps-kanban.html")
|
||||||
|
# File Manager
|
||||||
|
apps_file_manager = AppsView.as_view(template_name="apps/apps-file-manager.html")
|
0
pxy_dashboard/components/__init__.py
Normal file
3
pxy_dashboard/components/admin.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
5
pxy_dashboard/components/apps.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
class ComponentsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'pxy_dashboard.components'
|
3
pxy_dashboard/components/models.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
3
pxy_dashboard/components/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
166
pxy_dashboard/components/urls.py
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from pxy_dashboard.components.views import (
|
||||||
|
accordions_view,
|
||||||
|
alerts_view,
|
||||||
|
avatars_view,
|
||||||
|
badges_view,
|
||||||
|
breadcrumb_view,
|
||||||
|
buttons_view,
|
||||||
|
cards_view,
|
||||||
|
carousel_view,
|
||||||
|
collapse_view,
|
||||||
|
dropdowns_view,
|
||||||
|
embed_video_view,
|
||||||
|
grid_view,
|
||||||
|
links_view,
|
||||||
|
list_group_view,
|
||||||
|
modals_view,
|
||||||
|
notifications_view,
|
||||||
|
offcanvas_view,
|
||||||
|
placeholders_view,
|
||||||
|
pagination_view,
|
||||||
|
popovers_view,
|
||||||
|
progress_view,
|
||||||
|
spinners_view,
|
||||||
|
tabs_view,
|
||||||
|
tooltips_view,
|
||||||
|
typography_view,
|
||||||
|
utilities_view,
|
||||||
|
extended_dragula_view,
|
||||||
|
extended_range_slider_view,
|
||||||
|
extended_ratings_view,
|
||||||
|
extended_scrollbar_view,
|
||||||
|
extended_scrollspy_view,
|
||||||
|
widgets_view,
|
||||||
|
icons_remixicons_view,
|
||||||
|
icons_bootstrap_view,
|
||||||
|
icons_material_view,
|
||||||
|
apex_area_view,
|
||||||
|
apex_bar_view,
|
||||||
|
apex_bubble_view,
|
||||||
|
apex_candlestick_view,
|
||||||
|
apex_column_view,
|
||||||
|
apex_heatmap_view,
|
||||||
|
apex_line_view,
|
||||||
|
apex_mixed_view,
|
||||||
|
apex_timeline_view,
|
||||||
|
apex_boxplot_view,
|
||||||
|
apex_treemap_view,
|
||||||
|
apex_pie_view,
|
||||||
|
apex_radar_view,
|
||||||
|
apex_radialbar_view,
|
||||||
|
apex_scatter_view,
|
||||||
|
apex_polar_area_view,
|
||||||
|
apex_sparklines_view,
|
||||||
|
chartjs_area_view,
|
||||||
|
chartjs_bar_view,
|
||||||
|
chartjs_line_view,
|
||||||
|
chartjs_other_view,
|
||||||
|
form_elements_view,
|
||||||
|
form_advanced_view,
|
||||||
|
form_wizard_view,
|
||||||
|
form_fileuploads_view,
|
||||||
|
form_editors_view,
|
||||||
|
tables_basic_view,
|
||||||
|
tables_datatable_view,
|
||||||
|
google_map_view,
|
||||||
|
vector_map_view,
|
||||||
|
form_validation_view,
|
||||||
|
)
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
# Base Ui
|
||||||
|
path("accordions", view=accordions_view, name="accordions"),
|
||||||
|
path("alerts", view=alerts_view, name="alerts"),
|
||||||
|
path("avatars", view=avatars_view, name="avatars"),
|
||||||
|
path("badges", view=badges_view, name="badges"),
|
||||||
|
path("breadcrumb", view=breadcrumb_view, name="breadcrumb"),
|
||||||
|
path("buttons", view=buttons_view, name="buttons"),
|
||||||
|
path("cards", view=cards_view, name="cards"),
|
||||||
|
path("carousel", view=carousel_view, name="carousel"),
|
||||||
|
path("collapse", view=collapse_view, name="collapse"),
|
||||||
|
path("dropdowns", view=dropdowns_view, name="dropdowns"),
|
||||||
|
path("embed-video", view=embed_video_view, name="embed-video"),
|
||||||
|
path("grid", view=grid_view, name="grid"),
|
||||||
|
path("links", view=links_view, name="links"),
|
||||||
|
path("list-group", view=list_group_view, name="list-group"),
|
||||||
|
path("modals", view=modals_view, name="modals"),
|
||||||
|
path("notifications", view=notifications_view, name="notifications"),
|
||||||
|
path("offcanvas", view=offcanvas_view, name="offcanvas"),
|
||||||
|
path("placeholders", view=placeholders_view, name="placeholders"),
|
||||||
|
path("pagination", view=pagination_view, name="pagination"),
|
||||||
|
path("popovers", view=popovers_view, name="popovers"),
|
||||||
|
path("progress", view=progress_view, name="progress"),
|
||||||
|
path("spinners", view=spinners_view, name="spinners"),
|
||||||
|
path("tabs", view=tabs_view, name="tabs"),
|
||||||
|
path("tooltips", view=tooltips_view, name="tooltips"),
|
||||||
|
path("typography", view=typography_view, name="typography"),
|
||||||
|
path("utilities", view=utilities_view, name="utilities"),
|
||||||
|
|
||||||
|
|
||||||
|
# Extended Ui
|
||||||
|
path("extended-dragula", view=extended_dragula_view, name="extended-dragula"),
|
||||||
|
path(
|
||||||
|
"extended-range-slider",
|
||||||
|
view=extended_range_slider_view,
|
||||||
|
name="extended-range-slider",
|
||||||
|
),
|
||||||
|
path("extended-ratings", view=extended_ratings_view, name="extended-ratings"),
|
||||||
|
path("extended-scrollbar", view=extended_scrollbar_view, name="extended-scrollbar"),
|
||||||
|
path("extended-scrollspy", view=extended_scrollspy_view, name="extended-scrollspy"),
|
||||||
|
|
||||||
|
|
||||||
|
# Widgets
|
||||||
|
path("widgets", view=widgets_view, name="widgets"),
|
||||||
|
|
||||||
|
|
||||||
|
# Icons
|
||||||
|
path("icons-remixicons", view=icons_remixicons_view, name="icons-remixicons"),
|
||||||
|
path("icons-bootstrap", view=icons_bootstrap_view, name="icons-bootstrap"),
|
||||||
|
path("icons-material-symbol", view=icons_material_view, name="icons-material"),
|
||||||
|
|
||||||
|
|
||||||
|
# Charts
|
||||||
|
# Apex
|
||||||
|
path("apex-area", view=apex_area_view, name="apex-area"),
|
||||||
|
path("apex-bar", view=apex_bar_view, name="apex-bar"),
|
||||||
|
path("apex-bubble", view=apex_bubble_view, name="apex-bubble"),
|
||||||
|
path("apex-candlestick", view=apex_candlestick_view, name="apex-candlestick"),
|
||||||
|
path("apex-column", view=apex_column_view, name="apex-column"),
|
||||||
|
path("apex-heatmap", view=apex_heatmap_view, name="apex-heatmap"),
|
||||||
|
path("apex-line", view=apex_line_view, name="apex-line"),
|
||||||
|
path("apex-mixed", view=apex_mixed_view, name="apex-mixed"),
|
||||||
|
path("apex-timeline", view=apex_timeline_view, name="apex-timeline"),
|
||||||
|
path("apex-boxplot", view=apex_boxplot_view, name="apex-boxplot"),
|
||||||
|
path("apex-treemap", view=apex_treemap_view, name="apex-treemap"),
|
||||||
|
path("apex-pie", view=apex_pie_view, name="apex-pie"),
|
||||||
|
path("apex-radar", view=apex_radar_view, name="apex-radar"),
|
||||||
|
path("apex-radialbar", view=apex_radialbar_view, name="apex-radialbar"),
|
||||||
|
path("apex-scatter", view=apex_scatter_view, name="apex-scatter"),
|
||||||
|
path("apex-polar-area", view=apex_polar_area_view, name="apex-polar-area"),
|
||||||
|
path("apex-sparklines", view=apex_sparklines_view, name="apex-sparklines"),
|
||||||
|
# ChartJs
|
||||||
|
path("chartjs-area", view=chartjs_area_view, name="chartjs-area"),
|
||||||
|
path("chartjs-bar", view=chartjs_bar_view, name="chartjs-bar"),
|
||||||
|
path("chartjs-line", view=chartjs_line_view, name="chartjs-line"),
|
||||||
|
path("chartjs-other", view=chartjs_other_view, name="chartjs-other"),
|
||||||
|
|
||||||
|
|
||||||
|
# Forms
|
||||||
|
path("form-elements", view=form_elements_view, name="form-elements"),
|
||||||
|
path("form-advanced", view=form_advanced_view, name="form-advanced"),
|
||||||
|
path("form-validation", view=form_validation_view, name="form-validation"),
|
||||||
|
path("form-wizard", view=form_wizard_view, name="form-wizard"),
|
||||||
|
path("form-fileuploads", view=form_fileuploads_view, name="form-fileuploads"),
|
||||||
|
path("form-editors", view=form_editors_view, name="form-editors"),
|
||||||
|
|
||||||
|
|
||||||
|
# Tables
|
||||||
|
path("tables-basic", view=tables_basic_view, name="tables-basic"),
|
||||||
|
path("tables-datatable", view=tables_datatable_view, name="tables-datatable"),
|
||||||
|
|
||||||
|
|
||||||
|
# Maps
|
||||||
|
path("google-map", view=google_map_view, name="google-map"),
|
||||||
|
path("vector-map", view=vector_map_view, name="vector-map"),
|
||||||
|
]
|
193
pxy_dashboard/components/views.py
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
from django.views.generic.base import TemplateView
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
|
||||||
|
class ComponentView(LoginRequiredMixin,TemplateView):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Base Ui
|
||||||
|
accordions_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/accordions.html"
|
||||||
|
)
|
||||||
|
alerts_view = ComponentView.as_view(template_name="components/base-ui/alerts.html")
|
||||||
|
avatars_view = ComponentView.as_view(template_name="components/base-ui/avatars.html")
|
||||||
|
badges_view = ComponentView.as_view(template_name="components/base-ui/badges.html")
|
||||||
|
breadcrumb_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/breadcrumb.html"
|
||||||
|
)
|
||||||
|
buttons_view = ComponentView.as_view(template_name="components/base-ui/buttons.html")
|
||||||
|
cards_view = ComponentView.as_view(template_name="components/base-ui/cards.html")
|
||||||
|
carousel_view = ComponentView.as_view(template_name="components/base-ui/carousel.html")
|
||||||
|
collapse_view = ComponentView.as_view(template_name="components/base-ui/collapse.html")
|
||||||
|
dropdowns_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/dropdowns.html"
|
||||||
|
)
|
||||||
|
embed_video_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/embed-video.html"
|
||||||
|
)
|
||||||
|
grid_view = ComponentView.as_view(template_name="components/base-ui/grid.html")
|
||||||
|
links_view = ComponentView.as_view(template_name="components/base-ui/links.html")
|
||||||
|
list_group_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/list-group.html"
|
||||||
|
)
|
||||||
|
modals_view = ComponentView.as_view(template_name="components/base-ui/modals.html")
|
||||||
|
notifications_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/notifications.html"
|
||||||
|
)
|
||||||
|
offcanvas_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/offcanvas.html"
|
||||||
|
)
|
||||||
|
placeholders_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/placeholders.html"
|
||||||
|
)
|
||||||
|
pagination_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/pagination.html"
|
||||||
|
)
|
||||||
|
popovers_view = ComponentView.as_view(template_name="components/base-ui/popovers.html")
|
||||||
|
progress_view = ComponentView.as_view(template_name="components/base-ui/progress.html")
|
||||||
|
spinners_view = ComponentView.as_view(template_name="components/base-ui/spinners.html")
|
||||||
|
tabs_view = ComponentView.as_view(template_name="components/base-ui/tabs.html")
|
||||||
|
tooltips_view = ComponentView.as_view(template_name="components/base-ui/tooltips.html")
|
||||||
|
typography_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/typography.html"
|
||||||
|
)
|
||||||
|
utilities_view = ComponentView.as_view(
|
||||||
|
template_name="components/base-ui/utilities.html"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Extended Ui
|
||||||
|
extended_dragula_view = ComponentView.as_view(
|
||||||
|
template_name="components/extended-ui/extended-dragula.html"
|
||||||
|
)
|
||||||
|
extended_range_slider_view = ComponentView.as_view(
|
||||||
|
template_name="components/extended-ui/extended-range-slider.html"
|
||||||
|
)
|
||||||
|
extended_ratings_view = ComponentView.as_view(
|
||||||
|
template_name="components/extended-ui/extended-ratings.html"
|
||||||
|
)
|
||||||
|
extended_scrollbar_view = ComponentView.as_view(
|
||||||
|
template_name="components/extended-ui/extended-scrollbar.html"
|
||||||
|
)
|
||||||
|
extended_scrollspy_view = ComponentView.as_view(
|
||||||
|
template_name="components/extended-ui/extended-scrollspy.html"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Widgets
|
||||||
|
widgets_view = ComponentView.as_view(template_name="components/widgets/widgets.html")
|
||||||
|
|
||||||
|
# Icons
|
||||||
|
icons_remixicons_view = ComponentView.as_view(
|
||||||
|
template_name="components/icons/icons-remixicons.html"
|
||||||
|
)
|
||||||
|
icons_bootstrap_view = ComponentView.as_view(
|
||||||
|
template_name="components/icons/icons-bootstrap.html"
|
||||||
|
)
|
||||||
|
icons_material_view = ComponentView.as_view(
|
||||||
|
template_name="components/icons/icons-material-symbol.html"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Charts
|
||||||
|
# Apex
|
||||||
|
apex_area_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-area.html"
|
||||||
|
)
|
||||||
|
apex_bar_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-bar.html"
|
||||||
|
)
|
||||||
|
apex_bubble_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-bubble.html"
|
||||||
|
)
|
||||||
|
apex_candlestick_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-candlestick.html"
|
||||||
|
)
|
||||||
|
apex_column_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-column.html"
|
||||||
|
)
|
||||||
|
apex_heatmap_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-heatmap.html"
|
||||||
|
)
|
||||||
|
apex_line_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-line.html"
|
||||||
|
)
|
||||||
|
apex_mixed_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-mixed.html"
|
||||||
|
)
|
||||||
|
apex_timeline_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-timeline.html"
|
||||||
|
)
|
||||||
|
apex_boxplot_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-boxplot.html"
|
||||||
|
)
|
||||||
|
apex_treemap_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-treemap.html"
|
||||||
|
)
|
||||||
|
apex_pie_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-pie.html"
|
||||||
|
)
|
||||||
|
apex_radar_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-radar.html"
|
||||||
|
)
|
||||||
|
apex_radialbar_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-radialbar.html"
|
||||||
|
)
|
||||||
|
apex_scatter_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-scatter.html"
|
||||||
|
)
|
||||||
|
apex_polar_area_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-polar-area.html"
|
||||||
|
)
|
||||||
|
apex_sparklines_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/apex-charts/apex-sparklines.html"
|
||||||
|
)
|
||||||
|
# ChartJs
|
||||||
|
chartjs_area_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/chartjs/chartjs-area.html"
|
||||||
|
)
|
||||||
|
chartjs_bar_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/chartjs/chartjs-bar.html"
|
||||||
|
)
|
||||||
|
chartjs_line_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/chartjs/chartjs-line.html"
|
||||||
|
)
|
||||||
|
chartjs_other_view = ComponentView.as_view(
|
||||||
|
template_name="components/charts/chartjs/chartjs-other.html"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Forms
|
||||||
|
form_elements_view = ComponentView.as_view(
|
||||||
|
template_name="components/forms/form-elements.html"
|
||||||
|
)
|
||||||
|
form_advanced_view = ComponentView.as_view(
|
||||||
|
template_name="components/forms/form-advanced.html"
|
||||||
|
)
|
||||||
|
form_validation_view = ComponentView.as_view(
|
||||||
|
template_name="components/forms/form-validation.html"
|
||||||
|
)
|
||||||
|
form_wizard_view = ComponentView.as_view(
|
||||||
|
template_name="components/forms/form-wizard.html"
|
||||||
|
)
|
||||||
|
form_fileuploads_view = ComponentView.as_view(
|
||||||
|
template_name="components/forms/form-fileuploads.html"
|
||||||
|
)
|
||||||
|
form_editors_view = ComponentView.as_view(
|
||||||
|
template_name="components/forms/form-editors.html"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Tables
|
||||||
|
tables_basic_view = ComponentView.as_view(
|
||||||
|
template_name="components/tables/tables-basic.html"
|
||||||
|
)
|
||||||
|
tables_datatable_view = ComponentView.as_view(
|
||||||
|
template_name="components/tables/tables-datatable.html"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Maps
|
||||||
|
google_map_view = ComponentView.as_view(
|
||||||
|
template_name="components/maps/maps-google.html"
|
||||||
|
)
|
||||||
|
vector_map_view = ComponentView.as_view(
|
||||||
|
template_name="components/maps/maps-vector.html"
|
||||||
|
)
|
0
pxy_dashboard/custom/__init__.py
Normal file
3
pxy_dashboard/custom/admin.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
6
pxy_dashboard/custom/apps.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
class CustomConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'pxy_dashboard.custom'
|
||||||
|
|
3
pxy_dashboard/custom/models.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
3
pxy_dashboard/custom/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
34
pxy_dashboard/custom/urls.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from pxy_dashboard.custom.views import pages_profile_view,pages_invoice_view,pages_faq_view,pages_pricing_view,pages_maintenance_view,pages_starter_view,pages_preloader_view,pages_timeline_view,auth_login_view,auth_login2_view,auth_register_view,auth_register2_view,auth_logout_view,auth_logout2_view,auth_recoverpw_view,auth_recoverpw2_view,auth_lock_screen_view,auth_lock_screen2_view,auth_confirm_mail_view,auth_confirm_mail2_view,error_404_view,error_404_alt_view,error_500_view
|
||||||
|
app_name = "custom"
|
||||||
|
urlpatterns = [
|
||||||
|
|
||||||
|
# Pages
|
||||||
|
path("profile", view=pages_profile_view, name="profile"),
|
||||||
|
path("invoice", view=pages_invoice_view, name="invoice"),
|
||||||
|
path("faq", view=pages_faq_view, name="faq"),
|
||||||
|
path("pricing", view=pages_pricing_view, name="pricing"),
|
||||||
|
path("maintenance", view=pages_maintenance_view, name="maintenance"),
|
||||||
|
path("starter-page", view=pages_starter_view, name="starter"),
|
||||||
|
path("preloader", view=pages_preloader_view, name="preloader"),
|
||||||
|
path("timeline", view=pages_timeline_view, name="timeline"),
|
||||||
|
|
||||||
|
# Auth Pages
|
||||||
|
path("login", view=auth_login_view, name="login"),
|
||||||
|
path("login-2", view=auth_login2_view, name="login-2"),
|
||||||
|
path("register", view=auth_register_view, name="register"),
|
||||||
|
path("register-2", view=auth_register2_view, name="register-2"),
|
||||||
|
path("logout", view=auth_logout_view, name="logout"),
|
||||||
|
path("logout-2", view=auth_logout2_view, name="logout-2"),
|
||||||
|
path("recoverpw", view=auth_recoverpw_view, name="recoverpw"),
|
||||||
|
path("recoverpw-2", view=auth_recoverpw2_view, name="recoverpw-2"),
|
||||||
|
path("lock-screen", view=auth_lock_screen_view, name="lock-screen"),
|
||||||
|
path("lock-screen-2", view=auth_lock_screen2_view, name="lock-screen-2"),
|
||||||
|
path("confirm-mail", view=auth_confirm_mail_view, name="confirm-mail"),
|
||||||
|
path("confirm-mail-2", view=auth_confirm_mail2_view, name="confirm-mail-2"),
|
||||||
|
|
||||||
|
# Error Pages
|
||||||
|
path("error-404", view=error_404_view, name="error-404"),
|
||||||
|
path("error-404-alt", view=error_404_alt_view, name="error-404-alt"),
|
||||||
|
path("error-500", view=error_500_view, name="error-500"),
|
||||||
|
]
|
34
pxy_dashboard/custom/views.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
from django.views.generic.base import TemplateView
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
|
||||||
|
class CustomView(LoginRequiredMixin,TemplateView):
|
||||||
|
pass
|
||||||
|
|
||||||
|
#Pages
|
||||||
|
pages_profile_view = CustomView.as_view(template_name="custom/pages/pages-profile.html")
|
||||||
|
pages_invoice_view = CustomView.as_view(template_name="custom/pages/pages-invoice.html")
|
||||||
|
pages_faq_view = CustomView.as_view(template_name="custom/pages/pages-faq.html")
|
||||||
|
pages_pricing_view = CustomView.as_view(template_name="custom/pages/pages-pricing.html")
|
||||||
|
pages_maintenance_view = CustomView.as_view(template_name="custom/pages/pages-maintenance.html")
|
||||||
|
pages_starter_view = CustomView.as_view(template_name="custom/pages/pages-starter.html")
|
||||||
|
pages_preloader_view = CustomView.as_view(template_name="custom/pages/pages-preloader.html")
|
||||||
|
pages_timeline_view = CustomView.as_view(template_name="custom/pages/pages-timeline.html")
|
||||||
|
|
||||||
|
# Auth Pages
|
||||||
|
auth_login_view = CustomView.as_view(template_name="custom/auth-pages/auth-login.html")
|
||||||
|
auth_login2_view = CustomView.as_view(template_name="custom/auth-pages/auth-login-2.html")
|
||||||
|
auth_register_view = CustomView.as_view(template_name="custom/auth-pages/auth-register.html")
|
||||||
|
auth_register2_view = CustomView.as_view(template_name="custom/auth-pages/auth-register-2.html")
|
||||||
|
auth_logout_view = CustomView.as_view(template_name="custom/auth-pages/auth-logout.html")
|
||||||
|
auth_logout2_view = CustomView.as_view(template_name="custom/auth-pages/auth-logout-2.html")
|
||||||
|
auth_recoverpw_view = CustomView.as_view(template_name="custom/auth-pages/auth-recoverpw.html")
|
||||||
|
auth_recoverpw2_view = CustomView.as_view(template_name="custom/auth-pages/auth-recoverpw-2.html")
|
||||||
|
auth_lock_screen_view = CustomView.as_view(template_name="custom/auth-pages/auth-lock-screen.html")
|
||||||
|
auth_lock_screen2_view = CustomView.as_view(template_name="custom/auth-pages/auth-lock-screen-2.html")
|
||||||
|
auth_confirm_mail_view = CustomView.as_view(template_name="custom/auth-pages/auth-confirm-mail.html")
|
||||||
|
auth_confirm_mail2_view = CustomView.as_view(template_name="custom/auth-pages/auth-confirm-mail-2.html")
|
||||||
|
|
||||||
|
# Error Pages
|
||||||
|
error_404_view = CustomView.as_view(template_name="custom/error-pages/error-404.html")
|
||||||
|
error_404_alt_view = CustomView.as_view(template_name="custom/error-pages/error-404-alt.html")
|
||||||
|
error_500_view = CustomView.as_view(template_name="custom/error-pages/error-500.html")
|
0
pxy_dashboard/layouts/__init__.py
Normal file
3
pxy_dashboard/layouts/admin.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
6
pxy_dashboard/layouts/apps.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class LayoutsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'pxy_dashboard.layouts'
|
3
pxy_dashboard/layouts/models.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
3
pxy_dashboard/layouts/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
14
pxy_dashboard/layouts/urls.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from pxy_dashboard.layouts.views import horizontal_view,detached_view,full_view,fullscreen_view,hover_view,compact_view,icon_view
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
|
||||||
|
# Layouts
|
||||||
|
path("horizontal", view=horizontal_view, name="horizontal"),
|
||||||
|
path("detached", view=detached_view, name="detached"),
|
||||||
|
path("full", view=full_view, name="full"),
|
||||||
|
path("fullscreen", view=fullscreen_view, name="fullscreen"),
|
||||||
|
path("hover", view=hover_view, name="hover"),
|
||||||
|
path("compact", view=compact_view, name="compact"),
|
||||||
|
path("icon-view", view=icon_view, name="icon-view"),
|
||||||
|
]
|
14
pxy_dashboard/layouts/views.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from django.views.generic.base import TemplateView
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
|
||||||
|
class LayoutView(LoginRequiredMixin,TemplateView):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Layouts
|
||||||
|
horizontal_view = LayoutView.as_view(template_name="custom/layouts/horizontal.html")
|
||||||
|
detached_view = LayoutView.as_view(template_name="custom/layouts/detached.html")
|
||||||
|
full_view = LayoutView.as_view(template_name="custom/layouts/full.html")
|
||||||
|
fullscreen_view = LayoutView.as_view(template_name="custom/layouts/fullscreen.html")
|
||||||
|
hover_view = LayoutView.as_view(template_name="custom/layouts/hover.html")
|
||||||
|
compact_view = LayoutView.as_view(template_name="custom/layouts/compact.html")
|
||||||
|
icon_view = LayoutView.as_view(template_name="custom/layouts/icon-view.html")
|
0
pxy_dashboard/migrations/__init__.py
Normal file
3
pxy_dashboard/models.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
0
pxy_dashboard/static/__init__.py
Normal file
0
pxy_dashboard/static/dashboard/__init__.py
Normal file
0
pxy_dashboard/static/dashboard/css/__init__.py
Normal file
20266
pxy_dashboard/static/dashboard/css/app-rtl.css
Normal file
6
pxy_dashboard/static/dashboard/css/app-rtl.min.css
vendored
Normal file
1
pxy_dashboard/static/dashboard/css/app-rtl.min.css.map
Normal file
20309
pxy_dashboard/static/dashboard/css/app.css
Normal file
6
pxy_dashboard/static/dashboard/css/app.min.css
vendored
Normal file
1
pxy_dashboard/static/dashboard/css/app.min.css.map
Normal file
17820
pxy_dashboard/static/dashboard/css/icons.css
Normal file
6
pxy_dashboard/static/dashboard/css/icons.min.css
vendored
Normal file
1
pxy_dashboard/static/dashboard/css/icons.min.css.map
Normal file
0
pxy_dashboard/static/dashboard/data/__init__.py
Normal file
116
pxy_dashboard/static/dashboard/data/ajax_demo_children.json
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "node_1",
|
||||||
|
"icon": "ri-folder-line icon-lg text-success",
|
||||||
|
"text": "Node - 1",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "node_4",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 1.1",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_5",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 1.2",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_6",
|
||||||
|
"icon": "ri-folder-line icon-lg text-success",
|
||||||
|
"text": "Node - 1.3",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "node_13",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 1.3.1",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_15",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 1.3.2",
|
||||||
|
"children": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_2",
|
||||||
|
"icon": "ri-folder-line icon-lg text-success",
|
||||||
|
"text": "Node - 2",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "node_7",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 2.1",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_8",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 2.2",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_9",
|
||||||
|
"icon": "ri-folder-line icon-lg text-success",
|
||||||
|
"text": "Node - 2.3",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "node_16",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 2.3.1",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_17",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 2.3.2",
|
||||||
|
"children": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_3",
|
||||||
|
"icon": "ri-folder-line icon-lg text-success",
|
||||||
|
"text": "Node - 3",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "node_10",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 3.1",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_11",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 3.2",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_12",
|
||||||
|
"icon": "ri-folder-line icon-lg text-success",
|
||||||
|
"text": "Node - 3.3",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "node_18",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 3.3.1",
|
||||||
|
"children": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "node_19",
|
||||||
|
"icon": "ri-article-line icon-lg text-warning",
|
||||||
|
"text": "Node - 3.3.2",
|
||||||
|
"children": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
0
pxy_dashboard/static/dashboard/fonts/__init__.py
Normal file
BIN
pxy_dashboard/static/dashboard/fonts/bootstrap-icons.woff
Normal file
BIN
pxy_dashboard/static/dashboard/fonts/bootstrap-icons.woff2
Normal file
BIN
pxy_dashboard/static/dashboard/fonts/remixicon.eot
Normal file
7429
pxy_dashboard/static/dashboard/fonts/remixicon.svg
Normal file
After Width: | Height: | Size: 2.0 MiB |
11
pxy_dashboard/static/dashboard/fonts/remixicon.symbol.svg
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
pxy_dashboard/static/dashboard/fonts/remixicon.ttf
Normal file
BIN
pxy_dashboard/static/dashboard/fonts/remixicon.woff
Normal file
BIN
pxy_dashboard/static/dashboard/fonts/remixicon.woff2
Normal file
0
pxy_dashboard/static/dashboard/images/__init__.py
Normal file
BIN
pxy_dashboard/static/dashboard/images/barcode.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
pxy_dashboard/static/dashboard/images/bg-auth.jpg
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
pxy_dashboard/static/dashboard/images/brands/behance.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
pxy_dashboard/static/dashboard/images/brands/bitbucket.png
Normal file
After Width: | Height: | Size: 701 B |
BIN
pxy_dashboard/static/dashboard/images/brands/dribbble.png
Normal file
After Width: | Height: | Size: 911 B |