├── .env ├── .gitignore ├── CHANGELOG.md ├── Dockerfile ├── LICENSE.md ├── README.md ├── apps ├── charts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── dyn_api │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── helpers.py │ ├── migrations │ │ └── __init__.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── dyn_dt │ ├── .gitkeep │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── templatetags │ │ ├── __init__.py │ │ └── get_attribute.py │ ├── tests.py │ ├── urls.py │ ├── utils.py │ └── views.py └── pages │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── build.sh ├── cli ├── __init__.py ├── common.py ├── h_ai_claude.py ├── h_code_parser.py ├── h_django.py ├── h_django_common.py ├── h_django_deps.py ├── h_django_env.py ├── h_django_settings.py ├── h_django_urls.py ├── h_files.py ├── h_git.py ├── h_shell.py ├── h_util.py └── migrations │ └── __init__.py ├── config ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── db.sqlite3 ├── docker-compose.yml ├── env.sample ├── gunicorn-cfg.py ├── manage.py ├── media.md ├── nginx └── appseed-app.conf ├── package.json ├── postcss.config.js ├── render.yaml ├── requirements.txt ├── static ├── .gitkeep ├── assets │ └── scss │ │ └── custom.scss └── img │ ├── csv.png │ └── export.png ├── templates ├── accounts │ ├── login.html │ └── register.html ├── charts │ └── index.html ├── dyn_api │ └── index.html ├── dyn_dt │ ├── index.html │ ├── items-table.html │ └── model.html ├── includes │ ├── footer.html │ ├── menu-list.html │ ├── navigation-dark.html │ ├── navigation-light.html │ └── sidebar.html ├── layouts │ ├── auth_base.html │ └── base.html └── pages │ ├── UI │ ├── buttons.html │ ├── general.html │ ├── icons.html │ ├── modals.html │ ├── navbar.html │ ├── ribbons.html │ ├── sliders.html │ └── timeline.html │ ├── calendar.html │ ├── charts │ ├── chartjs.html │ ├── flot.html │ ├── inline.html │ └── uplot.html │ ├── examples │ ├── 404.html │ ├── 500.html │ ├── blank.html │ ├── contact-us.html │ ├── contacts.html │ ├── e-commerce.html │ ├── faq.html │ ├── forgot-password-v2.html │ ├── forgot-password.html │ ├── invoice-print.html │ ├── invoice.html │ ├── language-menu.html │ ├── legacy-user-menu.html │ ├── lockscreen.html │ ├── login-v2.html │ ├── login.html │ ├── pace.html │ ├── profile.html │ ├── project-add.html │ ├── project-detail.html │ ├── project-edit.html │ ├── projects.html │ ├── recover-password-v2.html │ ├── recover-password.html │ ├── register-v2.html │ ├── register.html │ └── starter.html │ ├── forms │ ├── advanced.html │ ├── editors.html │ ├── general.html │ └── validation.html │ ├── gallery.html │ ├── index.html │ ├── index2.html │ ├── index3.html │ ├── kanban.html │ ├── layout │ ├── boxed.html │ ├── collapsed-sidebar.html │ ├── fixed-footer.html │ ├── fixed-sidebar-custom.html │ ├── fixed-sidebar.html │ ├── fixed-topnav.html │ ├── top-nav-sidebar.html │ └── top-nav.html │ ├── mailbox │ ├── compose.html │ ├── mailbox.html │ └── read-mail.html │ ├── search │ ├── enhanced-results.html │ ├── enhanced.html │ ├── iframe.html │ ├── simple-results.html │ └── simple.html │ ├── tables │ ├── data.html │ ├── jsgrid.html │ └── simple.html │ └── widgets.html └── vite.config.js /.env: -------------------------------------------------------------------------------- 1 | DEBUG=True 2 | 3 | SECRET_KEY= 4 | 5 | #DB Credentials (used by Django if set) 6 | #DB_ENGINE= 7 | #DB_HOST= 8 | #DB_PORT= 9 | #DB_USERNAME= 10 | #DB_NAME= 11 | #DB_PASS= 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.DS_Store 3 | *.egg* 4 | /dist/ 5 | /.idea 6 | /docs/_build/ 7 | /node_modules/ 8 | build/ 9 | env 10 | /staticfiles/ 11 | 12 | #src 13 | #*.sqlite* 14 | 15 | #.env 16 | node_modules 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9 2 | 3 | # set environment variables 4 | ENV PYTHONDONTWRITEBYTECODE 1 5 | ENV PYTHONUNBUFFERED 1 6 | 7 | COPY requirements.txt . 8 | # install python dependencies 9 | RUN pip install --upgrade pip 10 | RUN pip install --no-cache-dir -r requirements.txt 11 | 12 | COPY . . 13 | 14 | # running migrations 15 | RUN python manage.py migrate 16 | 17 | # gunicorn 18 | CMD ["gunicorn", "--config", "gunicorn-cfg.py", "config.wsgi"] 19 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright (c) 2019 - present [AppSeed](http://appseed.us/) 4 | 5 |
6 | 7 | ## Licensing Information 8 | 9 |
10 | 11 | | Item | - | 12 | | ---------------------------------- | --- | 13 | | License Type | MIT | 14 | | Use for print | **YES** | 15 | | Create single personal website/app | **YES** | 16 | | Create single website/app for client | **YES** | 17 | | Create multiple website/apps for clients | **YES** | 18 | | Create multiple SaaS applications | **YES** | 19 | | End-product paying users | **YES** | 20 | | Product sale | **YES** | 21 | | Remove footer credits | **YES** | 22 | | --- | --- | 23 | | Remove copyright mentions from source code | NO | 24 | | Production deployment assistance | NO | 25 | | Create HTML/CSS template for sale | NO | 26 | | Create Theme/Template for CMS for sale | NO | 27 | | Separate sale of our UI Elements | NO | 28 | 29 |
30 | 31 | --- 32 | For more information regarding licensing, please contact the AppSeed Service < *support@appseed.us* > 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Django AdminLTE](https://app-generator.dev/product/adminlte/django/) 2 | 3 | **Open-source Django Starter** crafted on top of **[AdminLTE](https://app-generator.dev/product/adminlte/)**, an open-source `Bootstrap` Design. The product is designed to deliver the best possible user experience with highly customizable feature-rich pages. 4 | 5 | - 👉 [Django AdminLTE](https://app-generator.dev/product/adminlte/django/) - `Product Page` 6 | - 👉 [Django AdminLTE](https://django-adminlte.onrender.com/dynamic-dt/product/) - `LIVE Demo` 7 | - 👉 [Django AdminLTE](https://app-generator.dev/docs/products/django/adminlte/index.html) - `Documentation` (learn how to use the product) 8 | 9 |
10 | 11 | ## Features 12 | 13 | - Simple, Easy-to-Extend Codebase 14 | - [AdminLTE](https://app-generator.dev/product/adminlte/) Design Integration 15 | - [Bootstrap](https://app-generator.dev/docs/templates/bootstrap.html) CSS Styling 16 | - Session-based Authentication, Password recovery 17 | - DB Persistence: SQLite (default), can be used with MySql, PgSql 18 | - Apps: 19 | - [DEMO](https://django-adminlte.onrender.com/dynamic-dt/product/) **Dynamic DataTables** - generate server-side datatables without coding 20 | - [DEMO](https://django-adminlte.onrender.com/api/) **Dynamic APIs** - Expose secure APIs without coding 21 | - [DEMO](https://django-adminlte.onrender.com/charts/) **Charts** - powered by ApexCharts 22 | - [Django CLI Package](https://app-generator.dev/docs/developer-tools/django-cli/index.html) 23 | - `Commit/rollback Git Changes` 24 | - `Backup & restore DB` 25 | - `Interact with Django Core` 26 | - `Manage Environment` 27 | - `Manage Dependencies` 28 | - [Deployment](https://app-generator.dev/docs/deployment.html) 29 | - Docker/Docker Compose Scripts 30 | - CI/CD for [Render](https://app-generator.dev/docs/deployment/render/index.html) 31 | 32 |
33 | 34 | ## [Documentation](https://app-generator.dev/docs/products/django/adminlte/index.html) 35 | 36 | - Understand the codebase structure 37 | - Prepare the environment 38 | - Setting Up the Database 39 | - Start the Project 40 | - Switch from SQLite to MySql or PgSql 41 | - Add a new model and migrate database 42 | - Enable `Dynamic Tables` for a new model 43 | - Enable `Dynamic API` for a new model 44 | - Deploy on Render 45 | 46 | ![Django AdminLTE - Open-Source Django Starter ](https://github.com/app-generator/django-adminlte/assets/51070104/8f0c396d-2f33-46b9-9689-2982c987399d) 47 | 48 |
49 | 50 | ## Deploy on `Render` 51 | 52 | [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy) 53 | 54 |
55 | 56 | ## [AdminLTE PRO Version](https://app-generator.dev/product/adminlte-pro/django/) 57 | 58 | > The premium version provides more features, priority on support, and is more often updated - [Live Demo](https://django-adminlte-pro.onrender.com/charts/) 59 | 60 | - Simple, Easy-to-Extend Codebase 61 | - [AdminLTE](https://app-generator.dev/product/adminlte/) Design Integration 62 | - Bootstrap Styling 63 | - DB Persistence: SQLite (default), can be used with MySQL, PostgreSQL 64 | - Extended User Profiles 65 | - Authentication 66 | - Session-based 67 | - OAuth GitHub, Google 68 | - Apps: 69 | - [DEMO](https://django-adminlte-pro.onrender.com/dynamic-dt/product/) **Dynamic DataTables** - generate server-side datatables without coding 70 | - [DEMO](https://django-adminlte-pro.onrender.com/api/) **Dynamic APIs** - Expose secure APIs without coding 71 | - [DEMO](https://django-adminlte-pro.onrender.com/charts/) **Charts** - powered by ApexCharts 72 | - [DEMO](https://django-adminlte-pro.onrender.com/react-charts) **React Integration** 73 | - **Media Files Manager** - empower users to manage and preview files with ease 74 | - **Celery** (async tasks) 75 | - [Django CLI Package](https://app-generator.dev/docs/developer-tools/django-cli/index.html) 76 | - `Commit/rollback Git Changes` 77 | - `Backup & restore DB` 78 | - `Interact with Django Core` 79 | - `Manage Environment` 80 | - `Manage Dependencies` 81 | - [Deployment](https://app-generator.dev/docs/deployment.html) 82 | - Docker/Docker Compose Scripts 83 | - CI/CD for [Render](https://app-generator.dev/docs/deployment/render/index.html) 84 | 85 | ![Django AdminLTE - The premium version: API, Charts, React Intergration, Dynamic DT, and Docker Support.](https://github.com/user-attachments/assets/892dd62b-2127-4a8c-ba44-932999fdddbc) 86 | 87 |
88 | 89 | ## `Customize` with [Django App Generator](https://app-generator.dev/tools/django-generator/) 90 | 91 | - Access the [App Generator](https://app-generator.dev/tools/django-generator/) page 92 | - Select the preferred design 93 | - (Optional) Design Database: edit models and fields 94 | - (Optional) Edit the fields for the extended user model 95 | - (Optional) Enable OAuth for GitHub 96 | - (Optional) Add Celery (async tasks) 97 | - (Optional) Enable Dynamic API Module 98 | - Docker Scripts 99 | - Render CI/Cd Scripts 100 | 101 | **The generated Django project is available as a ZIP Archive and also uploaded to GitHub.** 102 | 103 | ![Django Generator - User Interface for choosing the Design](https://github.com/user-attachments/assets/b989c434-1c53-49ff-8dda-b46dbfc142ac) 104 | 105 | ![Django App Generator - User Interface for Edit the Extended User Model](https://github.com/user-attachments/assets/f1a5fb68-a5ba-49c9-a3ae-91716de09912) 106 | 107 |
108 | 109 | --- 110 | [Django AdminLTE](https://app-generator.dev/product/adminlte/django/) - Open-Source **Django** Starter provided by [App Generator](https://app-generator.dev) 111 | -------------------------------------------------------------------------------- /apps/charts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/charts/__init__.py -------------------------------------------------------------------------------- /apps/charts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/charts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ChartsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'apps.charts' 7 | -------------------------------------------------------------------------------- /apps/charts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/charts/migrations/__init__.py -------------------------------------------------------------------------------- /apps/charts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /apps/charts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/charts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from apps.charts import views 4 | 5 | urlpatterns = [ 6 | path("", views.index, name="charts"), 7 | ] -------------------------------------------------------------------------------- /apps/charts/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.core import serializers 3 | from apps.pages.models import * 4 | 5 | # Create your views here. 6 | 7 | def index(request): 8 | products = serializers.serialize('json', Product.objects.all()) 9 | context = { 10 | 'parent': 'apps', 11 | 'segment': 'charts', 12 | 'products': products 13 | } 14 | return render(request, 'charts/index.html', context) 15 | -------------------------------------------------------------------------------- /apps/dyn_api/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | -------------------------------------------------------------------------------- /apps/dyn_api/admin.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from django.contrib import admin 7 | 8 | # Register your models here. 9 | -------------------------------------------------------------------------------- /apps/dyn_api/apps.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from django.apps import AppConfig 7 | 8 | class DynApiConfig(AppConfig): 9 | default_auto_field = 'django.db.models.BigAutoField' 10 | name = 'apps.dyn_api' 11 | -------------------------------------------------------------------------------- /apps/dyn_api/helpers.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | import datetime, sys, inspect, importlib 7 | 8 | from functools import wraps 9 | 10 | from django.db import models 11 | from django.http import HttpResponseRedirect, HttpResponse 12 | 13 | from rest_framework import serializers 14 | 15 | class Utils: 16 | @staticmethod 17 | def get_class(config, name: str) -> models.Model: 18 | return Utils.model_name_to_class(config[name]) 19 | 20 | @staticmethod 21 | def get_manager(config, name: str) -> models.Manager: 22 | return Utils.get_class(config, name).objects 23 | 24 | @staticmethod 25 | def get_serializer(config, name: str): 26 | class Serializer(serializers.ModelSerializer): 27 | class Meta: 28 | model = Utils.get_class(config, name) 29 | fields = '__all__' 30 | 31 | return Serializer 32 | 33 | @staticmethod 34 | def model_name_to_class(name: str): 35 | 36 | model_name = name.split('.')[-1] 37 | model_import = name.replace('.'+model_name, '') 38 | 39 | module = importlib.import_module(model_import) 40 | cls = getattr(module, model_name) 41 | 42 | return cls 43 | 44 | def check_permission(function): 45 | @wraps(function) 46 | def wrap(viewRequest, *args, **kwargs): 47 | 48 | try: 49 | 50 | # Check user 51 | if viewRequest.request.user.is_authenticated: 52 | 53 | return function(viewRequest, *args, **kwargs) 54 | 55 | # For authentication for guests 56 | return HttpResponseRedirect('/login/') 57 | 58 | except Exception as e: 59 | 60 | # On error 61 | return HttpResponse( 'Error: ' + str( e ) ) 62 | 63 | return wrap 64 | -------------------------------------------------------------------------------- /apps/dyn_api/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/dyn_api/migrations/__init__.py -------------------------------------------------------------------------------- /apps/dyn_api/tests.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from django.test import TestCase 7 | 8 | # Create your tests here. 9 | -------------------------------------------------------------------------------- /apps/dyn_api/urls.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from django.contrib import admin 7 | from django.urls import path 8 | from apps.dyn_api import views 9 | 10 | urlpatterns = [ 11 | path('api/', views.index, name="dynamic_api"), 12 | 13 | path('api//' , views.DynamicAPI.as_view(), name="model_api"), 14 | path('api//' , views.DynamicAPI.as_view()), 15 | path('api///' , views.DynamicAPI.as_view()), 16 | ] 17 | -------------------------------------------------------------------------------- /apps/dyn_api/views.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from django.http import Http404 7 | 8 | from django.contrib.auth.decorators import login_required 9 | from django.utils.decorators import method_decorator 10 | from django.shortcuts import render, redirect, get_object_or_404 11 | 12 | from rest_framework.generics import get_object_or_404 13 | from rest_framework.views import APIView 14 | from rest_framework.response import Response 15 | from django.http import HttpResponse 16 | 17 | from django.conf import settings 18 | 19 | DYNAMIC_API = {} 20 | 21 | try: 22 | DYNAMIC_API = getattr(settings, 'DYNAMIC_API') 23 | except: 24 | pass 25 | 26 | from .helpers import Utils 27 | 28 | def index(request): 29 | 30 | context = { 31 | 'routes' : settings.DYNAMIC_API.keys(), 32 | 'parent': 'apps', 33 | 'segment': 'dynamic_api' 34 | } 35 | 36 | return render(request, 'dyn_api/index.html', context) 37 | 38 | class DynamicAPI(APIView): 39 | 40 | # READ : GET api/model/id or api/model 41 | def get(self, request, **kwargs): 42 | 43 | model_id = kwargs.get('id', None) 44 | try: 45 | if model_id is not None: 46 | 47 | # Validate for integer 48 | try: 49 | model_id = int(model_id) 50 | 51 | if model_id < 0: 52 | raise ValueError('Expect positive int') 53 | 54 | except ValueError as e: 55 | return Response(data={ 56 | 'message': 'Input Error = ' + str(e), 57 | 'success': False 58 | }, status=400) 59 | 60 | thing = get_object_or_404(Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')), id=model_id) 61 | model_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))(instance=thing) 62 | output = model_serializer.data 63 | else: 64 | all_things = Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')).all() 65 | thing_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name')) 66 | output = [] 67 | for thing in all_things: 68 | output.append(thing_serializer(instance=thing).data) 69 | except KeyError: 70 | return Response(data={ 71 | 'message': 'this model is not activated or not exist.', 72 | 'success': False 73 | }, status=400) 74 | except Http404: 75 | return Response(data={ 76 | 'message': 'object with given id not found.', 77 | 'success': False 78 | }, status=404) 79 | return Response(data={ 80 | 'data': output, 81 | 'success': True 82 | }, status=200) 83 | 84 | # CREATE : POST api/model/ 85 | #@check_permission 86 | def post(self, request, **kwargs): 87 | try: 88 | model_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))(data=request.data) 89 | if model_serializer.is_valid(): 90 | model_serializer.save() 91 | else: 92 | return Response(data={ 93 | **model_serializer.errors, 94 | 'success': False 95 | }, status=400) 96 | except KeyError: 97 | return Response(data={ 98 | 'message': 'this model is not activated or not exist.', 99 | 'success': False 100 | }, status=400) 101 | return Response(data={ 102 | 'message': 'Record Created.', 103 | 'success': True 104 | }, status=200) 105 | 106 | # UPDATE : PUT api/model/id/ 107 | #@check_permission 108 | def put(self, request, **kwargs): 109 | try: 110 | thing = get_object_or_404(Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')), id=kwargs.get('id')) 111 | model_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))(instance=thing, 112 | data=request.data, 113 | partial=True) 114 | if model_serializer.is_valid(): 115 | model_serializer.save() 116 | else: 117 | return Response(data={ 118 | **model_serializer.errors, 119 | 'success': False 120 | }, status=400) 121 | except KeyError: 122 | return Response(data={ 123 | 'message': 'this model is not activated or not exist.', 124 | 'success': False 125 | }, status=400) 126 | except Http404: 127 | return Response(data={ 128 | 'message': 'object with given id not found.', 129 | 'success': False 130 | }, status=404) 131 | return Response(data={ 132 | 'message': 'Record Updated.', 133 | 'success': True 134 | }, status=200) 135 | 136 | # DELETE : DELETE api/model/id/ 137 | #@check_permission 138 | def delete(self, request, **kwargs): 139 | try: 140 | model_manager = Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')) 141 | to_delete_id = kwargs.get('id') 142 | model_manager.get(id=to_delete_id).delete() 143 | except KeyError: 144 | return Response(data={ 145 | 'message': 'this model is not activated or not exist.', 146 | 'success': False 147 | }, status=400) 148 | except Utils.get_class(DYNAMIC_API, kwargs.get('model_name')).DoesNotExist as e: 149 | return Response(data={ 150 | 'message': 'object with given id not found.', 151 | 'success': False 152 | }, status=404) 153 | return Response(data={ 154 | 'message': 'Record Deleted.', 155 | 'success': True 156 | }, status=200) 157 | -------------------------------------------------------------------------------- /apps/dyn_dt/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/dyn_dt/.gitkeep -------------------------------------------------------------------------------- /apps/dyn_dt/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/dyn_dt/__init__.py -------------------------------------------------------------------------------- /apps/dyn_dt/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | 4 | # Register your models here. 5 | 6 | admin.site.register(PageItems) 7 | admin.site.register(HideShowFilter) 8 | admin.site.register(ModelFilter) 9 | -------------------------------------------------------------------------------- /apps/dyn_dt/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | class DynDtConfig(AppConfig): 4 | default_auto_field = 'django.db.models.BigAutoField' 5 | name = 'apps.dyn_dt' 6 | -------------------------------------------------------------------------------- /apps/dyn_dt/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | # Create your forms here. 4 | -------------------------------------------------------------------------------- /apps/dyn_dt/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.9 on 2025-03-30 11:44 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name="HideShowFilter", 15 | fields=[ 16 | ( 17 | "id", 18 | models.BigAutoField( 19 | auto_created=True, 20 | primary_key=True, 21 | serialize=False, 22 | verbose_name="ID", 23 | ), 24 | ), 25 | ("parent", models.CharField(blank=True, max_length=255, null=True)), 26 | ("key", models.CharField(max_length=255)), 27 | ("value", models.BooleanField(default=False)), 28 | ], 29 | ), 30 | migrations.CreateModel( 31 | name="ModelFilter", 32 | fields=[ 33 | ( 34 | "id", 35 | models.BigAutoField( 36 | auto_created=True, 37 | primary_key=True, 38 | serialize=False, 39 | verbose_name="ID", 40 | ), 41 | ), 42 | ("parent", models.CharField(blank=True, max_length=255, null=True)), 43 | ("key", models.CharField(max_length=255)), 44 | ("value", models.CharField(max_length=255)), 45 | ], 46 | ), 47 | migrations.CreateModel( 48 | name="PageItems", 49 | fields=[ 50 | ( 51 | "id", 52 | models.BigAutoField( 53 | auto_created=True, 54 | primary_key=True, 55 | serialize=False, 56 | verbose_name="ID", 57 | ), 58 | ), 59 | ("parent", models.CharField(blank=True, max_length=255, null=True)), 60 | ("items_per_page", models.IntegerField(default=25)), 61 | ], 62 | ), 63 | ] 64 | -------------------------------------------------------------------------------- /apps/dyn_dt/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/dyn_dt/migrations/__init__.py -------------------------------------------------------------------------------- /apps/dyn_dt/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | # Create your models here. 5 | 6 | class PageItems(models.Model): 7 | parent = models.CharField(max_length=255, null=True, blank=True) 8 | items_per_page = models.IntegerField(default=25) 9 | 10 | class HideShowFilter(models.Model): 11 | parent = models.CharField(max_length=255, null=True, blank=True) 12 | key = models.CharField(max_length=255) 13 | value = models.BooleanField(default=False) 14 | 15 | def __str__(self): 16 | return self.key 17 | 18 | class ModelFilter(models.Model): 19 | parent = models.CharField(max_length=255, null=True, blank=True) 20 | key = models.CharField(max_length=255) 21 | value = models.CharField(max_length=255) 22 | 23 | def __str__(self): 24 | return self.key -------------------------------------------------------------------------------- /apps/dyn_dt/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/dyn_dt/templatetags/__init__.py -------------------------------------------------------------------------------- /apps/dyn_dt/templatetags/get_attribute.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from datetime import datetime 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.filter(name="getattribute") 8 | def getattribute(value, arg): 9 | try: 10 | attr_value = getattr(value, arg) 11 | 12 | if isinstance(attr_value, datetime): 13 | return attr_value.strftime("%Y-%m-%d %H:%M:%S") 14 | 15 | return attr_value 16 | except: 17 | return '' 18 | 19 | 20 | @register.filter 21 | def get(dict_data, key): 22 | return dict_data.get(key, []) -------------------------------------------------------------------------------- /apps/dyn_dt/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/dyn_dt/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from apps.dyn_dt import views 3 | 4 | urlpatterns = [ 5 | path('dynamic-dt/', views.index, name="dynamic_dt"), 6 | 7 | path('create-filter//', views.create_filter, name="create_filter"), 8 | path('create-page-items//', views.create_page_items, name="create_page_items"), 9 | path('create-hide-show-items//', views.create_hide_show_filter, name="create_hide_show_filter"), 10 | path('delete-filter///', views.delete_filter, name="delete_filter"), 11 | path('create//', views.create, name="create"), 12 | path('delete///', views.delete, name="delete"), 13 | path('update///', views.update, name="update"), 14 | 15 | path('export-csv//', views.ExportCSVView.as_view(), name='export_csv'), 16 | 17 | path('dynamic-dt//', views.model_dt, name="model_dt"), 18 | ] 19 | -------------------------------------------------------------------------------- /apps/dyn_dt/utils.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Q 2 | 3 | def user_filter(request, queryset, fields, fk_fields=[]): 4 | value = request.GET.get('search') 5 | 6 | if value: 7 | dynamic_q = Q() 8 | for field in fields: 9 | if field not in fk_fields: 10 | dynamic_q |= Q(**{f'{field}__icontains': value}) 11 | return queryset.filter(dynamic_q) 12 | 13 | return queryset -------------------------------------------------------------------------------- /apps/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/pages/__init__.py -------------------------------------------------------------------------------- /apps/pages/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/pages/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PagesConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "apps.pages" 7 | -------------------------------------------------------------------------------- /apps/pages/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.9 on 2025-04-19 11:28 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Product', 16 | fields=[ 17 | ('id', models.AutoField(primary_key=True, serialize=False)), 18 | ('name', models.CharField(max_length=100)), 19 | ('info', models.CharField(default='', max_length=100)), 20 | ('price', models.IntegerField(blank=True, null=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /apps/pages/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/apps/pages/migrations/__init__.py -------------------------------------------------------------------------------- /apps/pages/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | 5 | class Product(models.Model): 6 | id = models.AutoField(primary_key=True) 7 | name = models.CharField(max_length = 100) 8 | info = models.CharField(max_length = 100, default = '') 9 | price = models.IntegerField(blank=True, null=True) 10 | 11 | def __str__(self): 12 | return self.name 13 | -------------------------------------------------------------------------------- /apps/pages/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/pages/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('', views.index, name='index'), 7 | ] 8 | -------------------------------------------------------------------------------- /apps/pages/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import HttpResponse 3 | 4 | # Create your views here. 5 | 6 | def index(request): 7 | 8 | # Page from the theme 9 | return render(request, 'pages/index.html') 10 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # exit on error 3 | set -o errexit 4 | 5 | python -m pip install --upgrade pip 6 | 7 | pip install -r requirements.txt 8 | 9 | python manage.py collectstatic --no-input 10 | 11 | python manage.py makemigrations 12 | python manage.py migrate 13 | -------------------------------------------------------------------------------- /cli/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | from .common import * 7 | from .h_shell import * 8 | from .h_code_parser import * 9 | from .h_git import * 10 | from .h_util import * 11 | from .h_files import * 12 | from .h_django import * 13 | from .h_django_common import * 14 | from .h_django_deps import * 15 | from .h_django_env import * 16 | from .h_django_urls import * 17 | from .h_django_settings import * 18 | from .h_ai_claude import * 19 | 20 | -------------------------------------------------------------------------------- /cli/common.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | import os, subprocess 7 | from pprint import pp 8 | 9 | # DJANGO Globals 10 | DJANGO_APPS = None 11 | 12 | # Globals 13 | DIR_ROOT = '.' # points to the root 14 | DIR_TMPL = os.path.join( DIR_ROOT, 'templates' ) 15 | DIR_STATIC = os.path.join( DIR_ROOT, 'static' ) 16 | 17 | DIR_DJ_CONFIG = 'config' 18 | DIR_DJ_APP_DEFAULT = 'home' 19 | 20 | FILE_DJ_MANAGE_s = 'manage.py' 21 | FILE_DJ_ENV_s = '.env' 22 | FILE_DJ_DEPS_s = 'requirements.txt' 23 | FILE_DJ_URLS_s = os.path.join( DIR_DJ_CONFIG , 'urls.py' ) 24 | FILE_DJ_SETTINGS_s = os.path.join( DIR_DJ_CONFIG , 'settings.py' ) 25 | FILE_DJ_INIT_s = os.path.join( DIR_DJ_CONFIG , '__init__.py' ) 26 | FILE_DJ_MODELS_s = os.path.join( DIR_DJ_APP_DEFAULT , 'models.py' ) 27 | 28 | FILE_CI_BUILD_s = 'build.sh' 29 | FILE_CI_RENDER_s = 'render.yaml' 30 | FILE_DOCKER_s = 'Dockerfile' 31 | FILE_README_s = 'README.md' 32 | 33 | class COMMON: 34 | 35 | NULL = None # not set 36 | NA = -1 # not set 37 | OK = 0 # All good (unix style) 38 | ERR = 1 # Err bumped (unix style) 39 | NOT_FOUND = 2 # file or directory not found 40 | INPUT_ERR = 3 # file or directory not found 41 | PROCESSED = 4 42 | 43 | POS_FIRST = 'FIRST' 44 | POS_END = 'END' 45 | 46 | CHART_VERBS = ['sum', 'count', 'avg', 'min', 'max'] 47 | CHART_VERB_SUM = 'sum' 48 | CHART_VERB_COUNT = 'count' 49 | CHART_VERB_AVG = 'avg' 50 | CHART_VERB_MIN = 'min' 51 | CHART_VERB_MAX = 'max' 52 | 53 | ROWS_MAX = 9999 54 | CSV_SEP = ',' 55 | 56 | # Settings vars typologies 57 | CFG_VAR_NA = 10 # Type is undetected 58 | CFG_VAR_SIMPLE = 11 # Ex: SECRET_KEY 59 | CFG_VAR_LIST = 12 # Ex: INSTALLED_APPS, MIDDLEWARE 60 | CFG_VAR_DICT = 13 # List of Dicts, Ex: AUTH_PASSWORD_VALIDATORS 61 | 62 | TAB = ' ' 63 | TAB2 = TAB + TAB 64 | TAB3 = TAB2 + TAB 65 | 66 | TYPE_STRING = 'string' 67 | TYPE_STRING_DJ = 'models.CharField' 68 | 69 | TYPE_TEXT = 'text' 70 | TYPE_TEXT_DJ = 'models.TextField' 71 | 72 | TYPE_INT = 'int' 73 | TYPE_INT_DJ = 'models.IntegerField' 74 | 75 | TYPE_INTEGER = 'integer' 76 | TYPE_INTINTEGER_DJ = 'models.IntegerField' 77 | 78 | TYPE_NUMBER = 'number' 79 | TYPE_NUMBER_DJ = 'models.IntegerField' 80 | 81 | TYPE_FLOAT = 'float' 82 | TYPE_FLOAT_DJ = 'models.FloatField' 83 | 84 | TYPE_DATE = 'date' 85 | TYPE_DATE_DJ = 'models.DateTimeField' 86 | 87 | TYPE_TIME = 'date' 88 | TYPE_TIME_DJ = 'models.DateTimeField' 89 | 90 | # Recover errors for COMMON class 91 | def errInfo( aErrorCode ): 92 | 93 | if COMMON.NA == aErrorCode: return 'Not Set' 94 | if COMMON.ERR == aErrorCode: return 'Error Generic' 95 | if COMMON.OK == aErrorCode: return 'OK' 96 | if COMMON.NOT_FOUND == aErrorCode: return 'Not Found' 97 | if COMMON.INPUT_ERR == aErrorCode: return 'Input error' 98 | 99 | return str( aErrorCode ) 100 | 101 | def commonTxt( aCode ): 102 | 103 | if COMMON.CFG_VAR_NA == aCode: return 'CFG Var unknown typology' 104 | if COMMON.CFG_VAR_SIMPLE == aCode: return 'CFG Var SIMPLE' 105 | if COMMON.CFG_VAR_LIST == aCode: return 'CFG Var LIST' 106 | if COMMON.CFG_VAR_MIXED == aCode: return 'CFG Var MIXT (list of dicts)' 107 | 108 | return str( aCode ) 109 | 110 | class DbField: 111 | CHAR_FIELD = "models.CharField" 112 | TEXT_FIELD = "models.TextField" 113 | INTEGER_FIELD = "models.IntegerField" 114 | BOOLEAN_FIELD = "models.BooleanField" 115 | DATE_FIELD = "models.DateTimeField" 116 | FLOAT_FIELD = "models.FloatField" 117 | BOOL_FIELD = "models.BooleanField" 118 | FK_FIELD = "models.ForeignKey" 119 | NA = None 120 | 121 | def str_to_db_type( aStr ): 122 | if not aStr: 123 | return None 124 | 125 | # input normalization 126 | aStr = aStr.lower().replace(' ', '') 127 | 128 | if 'int' == aStr: return DbField.INTEGER_FIELD 129 | if 'integer' == aStr: return DbField.INTEGER_FIELD 130 | if 'num' == aStr: return DbField.INTEGER_FIELD 131 | if 'number' == aStr: return DbField.INTEGER_FIELD 132 | 133 | if 'str' == aStr: return DbField.CHAR_FIELD 134 | if 'string' == aStr: return DbField.CHAR_FIELD 135 | 136 | if 'text' == aStr: return DbField.TEXT_FIELD 137 | 138 | if 'float' == aStr: return DbField.FLOAT_FIELD 139 | 140 | if 'date' == aStr: return DbField.DATE_FIELD 141 | if 'time' == aStr: return DbField.DATE_FIELD 142 | 143 | if 'bool' == aStr: return DbField.BOOL_FIELD 144 | 145 | return DbField.NA 146 | 147 | # Pandas to Django Type Mapping 148 | django_fields = { 149 | 'int' : 'models.IntegerField(blank=True, null=True)', 150 | 'integer' : 'models.IntegerField(blank=True, null=True)', 151 | 'string' : "models.TextField(blank=True, null=True)", 152 | 'string_unique' : "models.TextField(blank=True, null=False, unique=True)", 153 | 'object' : "models.TextField(blank=True, null=True)", 154 | 'object_unique' : "models.TextField(blank=True, null=False, unique=True)", 155 | 'int64' : 'models.IntegerField(blank=True, null=True)', 156 | 'float64' : 'models.FloatField(blank=True, null=True)', 157 | 'bool' : 'models.BooleanField(null=True)', 158 | } 159 | 160 | def exec_process(aCmd): 161 | try: 162 | return os.system( aCmd ) 163 | except Exception as e: 164 | print(' > ERR: ' + str(e) ) 165 | return -1 166 | 167 | def exec_subprocess( full_cmd ): 168 | 169 | retcode = COMMON.OK 170 | stdout = '' 171 | stderr = '' 172 | 173 | try: 174 | 175 | # create project in src 176 | result = subprocess.run( full_cmd.split(' ')) 177 | 178 | retcode = result.check_returncode() 179 | 180 | except Exception as e: 181 | 182 | retcode = COMMON.ERR 183 | 184 | return retcode 185 | 186 | def h_del_lsep( line ): 187 | 188 | if line: 189 | line = line.replace('\n', '').replace('\r', '') 190 | 191 | return line 192 | 193 | def remove_prefix(text, prefix): 194 | if text.startswith(prefix): 195 | return text[len(prefix):] 196 | return text 197 | 198 | -------------------------------------------------------------------------------- /cli/h_django_deps.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | from .common import * 7 | from .h_files import * 8 | from .h_util import * 9 | 10 | def deps_list( ): 11 | 12 | # Use project prefix 13 | FILE_DJ_DEPS = os.path.join( DIR_ROOT, FILE_DJ_DEPS_s ) 14 | 15 | # Check app exists 16 | requirements = file_load( FILE_DJ_DEPS, True ) 17 | 18 | # Check app exists 19 | if not requirements: 20 | print('ERR: ' + FILE_DJ_DEPS+ ' not found') 21 | return None 22 | 23 | print( '> Dependencies:' ) 24 | for line in requirements: 25 | if '#' not in line: 26 | print( ' |-- ' + line ) 27 | 28 | def deps_add( aModule, aVersion=None): 29 | 30 | # Use project prefix 31 | FILE_DJ_DEPS = os.path.join( DIR_ROOT, FILE_DJ_DEPS_s ) 32 | 33 | # Check app exists 34 | requirements = file_load( FILE_DJ_DEPS, True ) 35 | 36 | # Check app exists 37 | if not requirements: 38 | print('ERR: ' + FILE_DJ_DEPS+ ' not found') 39 | return None 40 | 41 | aModule = aModule.lower() 42 | found = False 43 | 44 | requirements_p = [] 45 | for line in requirements: 46 | line = line.lower() 47 | 48 | # module laready there, update version 49 | if aModule == line or ((aModule +'==') in line): 50 | 51 | found = True 52 | if aVersion: 53 | line = aModule + '==' + aVersion 54 | else: 55 | line = aModule 56 | 57 | requirements_p.append( line ) 58 | 59 | if not found: 60 | if aVersion: 61 | aModule += '==' + aVersion 62 | 63 | requirements_p.append( aModule ) 64 | 65 | file_write( FILE_DJ_DEPS, requirements_p) 66 | 67 | def deps_delete( aModule ): 68 | 69 | # Use project prefix 70 | FILE_DJ_DEPS = os.path.join( DIR_ROOT, FILE_DJ_DEPS_s ) 71 | 72 | # Check app exists 73 | requirements = file_load( FILE_DJ_DEPS, True ) 74 | 75 | # Check app exists 76 | if not requirements: 77 | print('ERR: ' + FILE_DJ_DEPS+ ' not found') 78 | return None 79 | 80 | aModule = aModule.lower() 81 | 82 | requirements_p = [] 83 | for line in requirements: 84 | line = line.lower() 85 | 86 | # module laready there, update version 87 | if aModule == line or ((aModule +'==') in line): 88 | pass 89 | else: 90 | requirements_p.append( line ) 91 | 92 | file_write( FILE_DJ_DEPS, requirements_p) 93 | -------------------------------------------------------------------------------- /cli/h_django_env.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | from .common import * 7 | from .h_files import * 8 | from .h_util import * 9 | 10 | def env_check( ): 11 | 12 | # Use project prefix 13 | FILE_DJ_ENV = os.path.join( DIR_ROOT, FILE_DJ_ENV_s ) 14 | 15 | # Check app exists 16 | if not file_exists( FILE_DJ_ENV ): 17 | content = '# GENERATED' + '\n' 18 | file_create(FILE_DJ_ENV, content) 19 | 20 | return 21 | 22 | def env_list( ): 23 | 24 | # Use project prefix 25 | FILE_DJ_ENV = os.path.join( DIR_ROOT, FILE_DJ_ENV_s ) 26 | 27 | env_check( ) 28 | 29 | # Check app exists 30 | env = file_load( FILE_DJ_ENV, True ) 31 | 32 | # Check app exists 33 | if not env: 34 | print('ERR: ' + FILE_DJ_ENV+ ' not found') 35 | return None 36 | 37 | print( '> ENVIRONMENT:' ) 38 | for line in env: 39 | if '#' not in line: 40 | print( ' |-- ' + line ) 41 | 42 | def env_add( aEnvVar, aValue): 43 | 44 | # Use project prefix 45 | FILE_DJ_ENV = os.path.join( DIR_ROOT, FILE_DJ_ENV_s ) 46 | 47 | env_check( ) 48 | 49 | # Check app exists 50 | env = file_load( FILE_DJ_ENV, True ) 51 | 52 | # Check app exists 53 | if not env: 54 | print('ERR: ' + FILE_DJ_ENV+ ' not found') 55 | return None 56 | 57 | found = False 58 | 59 | aValue_c = aValue 60 | if aValue_c.lower() == 'random': 61 | aValue = h_random() 62 | 63 | env_p = [] 64 | for line in env: 65 | 66 | # module laready there, update version 67 | if (aEnvVar +'=') in line: 68 | found = True 69 | line = aEnvVar + '=' + aValue 70 | 71 | env_p.append( line ) 72 | 73 | if not found: 74 | aEnvVar += '=' + aValue 75 | 76 | env_p.append( aEnvVar ) 77 | 78 | file_write( FILE_DJ_ENV, env_p) 79 | 80 | def env_delete( aEnvVar ): 81 | 82 | # Use project prefix 83 | FILE_DJ_ENV = os.path.join( DIR_ROOT, FILE_DJ_ENV_s ) 84 | 85 | # Check app exists 86 | env = file_load( FILE_DJ_ENV, True ) 87 | 88 | # Check app exists 89 | if not env: 90 | return 91 | 92 | env_p = [] 93 | for line in env: 94 | 95 | # module laready there, update version 96 | if not (aEnvVar +'=') in line: 97 | env_p.append( line ) 98 | 99 | file_write( FILE_DJ_ENV, env_p) 100 | 101 | def env_comment( aEnvVar ): 102 | 103 | # Use project prefix 104 | FILE_DJ_ENV = os.path.join( DIR_ROOT, FILE_DJ_ENV_s ) 105 | 106 | # Check app exists 107 | env = file_load( FILE_DJ_ENV, True ) 108 | 109 | # Check app exists 110 | if not env: 111 | return 112 | 113 | found = False 114 | 115 | env_p = [] 116 | for line in env: 117 | 118 | # module laready there, update version 119 | if line.startswith( aEnvVar + '='): 120 | found = True 121 | line = '#' + line 122 | 123 | env_p.append( line ) 124 | 125 | file_write( FILE_DJ_ENV, env_p) 126 | 127 | def env_uncomment( aEnvVar ): 128 | 129 | # Use project prefix 130 | FILE_DJ_ENV = os.path.join( DIR_ROOT, FILE_DJ_ENV_s ) 131 | 132 | # Check app exists 133 | env = file_load( FILE_DJ_ENV, True ) 134 | 135 | # Check app exists 136 | if not env: 137 | return 138 | 139 | found = False 140 | 141 | env_p = [] 142 | for line in env: 143 | 144 | # module laready there, update version 145 | if line.startswith( '#' + aEnvVar + '='): 146 | found = True 147 | line = line[1:] 148 | 149 | env_p.append( line ) 150 | 151 | file_write( FILE_DJ_ENV, env_p) 152 | -------------------------------------------------------------------------------- /cli/h_django_settings.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | from .common import * 7 | from .h_files import * 8 | from .h_util import * 9 | from .h_django_common import * 10 | 11 | def settings_load( ): 12 | 13 | # Use project prefix 14 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 15 | 16 | return cfg_load( FILE_DJ_SETTINGS ) 17 | 18 | def settings_imports( ): 19 | 20 | # Use project prefix 21 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 22 | 23 | return cfg_imports( FILE_DJ_SETTINGS ) 24 | 25 | def settings_sections( ): 26 | 27 | # Use project prefix 28 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 29 | 30 | return cfg_sections( FILE_DJ_SETTINGS ) 31 | 32 | def settings_var_upd( aVarName, aVarValue): 33 | 34 | # Use project prefix 35 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 36 | 37 | return cfg_var_upd( FILE_DJ_SETTINGS, aVarName, aVarValue ) 38 | 39 | def settings_var_upd_bool( aVarName, aVarValue): 40 | 41 | # Use project prefix 42 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 43 | 44 | return cfg_var_upd( FILE_DJ_SETTINGS, aVarName, aVarValue, True ) 45 | 46 | def settings_var_print( aVarName ): 47 | 48 | # Use project prefix 49 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 50 | 51 | return cfg_var_print( FILE_DJ_SETTINGS, aVarName ) 52 | 53 | def settings_section_get( aSectionName ): 54 | 55 | # Use project prefix 56 | FILE_DJ_SETTINGS = os.path.join( FILE_DJ_SETTINGS_s ) 57 | 58 | return cfg_section_get( FILE_DJ_SETTINGS, aSectionName ) 59 | 60 | def settings_section_update( aSectionName, aSectionContent ): 61 | 62 | # Use project prefix 63 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 64 | 65 | return cfg_section_update( FILE_DJ_SETTINGS, aSectionName, aSectionContent) 66 | 67 | def settings_apps_list( ): 68 | 69 | # Use project prefix 70 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 71 | 72 | return cfg_section_list( FILE_DJ_SETTINGS, 'INSTALLED_APPS') 73 | 74 | def settings_apps_add( aNewApp, aPos=COMMON.POS_END ): 75 | 76 | # Use project prefix 77 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 78 | 79 | if COMMON.POS_END == aPos: 80 | cfg_section_add_item( FILE_DJ_SETTINGS, 'INSTALLED_APPS', aNewApp ) 81 | else: 82 | cfg_section_add_item_first( FILE_DJ_SETTINGS, 'INSTALLED_APPS', aNewApp ) 83 | 84 | def settings_middleware_add( aNewApp, aPos=COMMON.POS_END ): 85 | 86 | # Use project prefix 87 | FILE_DJ_SETTINGS = os.path.join( DIR_ROOT, FILE_DJ_SETTINGS_s ) 88 | 89 | if COMMON.POS_END == aPos: 90 | cfg_section_add_item( FILE_DJ_SETTINGS, 'MIDDLEWARE', aNewApp ) 91 | else: 92 | cfg_section_add_item_first( FILE_DJ_SETTINGS, 'MIDDLEWARE', aNewApp ) 93 | 94 | def settings_dyn_get(aSectionName): 95 | 96 | ret, cfg_dyn_l = settings_section_get( aSectionName ) 97 | 98 | if COMMON.OK != ret: 99 | print(' > ERR getting section: ' + aSectionName ) 100 | return ret, None 101 | 102 | # here we store the values 103 | rules = {} 104 | 105 | # cut head, tail 106 | rules_l = cfg_dyn_l[1:len(cfg_dyn_l)-1] 107 | 108 | for line in rules_l: 109 | key = line.split(':')[0].replace("'", '').replace('"', '').replace(',', '').replace(' ', '') 110 | val = line.split(':')[1].replace("'", '').replace('"', '').replace(',', '').replace(' ', '') 111 | rules[key] = val 112 | 113 | return COMMON.OK, rules 114 | 115 | def settings_dyn_set(aSectionName, aDict): 116 | 117 | aDictContent = aSectionName + ' = {' + os.linesep 118 | for k in aDict.keys(): 119 | aDictContent += COMMON.TAB + f"'{k}' : '{aDict[k]}'," + os.linesep 120 | 121 | aDictContent += '}' 122 | 123 | return settings_section_update( aSectionName, aDictContent ) 124 | 125 | def settings_dyn_add(aSectionName, aKey, aVal): 126 | 127 | ret, aDict = settings_dyn_get(aSectionName) 128 | if COMMON.OK != ret: 129 | return ret, None 130 | 131 | aDict[aKey] = aVal 132 | 133 | pp( aDict ) 134 | 135 | return settings_dyn_set(aSectionName, aDict) 136 | 137 | def settings_dyn_del(aSectionName, aKey): 138 | 139 | ret, aDict = settings_dyn_get(aSectionName) 140 | if COMMON.OK != ret: 141 | return None 142 | 143 | if aKey in aDict: 144 | del aDict[ aKey ] 145 | 146 | return settings_dyn_set(aSectionName, aDict) 147 | -------------------------------------------------------------------------------- /cli/h_django_urls.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | from .common import * 7 | from .h_files import * 8 | from .h_util import * 9 | from .h_django_common import * 10 | 11 | def urls_load( ): 12 | 13 | # Use project prefix 14 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 15 | 16 | return cfg_load( FILE_DJ_URLS ) 17 | 18 | def urls_imports( ): 19 | 20 | # Use project prefix 21 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 22 | 23 | return cfg_imports( FILE_DJ_URLS ) 24 | 25 | def urls_sections( ): 26 | 27 | # Use project prefix 28 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 29 | 30 | return cfg_sections( FILE_DJ_URLS ) 31 | 32 | def urls_save( content ): 33 | 34 | # Use project prefix 35 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 36 | 37 | return cfg_save( FILE_DJ_URLS, content ) 38 | 39 | def urls_format( ): 40 | 41 | # Use project prefix 42 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 43 | 44 | return cfg_format( FILE_DJ_URLS ) 45 | 46 | def urls_section_get( ): 47 | 48 | # Use project prefix 49 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 50 | 51 | return cfg_section_get( FILE_DJ_URLS, 'urlpatterns' ) 52 | 53 | def urls_list( ): 54 | 55 | # Use project prefix 56 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 57 | 58 | return cfg_section_list( FILE_DJ_URLS, 'urlpatterns' ) 59 | 60 | def urls_add_rule( aNewValue ): 61 | 62 | # Use project prefix 63 | FILE_DJ_URLS = os.path.join( DIR_ROOT, FILE_DJ_URLS_s ) 64 | 65 | return cfg_section_add_item( FILE_DJ_URLS, 'urlpatterns', aNewValue, True ) 66 | -------------------------------------------------------------------------------- /cli/h_files.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) AppSeed.us 4 | """ 5 | 6 | import os, fnmatch, shutil, json 7 | 8 | from .common import * 9 | from .h_util import * 10 | 11 | def dir_create(dir_path): 12 | try: 13 | if not os.path.exists(dir_path): 14 | os.mkdir(dir_path) 15 | except Exception as e: 16 | raise e 17 | 18 | def dir_exists ( aPath ): 19 | return os.path.isdir( aPath ) 20 | 21 | def dir_rm ( aPath ): 22 | if os.path.exists( aPath ): 23 | shutil.rmtree( aPath ) 24 | 25 | def file_exists( aPath ): 26 | 27 | try: 28 | 29 | if open( aPath, 'r'): 30 | return True 31 | 32 | except: 33 | return False 34 | 35 | def file_save( aPath, aContent ): 36 | 37 | with open(aPath, 'w') as f: 38 | 39 | if isinstance(aContent, str): 40 | f.write( aContent ) 41 | return True 42 | 43 | if isinstance(aContent, list): 44 | content_str = '' 45 | for line in aContent: 46 | content_str += line + '\n' 47 | 48 | f.write( content_str ) 49 | return True 50 | 51 | if isinstance(aContent, dict): 52 | 53 | content_str = '' 54 | for key, value in aContent.items(): 55 | content_str += key + '=' + value + '\n' 56 | 57 | f.write( content_str ) 58 | return True 59 | 60 | return False 61 | 62 | def file_append( aPath, aNewContent ): 63 | 64 | with open(aPath, "r") as file: 65 | 66 | content = file.read() 67 | content += '\n' + aNewContent 68 | 69 | return file_save( aPath, content ) 70 | 71 | return False 72 | 73 | def file_load( path, as_list=False ): 74 | 75 | try: 76 | 77 | f = open( path, 'r') 78 | if f: 79 | 80 | if as_list: 81 | content = f.read().splitlines() 82 | else: 83 | content = f.read() 84 | 85 | f.close() 86 | return content 87 | 88 | except UnicodeDecodeError as err: 89 | 90 | print(" *** UnicodeDecodeError: {0}".format(err)) 91 | return None 92 | 93 | except Exception as e: 94 | 95 | print (' *** Err loading file: ' + str( e ) ) 96 | return None 97 | 98 | # Dummy wrapper 99 | def file_content( aFilePath, aMark=None ): 100 | return file_load( aFilePath, aMark ) 101 | 102 | def file_rm ( aPath ): 103 | if file_exists( aPath ): 104 | os.remove( aPath ) 105 | 106 | def list_files( aPath, aExcludePath, aExt=None ): 107 | 108 | matches = [] 109 | 110 | for root, dirnames, filenames in os.walk( aPath ): 111 | 112 | # Exclude DIRs like ENV, migrations .. etc 113 | if any(ext in root for ext in aExcludePath): 114 | continue 115 | 116 | if aExt: 117 | 118 | for filename in fnmatch.filter(filenames, '*.' + aExt ): 119 | 120 | item = os.path.join(root, filename) 121 | 122 | matches.append( item ) 123 | else: 124 | 125 | for filename in filenames: 126 | 127 | item = os.path.join(root, filename) 128 | 129 | matches.append( item ) 130 | 131 | return matches 132 | 133 | def file_write( path, content, f_append=False ): 134 | 135 | try: 136 | 137 | f = None 138 | 139 | if file_exists( path ): 140 | if f_append: 141 | f = open( path, 'a+') 142 | else: 143 | f = open( path, 'w+') 144 | else: 145 | f = open( path, 'w+') 146 | 147 | if not f: 148 | print( 'Error open file ' ) 149 | return False 150 | 151 | if type(content) is list: 152 | content_p = '' 153 | for line in content: 154 | content_p += line + '\n' 155 | 156 | content = content_p 157 | 158 | f.seek(0) 159 | f.write( content ) 160 | f.truncate() 161 | 162 | f.close() 163 | return True 164 | 165 | except Exception as e: 166 | 167 | print( 'ERR file_write(): ' + str( e ) ) 168 | return False 169 | 170 | except: 171 | 172 | print ( ' *** Err processing file ' + str(path) ) 173 | return False 174 | 175 | def file_create( path, content='' ): 176 | 177 | return file_write( path, content ) 178 | 179 | def json_load( aPath ): 180 | 181 | if file_exists( aPath ): 182 | return json.loads( file_load( aPath ) ) 183 | 184 | return None 185 | -------------------------------------------------------------------------------- /cli/h_git.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | import os 7 | from .common import * 8 | from .h_files import * 9 | from .h_util import * 10 | 11 | def git_changes(): 12 | try: 13 | 14 | if 0 == exec_process('git diff --name-only'): 15 | return True 16 | 17 | return False 18 | 19 | except Exception as e: 20 | print(' > ERR: ' + str(e) ) 21 | return -1 22 | 23 | def git_log(): 24 | try: 25 | 26 | if 0 == exec_process('git log --oneline --graph --all'): 27 | return True 28 | 29 | return False 30 | 31 | except Exception as e: 32 | print(' > ERR: ' + str(e) ) 33 | return -1 34 | 35 | def git_commit(): 36 | try: 37 | 38 | git_comment = input(' Add Comment: ') 39 | 40 | # add dummy if not provided 41 | if not git_comment or '' == git_comment: 42 | git_comment = '' 43 | 44 | if 0 == exec_process( f"git commit -am \"{git_comment}\"" ): 45 | if 0 == exec_process( 'git push' ): 46 | return True 47 | 48 | return False 49 | 50 | except Exception as e: 51 | print(' > ERR: ' + str(e) ) 52 | return -1 53 | 54 | def git_tag(): 55 | try: 56 | 57 | git_tag = input(' TAG Name: ') 58 | git_comment = input(' TAG Comment: ') 59 | 60 | if 0 == exec_process( f"git tag -a {git_tag} -m '{git_comment}'" ): 61 | return True 62 | 63 | return False 64 | 65 | except Exception as e: 66 | print(' > ERR: ' + str(e) ) 67 | return -1 68 | 69 | def git_list_tags(): 70 | try: 71 | 72 | if 0 == exec_process('git describe --tags --abbrev=0'): 73 | return True 74 | 75 | return False 76 | 77 | except Exception as e: 78 | print(' > ERR: ' + str(e) ) 79 | return -1 80 | 81 | def git_revert(): 82 | try: 83 | 84 | confirm = input('DANGER: This command reverts the latest commit. Confirm y/N: ') 85 | if 'y' != confirm.strip().lower(): 86 | # nothing is done 87 | return False 88 | 89 | if 0 == exec_process('git reset --hard HEAD~1'): 90 | if 0 == exec_process('git push origin HEAD --force'): 91 | return True 92 | 93 | return False 94 | 95 | except Exception as e: 96 | print(' > ERR: ' + str(e) ) 97 | return -1 98 | -------------------------------------------------------------------------------- /cli/h_shell.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | import os 7 | from .common import * 8 | from .h_files import * 9 | from .h_util import * 10 | 11 | def check_migrations(): 12 | try: 13 | 14 | if 0 == exec_process('python manage.py makemigrations --check --dry-run'): 15 | return True 16 | 17 | return False 18 | 19 | except Exception as e: 20 | print(' > ERR: ' + str(e) ) 21 | return -1 22 | 23 | def exec_migration(): 24 | try: 25 | 26 | if 0 == exec_process('python manage.py makemigrations'): 27 | if 0 == exec_process('python manage.py migrate'): 28 | return True 29 | 30 | return False 31 | 32 | except Exception as e: 33 | print(' > ERR: ' + str(e) ) 34 | return -1 35 | 36 | def create_admin(): 37 | try: 38 | 39 | if 0 == exec_process('python manage.py createsuperuser '): 40 | return True 41 | 42 | return False 43 | 44 | except Exception as e: 45 | print(' > ERR: ' + str(e) ) 46 | return -1 47 | 48 | def exec_project_start(aPort=8000): 49 | try: 50 | 51 | if 0 == exec_process('python manage.py runserver ' + str(aPort) ): 52 | return True 53 | 54 | return False 55 | 56 | except Exception as e: 57 | print(' > ERR: ' + str(e) ) 58 | return -1 59 | 60 | def exec_project_shell(): 61 | try: 62 | 63 | if 0 == exec_process('python manage.py shell'): 64 | return True 65 | 66 | return False 67 | 68 | except Exception as e: 69 | print(' > ERR: ' + str(e) ) 70 | return -1 71 | 72 | def exec_format_code( aFilePath ): 73 | try: 74 | 75 | if 0 == exec_process('black ' + aFilePath ): 76 | return True 77 | 78 | return False 79 | 80 | except Exception as e: 81 | print(' > ERR: ' + str(e) ) 82 | return -1 83 | -------------------------------------------------------------------------------- /cli/h_util.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) App-Generator.dev | AppSeed.us 4 | """ 5 | 6 | import random, string 7 | from datetime import datetime 8 | 9 | from .common import * 10 | 11 | def h_random(aLen=6): 12 | letters = string.ascii_letters 13 | digits = string.digits 14 | chars = '_<>,.+' 15 | return ''.join(random.choices( letters + digits + chars, k=aLen)) 16 | 17 | def h_random_ascii(aLen=6): 18 | letters = string.ascii_letters 19 | digits = string.digits 20 | return ''.join(random.choices( letters + digits, k=aLen)) 21 | 22 | def h_ts(): 23 | return datetime.now().strftime("%Y-%m-%d-%H-%M-%S") 24 | 25 | def h_list_to_str(aList, aSep=COMMON.CSV_SEP): 26 | return aSep.join(aList) 27 | -------------------------------------------------------------------------------- /cli/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/cli/migrations/__init__.py -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/config/__init__.py -------------------------------------------------------------------------------- /config/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for core project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /config/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for core project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.1.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.1/ref/settings/ 11 | """ 12 | 13 | import os, random, string 14 | from pathlib import Path 15 | from dotenv import load_dotenv 16 | from str2bool import str2bool 17 | 18 | load_dotenv() # take environment variables from .env. 19 | 20 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 21 | BASE_DIR = Path(__file__).resolve().parent.parent 22 | 23 | # Quick-start development settings - unsuitable for production 24 | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ 25 | 26 | # SECURITY WARNING: keep the secret key used in production secret! 27 | SECRET_KEY = os.environ.get('SECRET_KEY', 'Super_Secr3t_9999') 28 | 29 | # Enable/Disable DEBUG Mode 30 | DEBUG = str2bool(os.environ.get('DEBUG')) 31 | #print(' DEBUG -> ' + str(DEBUG) ) 32 | 33 | # Docker HOST 34 | ALLOWED_HOSTS = ['*'] 35 | 36 | # Add here your deployment HOSTS 37 | CSRF_TRUSTED_ORIGINS = ['http://localhost:8000', 'http://localhost:5085', 'http://127.0.0.1:8000', 'http://127.0.0.1:5085'] 38 | 39 | #Render Context 40 | RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME') 41 | if RENDER_EXTERNAL_HOSTNAME: 42 | ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME) 43 | 44 | # Application definition 45 | 46 | INSTALLED_APPS = [ 47 | "jazzmin", 48 | 'admin_adminlte.apps.AdminAdminlteConfig', 49 | "django.contrib.admin", 50 | "django.contrib.auth", 51 | "django.contrib.contenttypes", 52 | "django.contrib.sessions", 53 | "django.contrib.messages", 54 | "django.contrib.staticfiles", 55 | 56 | # Serve UI pages 57 | "apps.pages", 58 | 59 | # Dynamic DT 60 | "apps.dyn_dt", 61 | 62 | # Dynamic API 63 | "apps.dyn_api", 64 | 65 | # Charts 66 | "apps.charts", 67 | 68 | # Tooling API-GEN 69 | 'rest_framework', # Include DRF # <-- NEW 70 | 'rest_framework.authtoken', # Include DRF Auth # <-- NEW 71 | ] 72 | 73 | MIDDLEWARE = [ 74 | "django.middleware.security.SecurityMiddleware", 75 | "whitenoise.middleware.WhiteNoiseMiddleware", 76 | "django.contrib.sessions.middleware.SessionMiddleware", 77 | "django.middleware.common.CommonMiddleware", 78 | "django.middleware.csrf.CsrfViewMiddleware", 79 | "django.contrib.auth.middleware.AuthenticationMiddleware", 80 | "django.contrib.messages.middleware.MessageMiddleware", 81 | "django.middleware.clickjacking.XFrameOptionsMiddleware", 82 | ] 83 | 84 | ROOT_URLCONF = "config.urls" 85 | 86 | HOME_TEMPLATES = os.path.join(BASE_DIR, 'templates') 87 | 88 | TEMPLATES = [ 89 | { 90 | "BACKEND": "django.template.backends.django.DjangoTemplates", 91 | "DIRS": [HOME_TEMPLATES], 92 | "APP_DIRS": True, 93 | "OPTIONS": { 94 | "context_processors": [ 95 | "django.template.context_processors.debug", 96 | "django.template.context_processors.request", 97 | "django.contrib.auth.context_processors.auth", 98 | "django.contrib.messages.context_processors.messages", 99 | ], 100 | }, 101 | }, 102 | ] 103 | 104 | WSGI_APPLICATION = "config.wsgi.application" 105 | 106 | 107 | # Database 108 | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases 109 | 110 | DB_ENGINE = os.getenv('DB_ENGINE' , None) 111 | DB_USERNAME = os.getenv('DB_USERNAME' , None) 112 | DB_PASS = os.getenv('DB_PASS' , None) 113 | DB_HOST = os.getenv('DB_HOST' , None) 114 | DB_PORT = os.getenv('DB_PORT' , None) 115 | DB_NAME = os.getenv('DB_NAME' , None) 116 | 117 | if DB_ENGINE and DB_NAME and DB_USERNAME: 118 | DATABASES = { 119 | 'default': { 120 | 'ENGINE' : 'django.db.backends.' + DB_ENGINE, 121 | 'NAME' : DB_NAME, 122 | 'USER' : DB_USERNAME, 123 | 'PASSWORD': DB_PASS, 124 | 'HOST' : DB_HOST, 125 | 'PORT' : DB_PORT, 126 | }, 127 | } 128 | else: 129 | DATABASES = { 130 | 'default': { 131 | 'ENGINE': 'django.db.backends.sqlite3', 132 | 'NAME': 'db.sqlite3', 133 | } 134 | } 135 | 136 | # Password validation 137 | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators 138 | 139 | AUTH_PASSWORD_VALIDATORS = [ 140 | { 141 | "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", 142 | }, 143 | { 144 | "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", 145 | }, 146 | { 147 | "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", 148 | }, 149 | { 150 | "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", 151 | }, 152 | ] 153 | 154 | 155 | # Internationalization 156 | # https://docs.djangoproject.com/en/4.1/topics/i18n/ 157 | 158 | LANGUAGE_CODE = "en-us" 159 | 160 | TIME_ZONE = "UTC" 161 | 162 | USE_I18N = True 163 | 164 | USE_TZ = True 165 | 166 | 167 | # Static files (CSS, JavaScript, Images) 168 | # https://docs.djangoproject.com/en/4.1/howto/static-files/ 169 | 170 | STATIC_URL = '/static/' 171 | STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 172 | 173 | STATICFILES_DIRS = ( 174 | os.path.join(BASE_DIR, 'static'), 175 | ) 176 | 177 | #if not DEBUG: 178 | # STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' 179 | 180 | # Default primary key field type 181 | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field 182 | 183 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" 184 | 185 | LOGIN_REDIRECT_URL = '/' 186 | EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 187 | 188 | # ### DYNAMIC_DATATB Settings ### 189 | DYNAMIC_DATATB = { 190 | # SLUG -> Import_PATH 191 | 'product' : "apps.pages.models.Product", 192 | } 193 | ######################################## 194 | 195 | # Syntax: URI -> Import_PATH 196 | DYNAMIC_API = { 197 | # SLUG -> Import_PATH 198 | 'product' : "apps.pages.models.Product", 199 | } 200 | 201 | REST_FRAMEWORK = { 202 | 'DEFAULT_AUTHENTICATION_CLASSES': [ 203 | 'rest_framework.authentication.SessionAuthentication', 204 | 'rest_framework.authentication.TokenAuthentication', 205 | ], 206 | } 207 | ######################################## -------------------------------------------------------------------------------- /config/urls.py: -------------------------------------------------------------------------------- 1 | """core URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import include, path 18 | 19 | urlpatterns = [ 20 | path('', include('apps.pages.urls')), 21 | path('', include('apps.dyn_dt.urls')), 22 | path('', include('apps.dyn_api.urls')), 23 | path('charts/', include('apps.charts.urls')), 24 | path("admin/", admin.site.urls), 25 | path("", include('admin_adminlte.urls')) 26 | ] 27 | -------------------------------------------------------------------------------- /config/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for core project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/db.sqlite3 -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | appseed-app: 4 | container_name: appseed_app 5 | restart: always 6 | build: . 7 | networks: 8 | - db_network 9 | - web_network 10 | nginx: 11 | container_name: nginx 12 | restart: always 13 | image: "nginx:latest" 14 | ports: 15 | - "5085:5085" 16 | volumes: 17 | - ./nginx:/etc/nginx/conf.d 18 | networks: 19 | - web_network 20 | depends_on: 21 | - appseed-app 22 | networks: 23 | db_network: 24 | driver: bridge 25 | web_network: 26 | driver: bridge 27 | -------------------------------------------------------------------------------- /env.sample: -------------------------------------------------------------------------------- 1 | # True for development, False for production 2 | DEBUG=True 3 | 4 | SECRET_KEY= 5 | 6 | # DB_ENGINE=mysql 7 | # DB_HOST=localhost 8 | # DB_NAME=appseed_db 9 | # DB_USERNAME=appseed_db_usr 10 | # DB_PASS=pass 11 | # DB_PORT=3306 -------------------------------------------------------------------------------- /gunicorn-cfg.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | bind = '0.0.0.0:5005' 7 | workers = 1 8 | accesslog = '-' 9 | loglevel = 'debug' 10 | capture_output = True 11 | enable_stdio_inheritance = True 12 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == "__main__": 22 | main() 23 | -------------------------------------------------------------------------------- /media.md: -------------------------------------------------------------------------------- 1 | ![docs-django-adminlte-thumb](https://github.com/user-attachments/assets/4d5f6b17-3b80-469b-ade7-2b8e318f829d) 2 | -------------------------------------------------------------------------------- /nginx/appseed-app.conf: -------------------------------------------------------------------------------- 1 | upstream webapp { 2 | server appseed_app:5005; 3 | } 4 | 5 | server { 6 | listen 5085; 7 | server_name localhost; 8 | 9 | location / { 10 | proxy_pass http://webapp; 11 | proxy_set_header Host $host; 12 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flask-datta-able", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "vite build --watch --mode development", 8 | "build": "vite build --mode production && npm run minify-css", 9 | "minify-css": "postcss static/assets/css/*.css --dir static/assets/css --no-map --ext .min.css" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "autoprefixer": "^10.4.20", 16 | "cssnano": "^7.0.6", 17 | "postcss": "^8.5.3", 18 | "postcss-cli": "^11.0.0", 19 | "sass": "^1.85.1", 20 | "vite": "^6.2.0" 21 | } 22 | } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('cssnano')({ 4 | preset: 'default', 5 | }), 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | - type: web 3 | name: django-adminlte-latest 4 | plan: starter 5 | env: python 6 | region: frankfurt # region should be same as your database region. 7 | buildCommand: "./build.sh" 8 | startCommand: "gunicorn config.wsgi:application" 9 | envVars: 10 | - key: DEBUG 11 | value: False 12 | - key: SECRET_KEY 13 | generateValue: true 14 | - key: WEB_CONCURRENCY 15 | value: 4 16 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Core 2 | django==4.2.9 3 | python-dotenv==1.0.1 4 | str2bool==1.1 5 | 6 | # UI & Admin UI 7 | django-jazzmin==3.0.1 8 | django-admin-adminlte==1.0.14 9 | 10 | # Tools 11 | django-debug-toolbar==4.4.6 12 | djangorestframework==3.15.2 13 | requests==2.32.3 14 | pandas==2.2.3 15 | graphviz==0.20.3 16 | astor==0.8.1 17 | 18 | # AI 19 | anthropic==0.34.2 20 | 21 | # Deployment 22 | whitenoise==6.7.0 23 | gunicorn==23.0.0 24 | 25 | # DB 26 | #psycopg2-binary==2.9.9 27 | #mysqlclient==2.1.1 28 | django-dbbackup==4.2.1 29 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/static/.gitkeep -------------------------------------------------------------------------------- /static/assets/scss/custom.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | Custom SCSS 4 | 5 | */ -------------------------------------------------------------------------------- /static/img/csv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/static/img/csv.png -------------------------------------------------------------------------------- /static/img/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/django-adminlte/17449c33c000c9e6846bd2276268f7dbd53326e1/static/img/export.png -------------------------------------------------------------------------------- /templates/accounts/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/auth_base.html' %} 2 | 3 | {% block title %} Log in {% endblock title %} 4 | 5 | {% block bodyclass %} login-page {% endblock bodyclass %} 6 | 7 | {% block content %} 8 | 76 | 77 | {% endblock %} 78 | -------------------------------------------------------------------------------- /templates/accounts/register.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/auth_base.html' %} 2 | 3 | {% block title %} Registration Page {% endblock title %} 4 | 5 | {% block bodyclass %} register-page {% endblock bodyclass %} 6 | 7 | {% block content %} 8 |
9 | 12 | 13 |
14 |
15 | 16 | 17 |
18 | {% csrf_token %} 19 | 20 | {% for field in form %} 21 |
22 | {{field}} 23 |
24 |
25 | 26 |
27 |
28 |
29 | {{ field.errors }} 30 | {% endfor %} 31 |
32 |
33 |
34 | 35 | 38 |
39 |
40 | 41 |
42 | 43 |
44 | 45 |
46 |
47 | 48 | 61 | 62 |

63 | Have an account? Sign IN 64 |

65 | 66 |
67 | 68 |
69 |
70 | {% endblock content %} 71 | -------------------------------------------------------------------------------- /templates/charts/index.html: -------------------------------------------------------------------------------- 1 | {% extends "layouts/base.html" %} 2 | {% load static %} 3 | 4 | {% block title %}Charts{% endblock title %} 5 | 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

Charts

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 |
31 | 32 |
33 |
34 |
35 |
Bar Chart
36 |
37 |
38 |
39 |
40 |
41 |
42 | 43 | 44 | 45 |
46 |
47 |
48 |
Pie Chart
49 |
50 |
51 |
52 |
53 |
54 |
55 | 56 |
57 | 58 |
59 |
60 |
61 | {% endblock content %} 62 | 63 | {% block extra_scripts %} 64 | 65 | 88 | {% endblock extra_scripts %} 89 | -------------------------------------------------------------------------------- /templates/dyn_api/index.html: -------------------------------------------------------------------------------- 1 | {% extends "layouts/base.html" %} 2 | {% load static %} 3 | 4 | {% block title %} Dynamic APIs {% endblock title %} 5 | 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

Dynamic API

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 |
31 | 32 |
33 |
34 |
35 |
36 | Available Routes - defined in settings.DYNAMIC_API - Read Documentation. 37 |
38 |
39 |
40 |
    41 | {% for link in routes %} 42 |
  • 43 | {{ link }} 44 |
  • 45 | {% endfor %} 46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | 55 | {% endblock content %} 56 | 57 | 58 | {% block extra_scripts %} 59 | 60 | 61 | 62 | {% endblock extra_scripts %} -------------------------------------------------------------------------------- /templates/dyn_dt/index.html: -------------------------------------------------------------------------------- 1 | {% extends "layouts/base.html" %} 2 | {% load static %} 3 | 4 | {% block title %} {% if page_title %} page_title {% else %} Dynamic DataTables {% endif %} {% endblock title %} 5 | 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

Dynamic DT

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 |
31 | 32 |
33 |
34 |
35 |
36 | Available Routes - defined in settings.DYNAMIC_DATATB - Read Documentation. 37 |
38 |
39 |
40 |
    41 | {% for link in routes %} 42 |
  • 43 | {{ link }} 44 |
  • 45 | {% endfor %} 46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | 55 | {% endblock content %} 56 | 57 | 58 | {% block extra_scripts %} 59 | 60 | {% endblock extra_scripts %} -------------------------------------------------------------------------------- /templates/dyn_dt/items-table.html: -------------------------------------------------------------------------------- 1 | {% load get_attribute %} 2 | 3 |
4 | 5 | 6 | 7 | {% for field in db_field_names %} 8 | 9 | {% endfor %} 10 | 11 | 12 | 13 | {% for item in items %} 14 | 15 | {% for field_name in db_field_names %} 16 | 17 | {% endfor %} 18 | 19 | {% endfor %} 20 | 21 |
{{ field }}
{{ item|getattribute:field_name }}
22 |
-------------------------------------------------------------------------------- /templates/includes/footer.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 |
4 | 5 | © AdminLTE.io - coded by App-Generator. 6 | 7 |
8 | Version 3.2.0 9 |
10 | 11 |
12 | -------------------------------------------------------------------------------- /templates/includes/navigation-dark.html: -------------------------------------------------------------------------------- 1 | 2 | 137 | -------------------------------------------------------------------------------- /templates/includes/navigation-light.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 160 | -------------------------------------------------------------------------------- /templates/includes/sidebar.html: -------------------------------------------------------------------------------- 1 | {% load i18n static admin_adminlte %} 2 | 3 | 4 | -------------------------------------------------------------------------------- /templates/layouts/auth_base.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | {% block title %}{% endblock title %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% block content %}{% endblock content %} 21 | 22 | {% block scripts %} 23 | 24 | 25 | 26 | 27 | 28 | 29 | {% endblock scripts %} 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /templates/layouts/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | {% block title %}{% endblock title %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% block extrastyle %}{% endblock extrastyle %} 20 | 21 | 22 | 23 |
24 | 25 | {% block preloader %} 26 | 27 |
28 | AdminLTELogo 29 |
30 | {% endblock preloader %} 31 | 32 | {% block header %} 33 | {% include 'includes/navigation-light.html' %} 34 | {% endblock header %} 35 | 36 | {% block sidebar %} 37 | {% include 'includes/sidebar.html' %} 38 | {% endblock sidebar %} 39 | 40 | {% block content %}{% endblock content %} 41 | 42 | {% block footer %} 43 | {% include 'includes/footer.html' %} 44 | {% endblock footer %} 45 | 46 | {% block control_sidebar %} 47 | 48 | 49 | 52 | 53 | 54 | {% endblock control_sidebar %} 55 | 56 |
57 | 58 | {% include 'includes/scripts.html' %} 59 | {% block extra_scripts %}{% endblock extra_scripts %} 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /templates/pages/UI/icons.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Icons 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | {% include 'includes/navigation-light.html' %} 20 | 21 | 22 | 23 | {% include 'includes/sidebar.html' %} 24 | 25 | 26 |
27 | 28 |
29 |
30 |
31 |
32 |

Icons

33 |
34 |
35 | 39 |
40 |
41 |
42 |
43 | 44 | 45 |
46 |
47 |
48 |
49 |

Icons

50 |
51 |
52 |

You can use any font library you like with AdminLTE 3.

53 | Recommendations 54 |
55 | Font Awesome
56 | Iconic Icons
57 | Ion Icons
58 |
59 |
60 |
61 |
62 |
63 | 64 |
65 | 66 |
67 |
68 | Version 3.2.0 69 |
70 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 71 |
72 | 73 | 74 | 77 | 78 |
79 | 80 | 81 | 82 | {% include 'includes/scripts.html' %} 83 | 84 | 85 | -------------------------------------------------------------------------------- /templates/pages/UI/timeline.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Timeline 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | {% include 'includes/navigation-light.html' %} 21 | 22 | 23 | 24 | {% include 'includes/sidebar.html' %} 25 | 26 | 27 |
28 | 29 |
30 |
31 |
32 |
33 |

Timeline

34 |
35 |
36 | 40 |
41 |
42 |
43 |
44 | 45 | 46 |
47 |
48 | 49 | 50 |
51 |
52 | 53 |
54 | 55 |
56 | 10 Feb. 2014 57 |
58 | 59 | 60 |
61 | 62 |
63 | 12:05 64 |

Support Team sent you an email

65 | 66 |
67 | Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, 68 | weebly ning heekya handango imeem plugg dopplr jibjab, movity 69 | jajah plickers sifteo edmodo ifttt zimbra. Babblely odeo kaboodle 70 | quora plaxo ideeli hulu weebly balihoo... 71 |
72 | 76 |
77 |
78 | 79 | 80 |
81 | 82 |
83 | 5 mins ago 84 |

Sarah Young accepted your friend request

85 |
86 |
87 | 88 | 89 |
90 | 91 |
92 | 27 mins ago 93 |

Jay White commented on your post

94 |
95 | Take me to your leader! 96 | Switzerland is small and neutral! 97 | We are more like Germany, ambitious and misunderstood! 98 |
99 | 102 |
103 |
104 | 105 | 106 |
107 | 3 Jan. 2014 108 |
109 | 110 | 111 |
112 | 113 |
114 | 2 days ago 115 |

Mina Lee uploaded new photos

116 |
117 | ... 118 | ... 119 | ... 120 | ... 121 | ... 122 |
123 |
124 |
125 | 126 | 127 |
128 | 129 | 130 |
131 | 5 days ago 132 | 133 |

Mr. Doe shared a video

134 | 135 |
136 |
137 | 138 |
139 |
140 | 143 |
144 |
145 | 146 |
147 | 148 |
149 |
150 |
151 | 152 |
153 |
154 | 155 | 156 |
157 | 158 |
159 | 160 | 161 |
162 |
163 | Version 3.2.0 164 |
165 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 166 |
167 | 168 | 169 | 172 | 173 |
174 | 175 | 176 | 177 | {% include 'includes/scripts.html' %} 178 | 179 | 180 | -------------------------------------------------------------------------------- /templates/pages/charts/uplot.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | {% block title %} Uplot Charts {% endblock title %} 4 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 5 | 6 | {% block extrastyle %} 7 | 8 | 9 | {% endblock extrastyle %} 10 | {% block content %} 11 | 12 |
13 | 14 |
15 |
16 |
17 |
18 |

Uplot Charts

19 |
20 |
21 | 25 |
26 |
27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 |

Area Chart

37 | 38 |
39 | 42 | 45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 | 55 | 56 | 57 |
58 |
59 |

Line Chart

60 | 61 |
62 | 65 | 68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | 76 |
77 | 78 |
79 |
80 | 81 |
82 | {% endblock content %} 83 | {% block extra_scripts %} 84 | 85 | 86 | 87 | 169 | {% endblock extra_scripts %} -------------------------------------------------------------------------------- /templates/pages/examples/404.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} 404 page not found {% endblock title %} 5 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

404 Error Page

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 |

404

30 | 31 |
32 |

Oops! Page not found.

33 | 34 |

35 | We could not find the page you were looking for. 36 | Meanwhile, you may return to dashboard or try using the search form. 37 |

38 | 39 |
40 |
41 | 42 | 43 |
44 | 46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 | {% endblock content %} 58 | 59 | -------------------------------------------------------------------------------- /templates/pages/examples/500.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} 500 Error {% endblock title %} 5 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

500 Error Page

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 |

500

30 | 31 |
32 |

Oops! Something went wrong.

33 | 34 |

35 | We will work on fixing that right away. 36 | Meanwhile, you may return to dashboard or try using the search form. 37 |

38 | 39 |
40 |
41 | 42 | 43 |
44 | 46 |
47 |
48 | 49 |
50 |
51 |
52 | 53 | 54 |
55 | 56 |
57 | {% endblock content %} -------------------------------------------------------------------------------- /templates/pages/examples/blank.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} Blank Page {% endblock title %} 5 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

Blank Page

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 | 29 | 30 |
31 |
32 |

Title

33 | 34 |
35 | 38 | 41 |
42 |
43 |
44 | Start creating your amazing application! 45 |
46 | 47 | 50 | 51 |
52 | 53 | 54 |
55 | 56 |
57 | {% endblock content %} 58 | -------------------------------------------------------------------------------- /templates/pages/examples/contact-us.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} Contact us {% endblock title %} 5 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 6 | {% block content %} 7 | 8 | 9 |
10 | 11 |
12 |
13 |
14 |
15 |

Contact us

16 |
17 |
18 | 22 |
23 |
24 |
25 |
26 | 27 | 28 |
29 | 30 | 31 |
32 |
33 |
34 |
35 |

AdminLTE

36 |

123 Testing Ave, Testtown, 9876 NA
37 | Phone: +1 234 56789012 38 |

39 |
40 |
41 |
42 |
43 | 44 | 45 |
46 |
47 | 48 | 49 |
50 |
51 | 52 | 53 |
54 |
55 | 56 | 57 |
58 |
59 | 60 |
61 |
62 |
63 |
64 | 65 |
66 | 67 |
68 | {% endblock content %} 69 | -------------------------------------------------------------------------------- /templates/pages/examples/forgot-password-v2.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Forgot Password (v2) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /templates/pages/examples/forgot-password.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Forgot Password 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /templates/pages/examples/invoice-print.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Invoice Print 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 |
22 |
23 | 27 |
28 | 29 |
30 | 31 |
32 |
33 | From 34 |
35 | Admin, Inc.
36 | 795 Folsom Ave, Suite 600
37 | San Francisco, CA 94107
38 | Phone: (804) 123-5432
39 | Email: info@almasaeedstudio.com 40 |
41 |
42 | 43 |
44 | To 45 |
46 | John Doe
47 | 795 Folsom Ave, Suite 600
48 | San Francisco, CA 94107
49 | Phone: (555) 539-1037
50 | Email: john.doe@example.com 51 |
52 |
53 | 54 |
55 | Invoice #007612
56 |
57 | Order ID: 4F3S8J
58 | Payment Due: 2/22/2014
59 | Account: 968-34567 60 |
61 | 62 |
63 | 64 | 65 | 66 |
67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 |
QtyProductSerial #DescriptionSubtotal
1Call of Duty455-981-221El snort testosterone trophy driving gloves handsome$64.50
1Need for Speed IV247-925-726Wes Anderson umami biodiesel$50.00
1Monsters DVD735-845-642Terry Richardson helvetica tousled street art master$10.70
1Grown Ups Blue Ray422-568-642Tousled lomo letterpress$25.99
109 |
110 | 111 |
112 | 113 | 114 |
115 | 116 |
117 |

Payment Methods:

118 | Visa 119 | Mastercard 120 | American Express 121 | Paypal 122 | 123 |

124 | Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, weebly ning heekya handango imeem plugg dopplr 125 | jibjab, movity jajah plickers sifteo edmodo ifttt zimbra. 126 |

127 |
128 | 129 |
130 |

Amount Due 2/22/2014

131 | 132 |
133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 |
Subtotal:$250.30
Tax (9.3%)$10.34
Shipping:$5.80
Total:$265.24
151 |
152 |
153 | 154 |
155 | 156 |
157 | 158 |
159 | 160 | 161 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /templates/pages/examples/invoice.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | {% block title %} Inbox {% endblock title %} 4 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 5 | {% block content %} 6 | 7 |
8 | 9 |
10 |
11 |
12 |
13 |

Invoice

14 |
15 |
16 | 20 |
21 |
22 |
23 |
24 | 25 |
26 |
27 |
28 |
29 |
30 |
Note:
31 | This page has been enhanced for printing. Click the print button at the bottom of the invoice to test. 32 |
33 | 34 | 35 | 36 |
37 | 38 |
39 |
40 |

41 | AdminLTE, Inc. 42 | Date: 2/10/2014 43 |

44 |
45 | 46 |
47 | 48 |
49 |
50 | From 51 |
52 | Admin, Inc.
53 | 795 Folsom Ave, Suite 600
54 | San Francisco, CA 94107
55 | Phone: (804) 123-5432
56 | Email: info@almasaeedstudio.com 57 |
58 |
59 | 60 |
61 | To 62 |
63 | John Doe
64 | 795 Folsom Ave, Suite 600
65 | San Francisco, CA 94107
66 | Phone: (555) 539-1037
67 | Email: john.doe@example.com 68 |
69 |
70 | 71 |
72 | Invoice #007612
73 |
74 | Order ID: 4F3S8J
75 | Payment Due: 2/22/2014
76 | Account: 968-34567 77 |
78 | 79 |
80 | 81 | 82 | 83 |
84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 |
QtyProductSerial #DescriptionSubtotal
1Call of Duty455-981-221El snort testosterone trophy driving gloves handsome$64.50
1Need for Speed IV247-925-726Wes Anderson umami biodiesel$50.00
1Monsters DVD735-845-642Terry Richardson helvetica tousled street art master$10.70
1Grown Ups Blue Ray422-568-642Tousled lomo letterpress$25.99
126 |
127 | 128 |
129 | 130 | 131 |
132 | 133 |
134 |

Payment Methods:

135 | Visa 136 | Mastercard 137 | American Express 138 | Paypal 139 | 140 |

141 | Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, weebly ning heekya handango imeem 142 | plugg 143 | dopplr jibjab, movity jajah plickers sifteo edmodo ifttt zimbra. 144 |

145 |
146 | 147 |
148 |

Amount Due 2/22/2014

149 | 150 |
151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 |
Subtotal:$250.30
Tax (9.3%)$10.34
Shipping:$5.80
Total:$265.24
169 |
170 |
171 | 172 |
173 | 174 | 175 | 176 |
177 |
178 | Print 179 | 182 | 185 |
186 |
187 |
188 | 189 |
190 |
191 |
192 |
193 | 194 |
195 | {% endblock content %} 196 | -------------------------------------------------------------------------------- /templates/pages/examples/lockscreen.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Lockscreen 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 22 | 23 |
John Doe
24 | 25 | 26 |
27 | 28 |
29 | User Image 30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | 38 |
39 | 42 |
43 |
44 |
45 | 46 | 47 |
48 | 49 |
50 | Enter your password to retrieve your session 51 |
52 | 55 | 59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /templates/pages/examples/login-v2.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Log in (v2) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /templates/pages/examples/login.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Log in 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /templates/pages/examples/pace.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} Pace {% endblock title %} 5 | {% block extrastyle %} 6 | 7 | 8 | {% endblock extrastyle %} 9 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 10 | {% block content %} 11 | 12 |
13 | 14 |
15 |
16 |
17 |
18 |

Pace

19 |
20 |
21 | 25 |
26 |
27 |
28 |
29 | 30 | 31 |
32 | 33 | 34 |
35 |
36 |

Title

37 | 38 |
39 | 42 | 45 |
46 |
47 |
48 | You can Change Pace Styles, Checkout the AdminLTE Official Docs in Online. 49 |
50 | Start creating your amazing application! 51 |
52 | 53 | 56 | 57 |
58 | 59 | 60 |
61 | 62 |
63 | {% endblock content %} 64 | {% block extra_scripts %} 65 | 66 | 67 | {% endblock extra_scripts %} -------------------------------------------------------------------------------- /templates/pages/examples/project-add.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} Project Add {% endblock title %} 5 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 6 | {% block content %} 7 | 8 |
9 | 10 |
11 |
12 |
13 |
14 |

Project Add

15 |
16 |
17 | 21 |
22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 |
30 |
31 |
32 |

General

33 | 34 |
35 | 38 |
39 |
40 |
41 |
42 | 43 | 44 |
45 |
46 | 47 | 48 |
49 |
50 | 51 | 57 |
58 |
59 | 60 | 61 |
62 |
63 | 64 | 65 |
66 |
67 | 68 |
69 | 70 |
71 |
72 |
73 |
74 |

Budget

75 | 76 |
77 | 80 |
81 |
82 |
83 |
84 | 85 | 86 |
87 |
88 | 89 | 90 |
91 |
92 | 93 | 94 |
95 |
96 | 97 |
98 | 99 |
100 |
101 |
102 |
103 | Cancel 104 | 105 |
106 |
107 |
108 | 109 |
110 | {% endblock content %} -------------------------------------------------------------------------------- /templates/pages/examples/recover-password-v2.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Recover Password (v2) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /templates/pages/examples/recover-password.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Recover Password 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /templates/pages/examples/register-v2.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Registration Page (v2) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 | AdminLTE 23 |
24 |
25 | 26 | 27 |
28 | {% csrf_token %} 29 | 30 | {% for field in form %} 31 |
32 | {{field}} 33 |
34 |
35 | 36 |
37 |
38 |
39 | {{ field.errors }} 40 | {% endfor %} 41 |
42 |
43 |
44 | 45 | 48 |
49 |
50 | 51 |
52 | 53 |
54 | 55 |
56 |
57 | 58 | 68 | 69 | I already have a membership 70 |
71 | 72 |
73 |
74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /templates/pages/examples/register.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Registration Page 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 23 | 24 |
25 |
26 | 27 | 28 |
29 | {% csrf_token %} 30 | 31 | {% for field in form %} 32 |
33 | {{field}} 34 |
35 |
36 | 37 |
38 |
39 |
40 | {{ field.errors }} 41 | {% endfor %} 42 |
43 |
44 |
45 | 46 | 49 |
50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 |
58 | 59 | 70 | 71 | I already have a membership 72 |
73 | 74 |
75 |
76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /templates/pages/forms/editors.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | {% block title %} Text Editors {% endblock title %} 4 | {% block extrastyle %} 5 | 6 | 7 | 8 | 9 | 10 | {% endblock extrastyle %} 11 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 12 | 13 | {% block content %} 14 | 15 |
16 | 17 |
18 |
19 |
20 |
21 |

Text Editors

22 |
23 |
24 | 28 |
29 |
30 |
31 | 32 |
33 | 34 | 35 |
36 |
37 |
38 |
39 |
40 |

41 | Summernote 42 |

43 |
44 | 45 |
46 | 49 |
50 | 53 |
54 |
55 | 56 |
57 | 58 |
59 |
60 |
61 |
62 |

63 | CodeMirror 64 |

65 |
66 | 67 |
68 | 83 |
84 | 87 |
88 |
89 | 90 |
91 | 92 |
93 | 94 |
95 | {% endblock content %} 96 | {% block extra_scripts %} 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 117 | {% endblock extra_scripts %} 118 | -------------------------------------------------------------------------------- /templates/pages/forms/validation.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | {% block title %} Validation {% endblock title %} 4 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 5 | {% block content %} 6 | 7 |
8 | 9 |
10 |
11 |
12 |
13 |

Validation

14 |
15 |
16 | 20 |
21 |
22 |
23 |
24 | 25 | 26 |
27 |
28 |
29 | 30 |
31 | 32 |
33 |
34 |

Quick Example jQuery Validation

35 |
36 | 37 | 38 |
39 |
40 |
41 | 42 | 43 |
44 |
45 | 46 | 47 |
48 |
49 |
50 | 51 | 52 |
53 |
54 |
55 | 56 | 59 |
60 |
61 | 62 |
63 | 64 | 65 |
66 | 67 |
68 | 69 |
70 | 71 |
72 |
73 | 74 |
75 | {% endblock content %} 76 | {% block extra_scripts %} 77 | 78 | 79 | 80 | 126 | {% endblock extra_scripts %} -------------------------------------------------------------------------------- /templates/pages/layout/boxed.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Boxed Layout 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | {% include 'includes/navigation-light.html' %} 21 | 22 | 23 | {% include 'includes/sidebar.html' %} 24 | 25 | 26 |
27 | 28 |
29 |
30 |
31 |
32 |

Boxed Layout

33 |
34 |
35 | 40 |
41 |
42 |
43 |
44 | 45 | 46 |
47 |
48 |
49 |
50 | 51 |
52 |
53 |

Title

54 | 55 |
56 | 59 | 62 |
63 |
64 |
65 | Start creating your amazing application! 66 |
67 | 68 | 71 | 72 |
73 | 74 |
75 |
76 |
77 |
78 | 79 |
80 | 81 |
82 |
83 | Version 3.2.0 84 |
85 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 86 |
87 | 88 | 89 | 92 | 93 |
94 | 95 | 96 | 97 | {% include 'includes/scripts.html' %} 98 | 99 | 100 | -------------------------------------------------------------------------------- /templates/pages/layout/collapsed-sidebar.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Collapsed Sidebar 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | {% include 'includes/navigation-light.html' %} 21 | 22 | 23 | 24 | {% include 'includes/sidebar.html' %} 25 | 26 | 27 |
28 | 29 |
30 |
31 |
32 |
33 |

Collapsed Sidebar

34 |
35 |
36 | 41 |
42 |
43 |
44 |
45 | 46 | 47 |
48 |
49 |
50 |
51 | 52 |
53 |
54 |

Title

55 | 56 |
57 | 60 | 63 |
64 |
65 |
66 | Start creating your amazing application! 67 |
68 | 69 | 72 | 73 |
74 | 75 |
76 |
77 |
78 |
79 | 80 |
81 | 82 | 83 |
84 |
85 | Version 3.2.0 86 |
87 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 88 |
89 | 90 | 91 | 94 | 95 |
96 | 97 | 98 | 99 | {% include 'includes/scripts.html' %} 100 | 101 | 102 | -------------------------------------------------------------------------------- /templates/pages/layout/fixed-footer.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Fixed Footer Layout 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | {% include 'includes/navigation-light.html' %} 21 | 22 | 23 | 24 | {% include 'includes/sidebar.html' %} 25 | 26 | 27 |
28 | 29 |
30 |
31 |
32 |
33 |

Fixed Footer Layout

34 |
35 |
36 | 41 |
42 |
43 |
44 |
45 | 46 | 47 |
48 |
49 |
50 |
51 | 52 |
53 |
54 |

Title

55 | 56 |
57 | 60 | 63 |
64 |
65 |
66 | Start creating your amazing application! 67 |
68 | 69 | 72 | 73 |
74 | 75 |
76 |
77 |
78 |
79 | 80 |
81 | 82 | 83 |
84 |
85 | Version 3.2.0 86 |
87 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 88 |
89 | 90 | 91 | 94 | 95 |
96 | 97 | 98 | 99 | {% include 'includes/scripts.html' %} 100 | 101 | 102 | -------------------------------------------------------------------------------- /templates/pages/layout/fixed-sidebar-custom.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Fixed Sidebar 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | {% include 'includes/navigation-light.html' %} 23 | 24 | 25 | 26 | {% include 'includes/sidebar.html' %} 27 | 28 | 29 |
30 | 31 |
32 |
33 |
34 |
35 |

Fixed Layout

36 |
37 |
38 | 43 |
44 |
45 |
46 |
47 | 48 | 49 |
50 | 51 |
52 |
53 |
54 | 55 |
56 |
57 |

Title

58 | 59 |
60 | 63 | 66 |
67 |
68 |
69 | Start creating your amazing application! 70 |
71 | 72 | 75 | 76 |
77 | 78 |
79 |
80 |
81 |
82 | 83 |
84 | 85 | 86 |
87 |
88 | Version 3.2.0 89 |
90 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 91 |
92 | 93 | 94 | 97 | 98 |
99 | 100 | 101 | 102 | {% include 'includes/scripts.html' %} 103 | 104 | 105 | -------------------------------------------------------------------------------- /templates/pages/layout/fixed-sidebar.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Fixed Sidebar 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | {% include 'includes/navigation-light.html' %} 24 | 25 | 26 | 27 | {% include 'includes/sidebar.html' %} 28 | 29 | 30 |
31 | 32 |
33 |
34 |
35 |
36 |

Fixed Layout

37 |
38 |
39 | 44 |
45 |
46 |
47 |
48 | 49 | 50 |
51 | 52 |
53 |
54 |
55 | 56 |
57 |
58 |

Title

59 | 60 |
61 | 64 | 67 |
68 |
69 |
70 | Start creating your amazing application! 71 |
72 | 73 | 76 | 77 |
78 | 79 |
80 |
81 |
82 |
83 | 84 |
85 | 86 | 87 |
88 |
89 | Version 3.2.0 90 |
91 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 92 |
93 | 94 | 95 | 98 | 99 |
100 | 101 | 102 | 103 | {% include 'includes/scripts.html' %} 104 | 105 | 106 | -------------------------------------------------------------------------------- /templates/pages/layout/fixed-topnav.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | AdminLTE 3 | Fixed Navbar Layout 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | {% include 'includes/navigation-light.html' %} 21 | 22 | 23 | 24 | {% include 'includes/sidebar.html' %} 25 | 26 |
27 | 28 |
29 |
30 |
31 |
32 |

Fixed Navbar Layout

33 |
34 |
35 | 40 |
41 |
42 |
43 |
44 | 45 | 46 |
47 |
48 |
49 |
50 | 51 |
52 |
53 |

Title

54 | 55 |
56 | 59 | 62 |
63 |
64 |
65 | Start creating your amazing application! 66 |
67 | 68 | 71 | 72 |
73 | 74 |
75 |
76 |
77 |
78 | 79 |
80 | 81 | 82 |
83 |
84 | Version 3.2.0 85 |
86 | Copyright © 2014-2021 AdminLTE.io. All rights reserved. 87 |
88 | 89 | 90 | 93 | 94 |
95 | 96 | 97 | 98 | {% include 'includes/scripts.html' %} 99 | 100 | 101 | -------------------------------------------------------------------------------- /templates/pages/search/enhanced.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} Enhanced Search {% endblock title %} 5 | {% block extrastyle %} 6 | 7 | 8 | {% endblock extrastyle %} 9 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 10 | {% block content %} 11 | 12 |
13 | 14 |
15 |
16 |

Enhanced Search

17 |
18 |
19 |
20 |
21 |
22 |
23 | 24 | 29 |
30 |
31 |
32 |
33 | 34 | 38 |
39 |
40 |
41 |
42 | 43 | 47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 | 57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | {% endblock content %} 67 | {% block extra_scripts %} 68 | 69 | 70 | 75 | {% endblock extra_scripts %} 76 | -------------------------------------------------------------------------------- /templates/pages/search/simple.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | 4 | {% block title %} Simple Search Form {% endblock title %} 5 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 6 | {% block content %} 7 | 8 |
9 | 10 | 11 |
12 |
13 |

Search

14 |
15 |
16 |
17 |
18 | 19 |
20 | 23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | {% endblock content %} 32 | 33 | -------------------------------------------------------------------------------- /templates/pages/tables/jsgrid.html: -------------------------------------------------------------------------------- 1 | {% extends 'layouts/base.html' %} 2 | {% load static %} 3 | {% block title %} jsGrid {% endblock title %} 4 | {% block extrastyle %} 5 | 6 | 7 | 8 | {% endblock extrastyle %} 9 | {% block bodyclass %} hold-transition sidebar-mini {% endblock bodyclass %} 10 | {% block content %} 11 | 12 |
13 | 14 |
15 |
16 |
17 |
18 |

jsGrid

19 |
20 |
21 | 25 |
26 |
27 |
28 |
29 | 30 | 31 |
32 |
33 |
34 |

jsGrid

35 |
36 | 37 |
38 |
39 |
40 | 41 |
42 | 43 |
44 | 45 |
46 | {% endblock content %} 47 | {% block extra_scripts %} 48 | 49 | 50 | 51 | 52 | 73 | {% endblock extra_scripts %} 74 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import autoprefixer from "autoprefixer"; 3 | import cssnano from "cssnano"; 4 | import path from "path"; 5 | 6 | export default defineConfig(({ mode }) => { 7 | const isProduction = mode === "production"; 8 | 9 | return { 10 | css: { 11 | postcss: { 12 | plugins: [ 13 | autoprefixer(), 14 | isProduction && cssnano(), 15 | ].filter(Boolean), 16 | }, 17 | }, 18 | build: { 19 | outDir: "static", 20 | emptyOutDir: false, 21 | rollupOptions: { 22 | input: path.resolve(__dirname, "static/assets/scss/custom.scss"), 23 | output: { 24 | assetFileNames: (assetInfo) => { 25 | if (assetInfo.name === "custom.css") { 26 | return "assets/css/custom.css"; 27 | } 28 | return "assets/css/[name].[ext]"; 29 | }, 30 | }, 31 | }, 32 | }, 33 | }; 34 | }); --------------------------------------------------------------------------------