Dashboard Ready
20
.drone.yml
@ -1,21 +1,20 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
name: deploy-polisplexity
|
||||
|
||||
clone:
|
||||
depth: 1
|
||||
submodules: true # Ensure submodules like pxy_city_digital_twins are cloned
|
||||
submodules: true
|
||||
|
||||
steps:
|
||||
- name: install dependencies and check Django project
|
||||
- name: install dependencies and run Django checks
|
||||
image: python:3.10
|
||||
environment:
|
||||
DATABASE_URL:
|
||||
from_secret: DATABASE_URL
|
||||
SECRET_KEY:
|
||||
from_secret: SECRET_KEY
|
||||
DEBUG:
|
||||
from_secret: DEBUG
|
||||
DEBUG: "False"
|
||||
NEO4J_URI:
|
||||
from_secret: NEO4J_URI
|
||||
NEO4J_USERNAME:
|
||||
@ -31,10 +30,10 @@ steps:
|
||||
commands:
|
||||
- python -m pip install --upgrade pip
|
||||
- pip install -r requirements.txt
|
||||
- python manage.py check
|
||||
- echo "✅ Django check completed"
|
||||
- python manage.py check --deploy --fail-level WARNING
|
||||
- echo "✅ Django deploy checks passed"
|
||||
|
||||
- name: deploy to production
|
||||
- name: deploy to production server
|
||||
image: appleboy/ssh
|
||||
settings:
|
||||
host:
|
||||
@ -49,4 +48,7 @@ steps:
|
||||
- git pull origin main
|
||||
- docker compose down
|
||||
- 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
|
||||
FROM python:3.10
|
||||
# Etapa base: Python oficial
|
||||
FROM python:3.10-slim as base
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
# Variables de entorno para producción
|
||||
ENV PYTHONDONTWRITEBYTECODE 1
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
|
||||
# Copy application code
|
||||
COPY . .
|
||||
|
||||
# Add before pip install step
|
||||
RUN apt-get update && apt-get install -y \
|
||||
# Instala dependencias del sistema
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
libgeos-dev \
|
||||
libspatialindex-dev \
|
||||
@ -20,11 +18,20 @@ RUN apt-get update && apt-get install -y \
|
||||
python3-dev \
|
||||
&& 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
|
||||
|
||||
# Expose the application port
|
||||
# Copia el resto del proyecto
|
||||
COPY . .
|
||||
|
||||
# Expone el puerto del contenedor
|
||||
EXPOSE 8000
|
||||
|
||||
# Run Gunicorn server
|
||||
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "polisplexity.wsgi:application"]
|
||||
# Comando por defecto para producción con Gunicorn
|
||||
CMD ["gunicorn", "polisplexity.wsgi:application", "--bind", "0.0.0.0:8000", "--workers=3", "--timeout=120"]
|
||||
|
@ -5,12 +5,12 @@ services:
|
||||
image: postgres:15
|
||||
container_name: polisplexity_postgres
|
||||
restart: always
|
||||
ports:
|
||||
- "5434:5432"
|
||||
volumes:
|
||||
- pgdata:/var/lib/postgresql/data
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- "5434:5432"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 10s
|
||||
@ -24,14 +24,20 @@ services:
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- .:/app # Sync local code into container for live reload
|
||||
ports:
|
||||
- "8001:8001"
|
||||
env_file:
|
||||
- .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:
|
||||
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
|
||||
import os
|
||||
import dj_database_url
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
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")
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = os.getenv("DEBUG") == "True"
|
||||
|
||||
DEBUG = os.getenv("DEBUG", "False") == "True"
|
||||
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "").split(",")
|
||||
|
||||
# Application definition
|
||||
@ -38,6 +21,8 @@ INSTALLED_APPS = [
|
||||
"django.contrib.sessions",
|
||||
"django.contrib.messages",
|
||||
"django.contrib.staticfiles",
|
||||
|
||||
# App modules
|
||||
"core",
|
||||
"pxy_de",
|
||||
"pxy_cr",
|
||||
@ -48,6 +33,11 @@ INSTALLED_APPS = [
|
||||
"pxy_meta_pages",
|
||||
"pxy_langchain",
|
||||
"pxy_neo4j",
|
||||
"pxy_dashboard",
|
||||
"pxy_dashboard.custom",
|
||||
"pxy_dashboard.apps",
|
||||
"pxy_dashboard.components",
|
||||
"pxy_dashboard.layouts",
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
@ -80,7 +70,7 @@ TEMPLATES = [
|
||||
|
||||
WSGI_APPLICATION = "polisplexity.wsgi.application"
|
||||
|
||||
# Database Configuration
|
||||
# Database
|
||||
DATABASES = {
|
||||
"default": dj_database_url.config(default=os.getenv("DATABASE_URL"))
|
||||
}
|
||||
@ -99,26 +89,31 @@ TIME_ZONE = "UTC"
|
||||
USE_I18N = True
|
||||
USE_TZ = True
|
||||
|
||||
# Static and Media Files
|
||||
# Static & Media Files
|
||||
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_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_AUTO_FIELD = "django.db.models.BigAutoField"
|
||||
|
||||
# Facebook API Tokens
|
||||
# External services
|
||||
PAGE_ACCESS_TOKEN = os.getenv("PAGE_ACCESS_TOKEN")
|
||||
VERIFY_TOKEN = os.getenv("VERIFY_TOKEN")
|
||||
|
||||
# Async-safe for Neo4j or Celery
|
||||
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
|
||||
|
||||
# Neo4j Database Configuration
|
||||
# Neo4j
|
||||
NEO4J_URI = os.getenv("NEO4J_URI")
|
||||
NEO4J_USERNAME = os.getenv("NEO4J_USERNAME")
|
||||
NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD")
|
||||
|
||||
# OpenAI API Key
|
||||
# OpenAI
|
||||
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
||||
|
@ -25,11 +25,13 @@ admin.site.index_title = "Welcome to Polisplexity City Technologies Portal"
|
||||
|
||||
urlpatterns = [
|
||||
path("admin/", admin.site.urls),
|
||||
path('', include('pxy_dashboard.urls')),
|
||||
path('', include('core.urls')),
|
||||
path('', include('pxy_city_digital_twins.urls')),
|
||||
path('pxy_whatsapp/', include('pxy_whatsapp.urls')),
|
||||
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')),
|
||||
|
||||
]
|
||||
|
||||
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 |