{"id":49443109,"url":"https://github.com/andres-gutierrezri/kitty_project","last_synced_at":"2026-04-29T21:02:49.457Z","repository":{"id":322431399,"uuid":"1089434786","full_name":"andres-gutierrezri/kitty_project","owner":"andres-gutierrezri","description":"Sistema e-commerce completo con Django 5.2.7 - Autenticación avanzada, gestión de usuarios, sesiones activas y notificaciones por email","archived":false,"fork":false,"pushed_at":"2025-11-04T13:13:46.000Z","size":599,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-04T13:21:25.592Z","etag":null,"topics":["authentication","bootstrap","django","ecommerce","mysql","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andres-gutierrezri.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-04T10:40:50.000Z","updated_at":"2025-11-04T13:13:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/andres-gutierrezri/kitty_project","commit_stats":null,"previous_names":["andres-gutierrezri/kitty_project"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/andres-gutierrezri/kitty_project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andres-gutierrezri%2Fkitty_project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andres-gutierrezri%2Fkitty_project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andres-gutierrezri%2Fkitty_project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andres-gutierrezri%2Fkitty_project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andres-gutierrezri","download_url":"https://codeload.github.com/andres-gutierrezri/kitty_project/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andres-gutierrezri%2Fkitty_project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32443576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T20:22:27.477Z","status":"ssl_error","status_checked_at":"2026-04-29T20:22:26.507Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authentication","bootstrap","django","ecommerce","mysql","python"],"created_at":"2026-04-29T21:02:48.301Z","updated_at":"2026-04-29T21:02:49.445Z","avatar_url":"https://github.com/andres-gutierrezri.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🐱 Kitty Glow - Sistema E-Commerce Django\n\nSistema completo de comercio electrónico desarrollado con Django 5.2.7 que incluye gestión de productos, autenticación avanzada, sistema de roles y notificaciones por email.\n\n---\n\n## 📋 Tabla de Contenidos\n\n1. [Características Principales](#-características-principales)\n2. [Requisitos del Sistema](#-requisitos-del-sistema)\n3. [Instalación Rápida](#-instalación-rápida)\n4. [Estructura del Proyecto](#-estructura-del-proyecto)\n5. [Configuración de Base de Datos](#-configuración-de-base-de-datos)\n6. [Sistema de Autenticación](#-sistema-de-autenticación)\n7. [Gestión de Cuentas de Usuario](#-gestión-de-cuentas-de-usuario)\n8. [Notificaciones por Email](#-notificaciones-por-email)\n9. [Modelos de Datos](#-modelos-de-datos)\n10. [Comandos Útiles](#-comandos-útiles)\n11. [Solución de Problemas](#-solución-de-problemas)\n12. [Seguridad](#-seguridad)\n\n---\n\n## ✨ Características Principales\n\n### 🛍️ E-Commerce\n- Gestión completa de catálogo de productos\n- Sistema de categorías para productos\n- Procesamiento de pedidos y carrito de compras\n- Reseñas y calificaciones de productos\n- Panel de administración Django\n\n### 🔐 Autenticación Avanzada\n- **Login flexible**: Inicio de sesión con email o nombre de usuario\n- Registro con verificación de email\n- Validación estricta de contraseñas (8 requisitos de seguridad)\n- Restablecimiento de contraseña por email\n- Sistema de roles (Admin, Usuario, Moderador, Invitado)\n- Sesiones configurables (30 min de inactividad)\n- Historial de inicios de sesión\n- **Cambio de contraseña desde el perfil**\n  - Requiere contraseña actual para mayor seguridad\n  - Validación estricta de nueva contraseña (8 requisitos)\n  - Validación ANTES de cerrar sesión\n  - Cierre de sesión automático después del cambio\n  - Notificación por email con detalles del cambio\n- **Gestión de sesiones activas**\n  - Detección automática de múltiples inicios de sesión\n  - Vista completa de todos los dispositivos conectados\n  - Información detallada: IP, navegador, SO, última actividad\n  - Cierre remoto de sesiones individuales\n  - Cierre masivo de todas las sesiones excepto la actual\n  - Protección contra cierre accidental de sesión actual\n  - Auto-actualización cada 30 segundos\n  - Limpieza automática de sesiones inactivas (+30 días)\n\n### 👥 Gestión de Usuarios (Administradores)\n- **Panel completo de gestión de usuarios**\n  - Lista de todos los usuarios del sistema con DataTables\n  - Búsqueda, filtrado y ordenamiento avanzado\n  - Información en tiempo real (reseñas, favoritos, sesiones)\n- **Modal Ver Usuario**\n  - Visualización completa de datos personales y del sistema\n  - Estadísticas en tiempo real\n  - Fechas en hora local (Colombia)\n- **Modal Editar Usuario**\n  - Formulario completo de edición con validación\n  - Edición de rol, estado y verificación de email\n  - Validación de username y email únicos\n  - Feedback inmediato con mensajes\n- **Modal Eliminar Usuario**\n  - Sistema de eliminación seguro con advertencias\n  - Confirmación obligatoria con checkbox\n  - Protección contra auto-eliminación\n  - Protección del último superusuario\n- **Sistema AJAX completo**\n  - Sin recargas de página\n  - Respuestas rápidas\n  - Experiencia fluida\n\n### 🗑️ Gestión de Cuentas\n- **Eliminación con período de gracia (30 días)**\n  - Desactivación inmediata con opción de cancelar\n  - Reactivación automática al iniciar sesión\n  - Email de notificación con fecha de eliminación\n  \n- **Eliminación inmediata**\n  - Sin posibilidad de recuperación\n  - Múltiples confirmaciones de seguridad\n  - Email de confirmación\n  \n- **Exportación de datos en JSON**\n  - Información personal completa\n  - Historial de sesiones (últimas 50)\n  - Descarga instantánea\n\n### 📧 Notificaciones por Email\n- Login desde nuevo dispositivo\n- Cambio de contraseña\n- Eliminación/desactivación de cuenta\n- Verificación de email\n- Diseño HTML profesional y responsive\n- **Texto plano en desarrollo** - sin HTML en la consola\n- **Fechas en hora local** - zona horaria Colombia (UTC-5)\n\n### 🌍 Sistema de Zona Horaria\n- **Filtros personalizados de Django**\n  - 6 filtros: localtime, local_datetime, local_date, local_time, timezone_name, timezone_offset\n  - 2 template tags: current_timezone, now_local\n- **Conversión automática UTC → America/Bogota**\n  - Todas las fechas en hora de Colombia\n  - Formato 12 horas (AM/PM) familiar\n  - Fechas legibles en español\n- **15 templates actualizados**\n  - 6 templates de email con fechas locales\n  - 8 templates de interfaz con fechas locales\n  - Formato consistente en toda la aplicación\n\n### 🎨 Modales Personalizados\n- **Reemplazo completo de alerts/confirms nativos**\n  - Diseño Bootstrap 5 consistente\n  - Mejor experiencia de usuario\n  - Soporte para async/await\n- **5 tipos de modales**\n  - Success, Error, Warning, Info, Confirm\n  - Iconos descriptivos\n  - Colores según tipo de mensaje\n- **Sistema unificado**\n  - Atributos data-confirm en forms\n  - Manejo automático de confirmaciones\n  - Disponible en toda la aplicación\n\n### 🔒 Seguridad\n- 7 capas de validación para eliminación de cuenta\n- Protección CSRF en todos los formularios\n- Tokens únicos para acciones críticas\n- Validación lado cliente y servidor\n- Rate limiting preparado\n\n### 🎨 Arquitectura Frontend\n- **Separación de responsabilidades**: HTML, CSS y JavaScript en archivos independientes\n- **Archivos estáticos optimizados**: CSS y JS externos para mejor cacheo\n- **Organización modular**: \n  - 7 archivos CSS específicos por funcionalidad\n  - 8 archivos JavaScript con lógica separada\n- **Rendimiento mejorado**: Archivos estáticos cacheables por navegador\n- **Mantenibilidad**: Código centralizado y reutilizable\n\n---\n\n## 📦 Requisitos del Sistema\n\n- **Python**: 3.14+\n- **MySQL**: 8.0+ (opcional, puede usar SQLite)\n- **SO**: macOS, Linux o Windows\n\n### Dependencias Principales\n```\nDjango==5.2.7\nmysqlclient==2.2.7\nmysql-connector-python==9.4.0\nPyMySQL==1.1.2\n```\n\n---\n\n## 🚀 Instalación Rápida\n\n### Opción 1: Scripts Automáticos (Recomendado)\n\n#### 🍎 **macOS / Linux**\n```bash\nchmod +x start_server.sh\n./start_server.sh\n```\n\n#### 🪟 **Windows**\n```cmd\nstart_server.bat\n```\n\n#### 🐍 **Multiplataforma (Python)**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\npython3 start_server.py\n```\n\n**🪟 Windows:**\n```cmd\npython start_server.py\n```\n\nLos scripts realizan automáticamente:\n- ✅ Detección y configuración de MySQL\n- ✅ Creación del entorno virtual\n- ✅ Instalación de dependencias\n- ✅ Ejecución de migraciones\n- ✅ Inicio del servidor\n- ✅ Apertura del navegador\n\n---\n\n### Opción 2: Instalación Manual\n\n#### **1. Crear entorno virtual**\n\n**🍎 macOS ARM (M1/M2/M3) / Linux:**\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\n```\n\n**🪟 Windows:**\n```cmd\npython -m venv .venv\n.venv\\Scripts\\activate\n```\n\n#### **2. Instalar dependencias**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\npip3 install --upgrade pip\npip3 install -r requirements.txt\n```\n\n**🪟 Windows:**\n```cmd\npip install --upgrade pip\npip install -r requirements.txt\n```\n\n#### **3. Configurar base de datos**\nVer sección [Configuración de Base de Datos](#️-configuración-de-base-de-datos)\n\n#### **4. Ejecutar migraciones**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\npython3 manage.py makemigrations\npython3 manage.py migrate\n```\n\n**🪟 Windows:**\n```cmd\npython manage.py makemigrations\npython manage.py migrate\n```\n\n#### **5. Crear datos de prueba (opcional)**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\npython3 manage.py crear_datos_prueba\n```\n\n**🪟 Windows:**\n```cmd\npython manage.py crear_datos_prueba\n```\n\n#### **6. Crear superusuario**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\npython3 manage.py createsuperuser\n```\n\n**🪟 Windows:**\n```cmd\npython manage.py createsuperuser\n```\n\n#### **7. Iniciar servidor**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\npython3 manage.py runserver\n```\n\n**🪟 Windows:**\n```cmd\npython manage.py runserver\n```\n\n**Acceso**:\n- Aplicación: http://127.0.0.1:8000/\n- Admin: http://127.0.0.1:8000/admin/\n\n---\n\n## 📁 Estructura del Proyecto\n\n```\nkitty_project/\n├── kitty_glow/                      # Proyecto Django principal\n│   ├── settings.py                  # Configuración\n│   ├── local_settings.py            # Config. desarrollo\n│   ├── cloud_settings.py            # Config. producción\n│   ├── logging_settings.py          # Config. logs\n│   ├── urls.py                      # Rutas principales\n│   ├── wsgi.py / asgi.py           # Puntos de entrada\n│   ├── static/                      # Archivos estáticos globales\n│   │   └── js/\n│   │       ├── confirmHandlers.js   # Manejo de confirmaciones con data-confirm\n│   │       ├── customModals.js      # Sistema de modales personalizados\n│   │       ├── initializeDataTables.js\n│   │       └── themeBasedOnPreference.js\n│   ├── templates/\n│   │   └── base.html                # Template base (incluye modales globales)\n│   └── templatetags/                # Template tags personalizados\n│       ├── __init__.py              # Package marker\n│       └── timezone_filters.py      # Filtros de zona horaria\n│\n├── accounts/                        # App de autenticación\n│   ├── models.py                    # CustomUser, UserRole, LoginHistory\n│   ├── views.py                     # Vistas de auth\n│   ├── forms.py                     # Formularios\n│   ├── validators.py                # Validador de contraseñas\n│   ├── admin.py                     # Admin personalizado\n│   ├── urls.py                      # Rutas de accounts\n│   ├── management/\n│   │   └── commands/\n│   │       └── delete_expired_accounts.py  # Limpieza automática\n│   ├── migrations/\n│   ├── static/\n│   │   └── accounts/\n│   │       ├── css/                 # Estilos específicos de accounts\n│   │       │   ├── active_sessions.css\n│   │       │   ├── auth.css\n│   │       │   ├── change_password.css\n│   │       │   ├── dashboard.css\n│   │       │   ├── delete_account.css\n│   │       │   ├── password_reset.css\n│   │       │   └── password_reset_confirm.css\n│   │       └── js/                  # Scripts específicos de accounts\n│   │           ├── active_sessions.js\n│   │           ├── auth.js\n│   │           ├── change_password.js\n│   │           ├── dashboard.js\n│   │           ├── delete_account.js\n│   │           ├── password_reset_confirm.js\n│   │           ├── register.js\n│   │           └── user-list.js\n│   └── templates/\n│       └── accounts/\n│           ├── login.html\n│           ├── register.html\n│           ├── dashboard.html\n│           ├── profile.html\n│           ├── delete_account.html\n│           ├── password_reset_request.html\n│           ├── password_reset_confirm.html\n│           └── emails/\n│               ├── verification_email.html\n│               ├── password_reset_email.html\n│               ├── login_notification.html\n│               ├── password_changed_notification.html\n│               ├── account_deleted_notification.html\n│               └── account_deactivation_notification.html\n│\n├── productos/                       # App de e-commerce\n│   ├── models.py                    # Producto, Categoria, etc.\n│   ├── views.py                     # Vistas públicas\n│   ├── views_crud.py                # Vistas CRUD (admin)\n│   ├── admin.py\n│   ├── migrations/\n│   ├── management/\n│   │   └── commands/\n│   │       └── crear_datos_prueba.py  # 15 productos de prueba\n│   ├── static/\n│   │   └── productos/\n│   └── templates/\n│       └── productos/\n├── SQL/MySQL/                       # Scripts SQL\n│   ├── Model/\n│   │   └── Database_Model.mwb\n│   └── Scripts/\n│       ├── CreateDB.sql\n│       ├── DropDB.sql\n│       ├── ModelDB.sql\n│       └── QueriesDB.sql\n│\n├── manage.py                        # Utilidad Django\n├── requirements.txt                 # Dependencias\n├── runtime.txt                      # Versión Python\n├── Procfile                         # Despliegue\n├── nixpacks.toml                   # Config Nixpacks\n│\n├── start_server.sh                  # Script inicio (macOS/Linux)\n├── start_server.bat                 # Script inicio (Windows)\n├── start_server.py                  # Script inicio (Python)\n├── start_server_backup.sh          # Backup del script\n│\n├── create_default_superuser.py     # Crear superuser automático\n├── verify_implementation.sh        # Verificar implementación\n│\n├── SEPARACION_CSS_JS.md            # Documentación separación CSS/JS\n├── .env                            # Variables de entorno (no versionado)\n├── .gitignore\n├── LICENSE\n└── README.md                       # Este archivo\n```\n\n---\n\n## 🗄️ Configuración de Base de Datos\n\n### MySQL (Configuración por Defecto)\n\n**Parámetros**:\n- Base de datos: `kitty_glow_db`\n- Host: `localhost`\n- Puerto: `3307`\n- Usuario: `root`\n- Password: `**********`\n\n### Instalación de MySQL por Sistema Operativo\n\n#### 🍎 **macOS ARM (M1/M2/M3)**\n\n**Paso 1: Instalar MySQL**\n```bash\n# Opción A: Con Homebrew (recomendado)\nbrew install mysql\nbrew services start mysql\n\n# Opción B: Instalador oficial\n# Descargar desde: https://dev.mysql.com/downloads/mysql/\n```\n\n**Paso 2: Configurar variables de entorno**\n\nPara macOS con chips Apple Silicon, agrega estas variables a `~/.zprofile`:\n\n```bash\n# MySQL Configuration para Apple Silicon\nexport PATH=\"/usr/local/mysql/bin:$PATH\"\nexport MYSQLCLIENT_CFLAGS=\"-I/usr/local/mysql/include\"\nexport MYSQLCLIENT_LDFLAGS=\"-L/usr/local/mysql/lib -lmysqlclient\"\nexport PKG_CONFIG_PATH=\"/usr/local/mysql/lib/pkgconfig\"\nexport DYLD_LIBRARY_PATH=\"/usr/local/mysql/lib:$DYLD_LIBRARY_PATH\"\nexport DYLD_FALLBACK_LIBRARY_PATH=\"/usr/local/mysql/lib:$DYLD_FALLBACK_LIBRARY_PATH\"\n```\n\n**Paso 3: Recargar configuración**\n```bash\nsource ~/.zprofile\n```\n\n#### 🐧 **Linux (Ubuntu/Debian)**\n\n```bash\n# Actualizar repositorios\nsudo apt update\n\n# Instalar MySQL Server\nsudo apt install mysql-server\n\n# Iniciar servicio\nsudo systemctl start mysql\nsudo systemctl enable mysql\n\n# Configurar seguridad\nsudo mysql_secure_installation\n```\n\n#### 🪟 **Windows**\n\n1. Descargar MySQL Installer desde: https://dev.mysql.com/downloads/installer/\n2. Ejecutar el instalador\n3. Seleccionar \"Developer Default\" o \"Custom\"\n4. Configurar contraseña de root\n5. Completar instalación\n6. MySQL se ejecutará como servicio automáticamente\n\n### SQLite (Alternativa Simple)\n\nPara desarrollo sin MySQL, modifica `kitty_glow/settings.py`:\n\n```python\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': BASE_DIR / 'db.sqlite3',\n    }\n}\n```\n\n**Ventajas de SQLite**:\n- ✅ Sin instalación adicional\n- ✅ Sin configuración de variables\n- ✅ Base de datos en un solo archivo\n- ✅ Perfecto para desarrollo\n\n---\n\n## 🔐 Sistema de Autenticación\n\n### Login Flexible: Email o Username\n\nEl sistema permite iniciar sesión usando **email o nombre de usuario** de forma automática:\n\n**Características**:\n- ✅ **Detección automática**: No requiere selector manual\n- ✅ **Una sola caja de texto**: Mejora la experiencia de usuario\n- ✅ **Seguridad preservada**: No revela si email/username existe\n- ✅ **Compatible**: Funciona con todo el sistema de autenticación Django\n\n**Cómo funciona**:\n```python\n# El usuario puede ingresar cualquiera de estos:\n\"usuario123\"           # Username → se usa directamente\n\"user@example.com\"     # Email → se busca el username asociado\n\n# El sistema detecta automáticamente si hay '@' en el input\n# y convierte el email a username antes de autenticar\n```\n\n**Ejemplo de uso**:\n```\nUsuario puede hacer login con:\n  • Username: \"juan_perez\"\n  • Email:    \"juan@example.com\"\n\nAmbas opciones son válidas y funcionan correctamente ✅\n```\n\n**Seguridad**:\n- Mensaje genérico de error: \"Credenciales inválidas\"\n- No revela si el email o username existe en la base de datos\n- Registra todos los intentos en `LoginHistory` (exitosos y fallidos)\n\n### Validación de Contraseñas\n\nValidador personalizado con **8 requisitos estrictos**:\n\n1. ✅ **Longitud**: 8-20 caracteres\n2. ✅ **Letra mayúscula**: Al menos una (A-Z)\n3. ✅ **Letra minúscula**: Al menos una (a-z)\n4. ✅ **Carácter especial**: Al menos uno (`!¡@#$%^\u0026*.-_+(){}[]:;\u003c\u003e?,/\\|~`)\n5. ✅ **Sin espacios**: No se permiten espacios en blanco ni emojis\n6. ✅ **Diferente a la anterior**: Debe ser diferente a la contraseña actual (al cambiar/restablecer)\n7. ✅ **No similar a datos personales**: No puede ser similar a username, email o nombre\n8. ✅ **Sin caracteres consecutivos**: No permite patrones repetitivos como:\n   - Caracteres idénticos: `aaa`, `111`, `AAA`, `!!!`\n   - Secuencias alfabéticas: `abc`, `xyz`, `ABC`, `XYZ`\n   - Secuencias numéricas: `123`, `789`, `456`, `234`\n\n**Ejemplos de contraseñas válidas**: `Kitty@2024`, `Glow@2w4x`, `Pass@1w4r`\n\n**Ejemplos de contraseñas inválidas**:\n- `Pass@aaa1` ❌ (caracteres idénticos consecutivos)\n- `Pass@123` ❌ (secuencia numérica consecutiva)\n- `Pass@abc` ❌ (secuencia alfabética consecutiva)\n- `Andres@2024` ❌ (similar al nombre del usuario)\n\n**Validación en tiempo real**: \n- Templates de registro y restablecimiento incluyen validación JavaScript\n- Feedback visual instantáneo (indicadores verdes/rojos)\n- Mensajes de ayuda claros y específicos\n\n### Verificación de Email\n\n**Flujo**:\n1. Usuario se registra → cuenta creada con `is_active=False`\n2. Email de verificación enviado automáticamente\n3. Usuario hace clic en enlace único con token\n4. Cuenta activada → puede iniciar sesión\n\n**Template**: `accounts/templates/accounts/emails/verification_email.html`\n\n### Restablecimiento de Contraseña\n\n**Flujo**:\n1. Usuario hace clic en \"¿Olvidaste tu contraseña?\"\n2. Ingresa su email\n3. Recibe email con enlace único (válido 1 hora)\n4. Crea nueva contraseña (con validación en tiempo real)\n5. Recibe email de confirmación de cambio\n\n**Templates**:\n- `password_reset_request.html` - Formulario de solicitud\n- `password_reset_confirm.html` - Formulario de nueva contraseña\n- `emails/password_reset_email.html` - Email con enlace\n\n### Configuración de Sesiones\n\n```python\nSESSION_COOKIE_AGE = 1800              # 30 minutos\nSESSION_EXPIRE_AT_BROWSER_CLOSE = True # Expira al cerrar navegador\nSESSION_SAVE_EVERY_REQUEST = True      # Renueva con cada request\n```\n\n**Comportamiento**:\n- Sin \"Recordarme\": expira al cerrar navegador o 30 min inactividad\n- Con \"Recordarme\": dura 2 semanas\n\n### Sistema de Roles\n\n**Roles disponibles**:\n- `ADMIN`: Administrador del sistema\n- `USER`: Usuario estándar\n- `MODERATOR`: Moderador\n- `GUEST`: Invitado\n\n**Métodos de verificación**:\n```python\nuser.is_admin()       # True si es admin\nuser.is_moderator()   # True si es moderador\nuser.get_role_display()  # Nombre del rol\n```\n\n### URLs de Autenticación\n\n```\n/accounts/login/                          # Iniciar sesión (email o username)\n/accounts/register/                       # Registro\n/accounts/logout/                         # Cerrar sesión\n/accounts/verify-email/\u003cuidb64\u003e/\u003ctoken\u003e/  # Verificar email\n/accounts/reset-password/                 # Solicitar reset\n/accounts/reset-password/\u003cuidb64\u003e/\u003ctoken\u003e/ # Crear nueva contraseña\n/accounts/dashboard/                      # Panel usuario\n/accounts/admin/dashboard/                # Panel admin\n/accounts/profile/                        # Editar perfil\n/accounts/change-password/                # Cambiar contraseña (con logout)\n/accounts/active-sessions/                # Ver y gestionar sesiones activas\n/accounts/close-session/\u003cid\u003e/             # Cerrar sesión específica\n/accounts/close-all-sessions/             # Cerrar todas las sesiones excepto actual\n/accounts/users/                          # Lista usuarios (admin)\n/accounts/admin/user/\u003cid\u003e/view/           # Ver detalles usuario (AJAX)\n/accounts/admin/user/\u003cid\u003e/edit/           # Editar usuario (AJAX)\n/accounts/admin/user/\u003cid\u003e/delete/         # Eliminar usuario (AJAX)\n```\n\n---\n\n## 🗑️ Gestión de Cuentas de Usuario\n\n### Eliminación con Período de Gracia (30 días)\n\n**Características**:\n- ✅ Cuenta desactivada inmediatamente (no puede iniciar sesión)\n- ✅ Eliminación automática después de 30 días\n- ✅ Email de notificación con fecha de eliminación\n- ✅ **Cancelación sencilla**: solo iniciar sesión antes de la fecha\n- ✅ Reactivación automática al hacer login\n\n**Proceso**:\n1. Usuario va a Perfil → \"Zona de Peligro\" → \"Eliminar mi cuenta\"\n2. Lee advertencias y consecuencias\n3. Ingresa contraseña\n4. Escribe \"ELIMINAR MI CUENTA\"\n5. Hace clic en \"Desactivar (30 días de gracia)\"\n6. Confirma en alerta JavaScript\n7. Cuenta desactivada + email enviado + logout\n8. Usuario puede cancelar iniciando sesión en cualquier momento\n\n**Campos del modelo**:\n```python\nis_pending_deletion = BooleanField(default=False)\ndeletion_requested_at = DateTimeField(null=True, blank=True)\nscheduled_deletion_date = DateTimeField(null=True, blank=True)\n```\n\n### Eliminación Inmediata\n\n**Características**:\n- ✅ Eliminación instantánea y permanente\n- ✅ Sin posibilidad de recuperación\n- ✅ Requiere confirmación adicional (checkbox)\n- ✅ Doble confirmación JavaScript\n- ✅ Email de notificación enviado\n\n**Proceso**:\n1. Mismo inicio que período de gracia\n2. Marca checkbox \"Entiendo que es irreversible\"\n3. Hace clic en \"Eliminar Inmediatamente\"\n4. Confirma en primera alerta\n5. Confirma en segunda alerta (más seria)\n6. Cuenta eliminada permanentemente\n\n### Exportación de Datos (JSON)\n\n**Información exportada**:\n```json\n{\n  \"informacion_personal\": {\n    \"username\": \"...\", \"email\": \"...\", \n    \"nombre\": \"...\", \"apellido\": \"...\",\n    \"telefono\": \"...\", \"fecha_nacimiento\": \"...\",\n    \"biografia\": \"...\", \"direccion\": \"...\",\n    \"ciudad\": \"...\", \"pais\": \"...\", \"codigo_postal\": \"...\"\n  },\n  \"informacion_cuenta\": {\n    \"fecha_registro\": \"...\", \n    \"ultima_actualizacion\": \"...\",\n    \"email_verificado\": true/false,\n    \"rol\": \"...\", \"activo\": true/false\n  },\n  \"historial_sesiones\": [\n    {\"ip\": \"...\", \"navegador\": \"...\", \n     \"fecha\": \"...\", \"exitoso\": true/false}\n  ]\n}\n```\n\n**Acceso**: \n- Botón en página de eliminación\n- URL directa: `/accounts/export-data/`\n- Nombre de archivo: `datos_usuario_[username]_[timestamp].json`\n\n### Seguridad de Eliminación\n\n**7 Capas de Validación**:\n1. ✅ Login requerido (`@login_required`)\n2. ✅ Protección CSRF (`@csrf_protect`)\n3. ✅ Verificación de contraseña\n4. ✅ Confirmación textual (\"ELIMINAR MI CUENTA\")\n5. ✅ Checkbox adicional (eliminación inmediata)\n6. ✅ Primera alerta JavaScript\n7. ✅ Segunda alerta (eliminación inmediata)\n\n### Comando de Mantenimiento\n\n**Eliminar cuentas vencidas**:\n```bash\npython manage.py delete_expired_accounts\n```\n\nEste comando:\n- Busca cuentas con `is_pending_deletion=True` y fecha vencida\n- Envía email final de notificación\n- Elimina la cuenta permanentemente\n- Muestra resumen de cuentas eliminadas\n\n**Configurar en crontab** (producción):\n```bash\ncrontab -e\n\n# Agregar:\n0 2 * * * cd /ruta/kitty_project \u0026\u0026 source .venv/bin/activate \u0026\u0026 python manage.py delete_expired_accounts\n```\n\n### URLs de Gestión de Cuenta\n\n```\n/accounts/delete-account/     # Página de eliminación\n/accounts/cancel-deletion/    # Cancelar eliminación programada\n/accounts/export-data/        # Descargar datos en JSON\n```\n\n---\n\n## 📧 Notificaciones por Email\n\n### Emails Implementados\n\n#### 1. **Verificación de Email** (Registro)\n- **Cuándo**: Al registrar nueva cuenta\n- **Contenido**: Enlace de verificación único con token\n- **Validez**: 24 horas (informado), real ~3 días\n- **Template**: `emails/verification_email.html`\n\n#### 2. **Restablecimiento de Contraseña**\n- **Cuándo**: Al solicitar \"¿Olvidaste tu contraseña?\"\n- **Contenido**: Enlace único para crear nueva contraseña\n- **Validez**: 1 hora (informado)\n- **Template**: `emails/password_reset_email.html`\n\n#### 3. **Notificación de Login**\n- **Cuándo**: Cada inicio de sesión exitoso\n- **Contenido**: \n  - Fecha y hora del login\n  - Dirección IP\n  - Información del navegador/dispositivo\n  - Advertencia si no fue el usuario\n- **Template**: `emails/login_notification.html`\n- **Función**: `send_login_notification()`\n\n#### 4. **Cambio de Contraseña**\n- **Cuándo**: Al cambiar contraseña (reset o desde perfil)\n- **Contenido**:\n  - Confirmación del cambio\n  - Fecha, hora, IP, dispositivo\n  - Consejos de seguridad\n  - Advertencia crítica si no fue el usuario\n- **Template**: `emails/password_changed_notification.html`\n- **Función**: `send_password_changed_notification()`\n\n#### 5. **Desactivación de Cuenta** (Período de Gracia)\n- **Cuándo**: Al desactivar cuenta con período de 30 días\n- **Contenido**:\n  - Fecha de desactivación\n  - Fecha de eliminación programada\n  - Días restantes\n  - Botón para reactivar\n  - Instrucciones de cancelación\n- **Template**: `emails/account_deactivation_notification.html`\n- **Función**: `send_account_deactivation_notification()`\n\n#### 6. **Eliminación de Cuenta**\n- **Cuándo**: Al eliminar cuenta (inmediata o después de 30 días)\n- **Contenido**:\n  - Confirmación de eliminación permanente\n  - Fecha y hora\n  - Mensaje de despedida\n  - Advertencia de seguridad\n- **Template**: `emails/account_deleted_notification.html`\n- **Función**: `send_account_deletion_notification()`\n\n### Configuración de Email\n\n#### Desarrollo (IS_DEPLOYED=False)\n```python\nEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'\n```\nLos emails se muestran en la **consola/terminal**.\n\n#### Producción (IS_DEPLOYED=True)\n```python\nEMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'\nEMAIL_HOST = 'smtp.gmail.com'\nEMAIL_PORT = 587\nEMAIL_USE_TLS = True\nEMAIL_HOST_USER = 'tu-email@gmail.com'\nEMAIL_HOST_PASSWORD = '****************'  # App Password\n```\n\n**Configurar en `.env`**:\n```env\nIS_DEPLOYED=False  # True para producción\nEMAIL_HOST_USER=tu-email@gmail.com\nEMAIL_HOST_PASSWORD=****************\n```\n\n### Características de los Emails\n\n- ✅ **Diseño HTML profesional** con estilos inline\n- ✅ **Responsive** - compatible con todos los clientes\n- ✅ **Texto plano en desarrollo** - emails limpios en la terminal sin HTML\n- ✅ **HTML completo en producción** - con estilos, colores y formato visual\n- ✅ **Seguridad visual** - íconos, colores, advertencias\n- ✅ **Información detallada** - fecha, hora, IP, dispositivo\n- ✅ **Consejos de seguridad** incluidos\n- ✅ **Fail-safe** - errores no interrumpen operaciones principales\n\n### Formato de Emails\n\nEl sistema envía **dos versiones** de cada email mediante la función `send_html_email()`:\n\n#### 📧 **En DESARROLLO** (`IS_DEPLOYED=False`)\n- Usa `send_mail()` simple\n- Envía **SOLO texto plano** a la consola\n- Sin código HTML visible\n- Contenido limpio y legible\n\n**Ejemplo en consola**:\n```\nNotificación de inicio de sesión\n\nHola Juan Pérez,\n\nSe ha detectado un inicio de sesión en tu cuenta:\n\n  • Fecha: 04/11/2025 a las 15:30:00\n  • IP: 192.168.1.100\n  • Navegador: Chrome/120.0\n\nSi no fuiste tú, cambia tu contraseña inmediatamente.\n\nSaludos,\nEquipo Kitty Glow\n```\n\n#### 🌐 **En PRODUCCIÓN** (`IS_DEPLOYED=True`)\n- Usa `EmailMultiAlternatives`\n- Envía **formato multipart/alternative**:\n  - **Parte 1**: Texto plano (fallback)\n  - **Parte 2**: HTML con estilos completos\n- Clientes modernos (Gmail, Outlook) muestran versión HTML\n- Clientes antiguos muestran versión de texto plano\n\n**Estructura del email en producción**:\n```\nContent-Type: multipart/alternative\n\n--boundary--\nContent-Type: text/plain\n[Versión de texto plano]\n\n--boundary--\nContent-Type: text/html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003cstyle\u003e\n      .header { background: linear-gradient(#667eea, #764ba2); }\n      .button { background: #667eea; color: white; }\n    \u003c/style\u003e\n  \u003c/head\u003e\n  \u003cbody\u003e\n    \u003c!-- Email con diseño profesional, colores, botones --\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n--boundary--\n```\n\n**Conversión automática HTML → Texto Plano**:\n- Función `html_to_plain_text()` en `accounts/views.py`\n- Elimina tags HTML: `\u003cp\u003e`, `\u003cstrong\u003e`, `\u003cdiv\u003e`, etc.\n- Convierte `\u003cli\u003e` a bullets (•)\n- Preserva saltos de línea y estructura\n- Limpia espacios múltiples\n\n---\n\n## 🗂️ Modelos de Datos\n\n### Accounts App\n\n#### **CustomUser**\n```python\n# Campos de AbstractUser + adicionales:\nrole = ForeignKey(UserRole)              # Rol del usuario\nphone_number = CharField                  # Teléfono\nbirth_date = DateField                    # Fecha de nacimiento\navatar = ImageField                       # Foto de perfil\nbio = TextField                           # Biografía\naddress / city / country / postal_code   # Dirección completa\nemail_verified = BooleanField            # Email verificado\nlast_login_ip = GenericIPAddressField    # Última IP\nis_pending_deletion = BooleanField       # Pendiente eliminación\ndeletion_requested_at = DateTimeField    # Fecha solicitud\nscheduled_deletion_date = DateTimeField  # Fecha programada\ncreated_at / updated_at                  # Timestamps\n```\n\n#### **UserRole**\n```python\nname = CharField(choices=ROLE_CHOICES)   # ADMIN, USER, MODERATOR, GUEST\ndescription = TextField                   # Descripción del rol\npermissions = JSONField                   # Permisos personalizados\ncreated_at / updated_at                  # Timestamps\n```\n\n#### **LoginHistory**\n```python\nuser = ForeignKey(CustomUser)            # Usuario\nip_address = GenericIPAddressField       # IP del login\nuser_agent = CharField                    # Navegador/dispositivo\nlogin_time = DateTimeField               # Fecha/hora de login\nlogout_time = DateTimeField              # Fecha/hora de logout\nsuccess = BooleanField                   # Login exitoso/fallido\n```\n\n#### **ActiveSession**\n```python\nuser = ForeignKey(CustomUser)            # Usuario\nsession_key = CharField(unique=True)     # Clave de sesión Django\nip_address = GenericIPAddressField       # IP de la sesión\nuser_agent = TextField                    # User-Agent completo\ndevice_info = CharField                   # Tipo de dispositivo (Desktop, Mobile, Tablet)\nbrowser_info = CharField                  # Navegador (Chrome, Firefox, Safari, etc.)\nlocation = CharField                      # Ubicación (opcional)\ncreated_at = DateTimeField               # Inicio de sesión\nlast_activity = DateTimeField            # Última actividad\nis_current = BooleanField                # Marca sesión actual\n\n# Métodos\nget_device_icon()                        # Retorna ícono FontAwesome\nget_browser_name()                       # Extrae nombre del navegador\nget_os_name()                            # Extrae nombre del SO\n```\n\n### Productos App\n\n#### **Categoria**\n```python\nnombre = CharField(max_length=100)\ndescripcion = TextField\n```\n\n#### **Producto**\n```python\nnombre = CharField(max_length=200)\ndescripcion = TextField\nprecio = DecimalField(max_digits=10, decimal_places=2)\nstock = IntegerField\nimagen = ImageField\ncategorias = ManyToManyField(Categoria)\nfecha_creacion = DateTimeField\nactivo = BooleanField\n```\n\n#### **Pedido**\n```python\nusuario = ForeignKey(CustomUser)\nfecha_pedido = DateTimeField\ntotal = DecimalField\nestado = CharField  # PENDIENTE, PROCESANDO, ENVIADO, ENTREGADO\n```\n\n#### **DetallePedido**\n```python\npedido = ForeignKey(Pedido)\nproducto = ForeignKey(Producto)\ncantidad = IntegerField\nprecio_unitario = DecimalField\n```\n\n#### **Reseña**\n```python\nproducto = ForeignKey(Producto)\nusuario = ForeignKey(CustomUser)\ncalificacion = IntegerField(1-5)\ncomentario = TextField\nfecha_reseña = DateTimeField\n```\n\n---\n\n## ⚙️ Comandos Útiles\n\n### Gestión del Proyecto\n\n#### **Activar entorno virtual**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\nsource .venv/bin/activate\n```\n\n**🪟 Windows (CMD):**\n```cmd\n.venv\\Scripts\\activate\n```\n\n**🪟 Windows (PowerShell):**\n```powershell\n.venv\\Scripts\\Activate.ps1\n```\n\n#### **Ejecutar servidor**\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Puerto por defecto (8000)\npython3 manage.py runserver\n\n# Puerto específico\npython3 manage.py runserver 8080\n\n# Accesible desde red local\npython3 manage.py runserver 0.0.0.0:8000\n```\n\n**🪟 Windows:**\n```cmd\n# Puerto por defecto (8000)\npython manage.py runserver\n\n# Puerto específico\npython manage.py runserver 8080\n\n# Accesible desde red local\npython manage.py runserver 0.0.0.0:8000\n```\n\n### Migraciones\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Crear migraciones\npython3 manage.py makemigrations\npython3 manage.py makemigrations accounts\npython3 manage.py makemigrations productos\n\n# Aplicar migraciones\npython3 manage.py migrate\n\n# Ver SQL de una migración\npython3 manage.py sqlmigrate accounts 0001\n\n# Ver estado de migraciones\npython3 manage.py showmigrations\n```\n\n**🪟 Windows:**\n```cmd\n# Crear migraciones\npython manage.py makemigrations\npython manage.py makemigrations accounts\npython manage.py makemigrations productos\n\n# Aplicar migraciones\npython manage.py migrate\n\n# Ver SQL de una migración\npython manage.py sqlmigrate accounts 0001\n\n# Ver estado de migraciones\npython manage.py showmigrations\n```\n\n### Administración\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Crear superusuario\npython3 manage.py createsuperuser\n\n# O automáticamente (desarrollo)\npython3 create_default_superuser.py\n\n# Shell de Django\npython3 manage.py shell\n\n# Shell de base de datos\npython3 manage.py dbshell\n```\n\n**🪟 Windows:**\n```cmd\n# Crear superusuario\npython manage.py createsuperuser\n\n# O automáticamente (desarrollo)\npython create_default_superuser.py\n\n# Shell de Django\npython manage.py shell\n\n# Shell de base de datos\npython manage.py dbshell\n```\n\n### Datos de Prueba\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Crear 15 productos en 5 categorías\npython3 manage.py crear_datos_prueba\n```\n\n**🪟 Windows:**\n```cmd\n# Crear 15 productos en 5 categorías\npython manage.py crear_datos_prueba\n```\n\n### Gestión de Cuentas\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Eliminar cuentas vencidas (período de gracia)\npython3 manage.py delete_expired_accounts\n\n# Verificar implementación\n./verify_implementation.sh\n```\n\n**🪟 Windows:**\n```cmd\n# Eliminar cuentas vencidas (período de gracia)\npython manage.py delete_expired_accounts\n\n# Verificar implementación\npython verify_implementation.py\n```\n\n### Pruebas\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Todas las pruebas\npython3 manage.py test\n\n# App específica\npython3 manage.py test accounts\npython3 manage.py test productos\n\n# Con verbosidad\npython3 manage.py test --verbosity=2\n```\n\n**🪟 Windows:**\n```cmd\n# Todas las pruebas\npython manage.py test\n\n# App específica\npython manage.py test accounts\npython manage.py test productos\n\n# Con verbosidad\npython manage.py test --verbosity=2\n```\n\n### Archivos Estáticos\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Recolectar archivos estáticos\npython3 manage.py collectstatic\n\n# Limpiar archivos estáticos\npython3 manage.py collectstatic --clear\n```\n\n**🪟 Windows:**\n```cmd\n# Recolectar archivos estáticos\npython manage.py collectstatic\n\n# Limpiar archivos estáticos\npython manage.py collectstatic --clear\n```\n\n**Estructura de archivos estáticos**:\n```\naccounts/static/accounts/\n├── css/\n│   ├── active_sessions.css       # Estilos para sesiones activas\n│   ├── auth.css                  # Estilos de autenticación\n│   ├── change_password.css       # Estilos cambio de contraseña\n│   ├── dashboard.css             # Estilos del dashboard\n│   ├── delete_account.css        # Estilos eliminación de cuenta\n│   ├── password_reset.css        # Estilos reset de contraseña\n│   └── password_reset_confirm.css # Estilos confirmación reset\n└── js/\n    ├── active_sessions.js        # Auto-actualización sesiones\n    ├── auth.js                   # Lógica de autenticación\n    ├── change_password.js        # Validación cambio contraseña\n    ├── dashboard.js              # Funcionalidad dashboard\n    ├── delete_account.js         # Validación eliminación cuenta\n    ├── password_reset_confirm.js # Validación en tiempo real (8 requisitos)\n    ├── register.js               # Validación de registro\n    └── user-list.js              # Gestión de lista de usuarios\n```\n\n**Ventajas de la separación CSS/JS**:\n- ✅ **Cacheo**: Navegadores pueden cachear archivos estáticos\n- ✅ **Mantenibilidad**: Código organizado y fácil de actualizar\n- ✅ **Reutilización**: Estilos y scripts compartibles entre templates\n- ✅ **Rendimiento**: Posibilidad de minificar y comprimir\n- ✅ **Legibilidad**: Templates HTML más limpios\n\n**Nota**: Los templates de email (`emails/*.html`) mantienen CSS inline porque los clientes de correo no soportan archivos externos.\n\n---\n\n## 🔧 Solución de Problemas\n\n### 🍎 Problemas en macOS ARM\n\n#### Error: \"Library not loaded: @rpath/libmysqlclient.24.dylib\"\n\n**Causa**: Bibliotecas MySQL no configuradas en macOS Apple Silicon.\n\n**Solución rápida:**\n```bash\n./start_server.sh  # Configura automáticamente\n```\n\n**Solución manual:**\n```bash\n# 1. Instalar MySQL\nbrew install mysql\n\n# 2. Configurar variables en ~/.zprofile (ver sección MySQL)\n\n# 3. Reinstalar mysqlclient\nsource .venv/bin/activate\npip uninstall mysqlclient -y\npip install mysqlclient --no-cache-dir\n```\n\n#### Error: \"mysql_config not found\"\n\n```bash\n# Instalar MySQL con Homebrew\nbrew install mysql\n\n# O descargar instalador oficial\n# https://dev.mysql.com/downloads/mysql/\n```\n\n### 🐧 Problemas en Linux\n\n#### Error: \"No module named 'MySQLdb'\"\n\n```bash\n# Activar entorno virtual\nsource .venv/bin/activate\n\n# Instalar dependencias del sistema\nsudo apt-get install python3-dev default-libmysqlclient-dev build-essential\n\n# Reinstalar mysqlclient\npip install mysqlclient --no-cache-dir\n```\n\n#### Error: \"mysql_config not found\"\n\n```bash\n# Ubuntu/Debian\nsudo apt-get install libmysqlclient-dev\n\n# CentOS/RHEL\nsudo yum install mysql-devel\n```\n\n### 🪟 Problemas en Windows\n\n#### Error: \"No module named 'MySQLdb'\"\n\n```cmd\n# Activar entorno virtual\n.venv\\Scripts\\activate\n\n# Reinstalar mysqlclient\npip install mysqlclient --no-cache-dir\n```\n\nSi persiste el error, usar PyMySQL como alternativa:\n```cmd\npip install pymysql\n```\n\nLuego agregar en `kitty_glow/__init__.py`:\n```python\nimport pymysql\npymysql.install_as_MySQLdb()\n```\n\n### 🌍 Problemas Multiplataforma\n\n#### Entorno Virtual Corrupto\n\n**🍎 macOS / 🐧 Linux:**\n```bash\nrm -rf .venv\n./start_server.sh  # Recrea automáticamente\n```\n\n**🪟 Windows:**\n```cmd\nrmdir /s /q .venv\npython -m venv .venv\n.venv\\Scripts\\activate\npip install -r requirements.txt\n```\n\n### Emails No Se Envían (Desarrollo)\n\n**Verificar**: Los emails se muestran en la **consola**, no en inbox.\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# En desarrollo, ver terminal donde corre el servidor\npython3 manage.py runserver\n# Los emails aparecerán aquí\n```\n\n**🪟 Windows:**\n```cmd\n# En desarrollo, ver terminal donde corre el servidor\npython manage.py runserver\n# Los emails aparecerán aquí\n```\n\n### Error al Hacer Migraciones de Accounts\n\nSi ya tienes datos en la BD y agregaste campos nuevos:\n\n**🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Opción 1: Eliminar BD y recrear (desarrollo)\npython3 manage.py flush\n\n# Opción 2: Migración manual\npython3 manage.py makemigrations accounts\n# Cuando pregunte, proporcionar valores por defecto\npython3 manage.py migrate accounts\n```\n\n**🪟 Windows:**\n```cmd\n# Opción 1: Eliminar BD y recrear (desarrollo)\npython manage.py flush\n\n# Opción 2: Migración manual\npython manage.py makemigrations accounts\n# Cuando pregunte, proporcionar valores por defecto\npython manage.py migrate accounts\n```\n\n---\n\n## 🔒 Seguridad\n\n### Variables de Entorno\n\n**IMPORTANTE**: Nunca versionar credenciales. Usar `.env`:\n\n```env\n# .env (no versionado)\nSECRET_KEY=tu-secret-key-aqui\nIS_DEPLOYED=False\nDEBUG=True\n\n# Base de datos\nDATABASE_NAME=kitty_glow_db\nDATABASE_USER=root\nDATABASE_PASSWORD=**********\nDATABASE_HOST=localhost\nDATABASE_PORT=3307\n\n# Email\nEMAIL_HOST_USER=tu-email@gmail.com\nEMAIL_HOST_PASSWORD=****************\n```\n\n### Configuración de Producción\n\nAntes de desplegar:\n\n```python\n# settings.py\nSECRET_KEY = env('SECRET_KEY')  # Generar nueva\nDEBUG = False\nALLOWED_HOSTS = ['tu-dominio.com', 'www.tu-dominio.com']\n\n# Seguridad HTTPS\nSECURE_SSL_REDIRECT = True\nSESSION_COOKIE_SECURE = True\nCSRF_COOKIE_SECURE = True\nSECURE_HSTS_SECONDS = 31536000\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\n```\n\n### Checklist de Seguridad\n\n- [ ] `SECRET_KEY` única y segura\n- [ ] `DEBUG = False` en producción\n- [ ] `ALLOWED_HOSTS` configurado\n- [ ] HTTPS habilitado\n- [ ] Variables de entorno para credenciales\n- [ ] Validación de contraseñas estricta\n- [ ] Protección CSRF habilitada\n- [ ] Rate limiting implementado\n- [ ] Logs de seguridad configurados\n- [ ] Backups automáticos de BD\n\n---\n\n## 📚 Recursos Adicionales\n\n### Documentación\n- [Django 5.2](https://docs.djangoproject.com/en/5.2/)\n- [MySQL Documentation](https://dev.mysql.com/doc/)\n- [Bootstrap 5](https://getbootstrap.com/docs/5.0/)\n- [Font Awesome](https://fontawesome.com/docs)\n\n### Endpoints Principales\n\n```\n# Públicas\n/                           # Home\n/productos/                 # Catálogo\n/productos/\u003cid\u003e/            # Detalle producto\n/categorias/                # Categorías\n\n# Autenticación\n/accounts/login/            # Login\n/accounts/register/         # Registro\n/accounts/dashboard/        # Dashboard usuario\n\n# Admin\n/admin/                     # Django admin\n/accounts/admin/dashboard/  # Dashboard admin\n/accounts/users/            # Gestión usuarios\n/productos/admin/           # CRUD productos\n\n# Gestión de cuenta\n/accounts/profile/          # Perfil\n/accounts/change-password/  # Cambiar contraseña\n/accounts/active-sessions/  # Ver y gestionar sesiones activas\n/accounts/close-session/\u003cid\u003e/     # Cerrar sesión específica\n/accounts/close-all-sessions/     # Cerrar todas excepto actual\n/accounts/delete-account/   # Eliminar cuenta\n/accounts/export-data/      # Exportar datos\n```\n\n---\n\n## 🤝 Contribución\n\n1. Fork el proyecto\n2. Crea una rama: `git checkout -b feature/nueva-funcionalidad`\n3. Commit: `git commit -m 'Agrega nueva funcionalidad'`\n4. Push: `git push origin feature/nueva-funcionalidad`\n5. Abre un Pull Request\n\n---\n\n## 📄 Licencia\n\nEste proyecto es de código abierto y está disponible para uso educativo y de desarrollo.\n\n---\n\n## 📞 Soporte\n\n### Comandos de Diagnóstico\n\n#### **🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Ver versión de Python\npython3 --version\n\n# Ver paquetes instalados\npip3 list\n\n# Test de MySQLdb\npython3 -c \"import MySQLdb; print('✅ MySQLdb OK')\"\n```\n\n#### **🪟 Windows:**\n```cmd\n# Ver versión de Python\npython --version\n\n# Ver paquetes instalados\npip list\n\n# Test de MySQLdb\npython -c \"import MySQLdb; print('✅ MySQLdb OK')\"\n```\n\n#### **🍎 macOS ARM / 🐧 Linux:**\n```bash\n# Ver variables de entorno MySQL\necho $DYLD_LIBRARY_PATH           # macOS\necho $LD_LIBRARY_PATH             # Linux\n\n# Probar conexión a MySQL\nmysql -u root -p\n\n# Ver ubicación de MySQL\nwhich mysql\nmysql --version\n```\n\n#### **🪟 Windows:**\n```cmd\n# Ver variables de entorno\necho %PATH%\n\n# Probar conexión a MySQL\nmysql -u root -p\n\n# Ver versión de MySQL\nmysql --version\n```\n\n---\n\n**Desarrollado con ❤️ usando Django 5.2.7**\n\n**Última actualización**: 5 de noviembre de 2025  \n**Versión**: 1.1.0  \n**Autor**: Kitty Glow Team\n\n---\n\n## 📝 Registro de Cambios\n\n### Versión 1.1.0 (5 de noviembre de 2025)\n- ✅ **Nuevo**: Sistema completo de gestión de usuarios para administradores\n  - **Modales interactivos** con Bootstrap 5:\n    * **Modal Ver Usuario**: Visualización completa de datos del usuario\n      - Información personal (nombre, email, teléfono, biografía)\n      - Información del sistema (rol, estado, verificación, superusuario)\n      - Estadísticas en tiempo real (reseñas, favoritos, sesiones activas)\n      - Fechas de registro y último acceso en hora local\n    * **Modal Editar Usuario**: Formulario completo de edición\n      - Campos editables: username, email, nombre, apellido, teléfono, biografía\n      - Selector de rol con todos los roles disponibles\n      - Switches para estado activo y email verificado\n      - Validación en tiempo real (username y email únicos)\n      - Feedback inmediato con mensajes de éxito/error\n    * **Modal Eliminar Usuario**: Sistema de eliminación seguro\n      - Advertencias prominentes con diseño rojo\n      - Lista clara de consecuencias de la eliminación\n      - Confirmación obligatoria mediante checkbox\n      - Protecciones: No auto-eliminación, no eliminar último superusuario\n  - **3 nuevas vistas AJAX**:\n    * `user_view_ajax()` - Obtener datos del usuario con estadísticas\n    * `user_edit_ajax()` - GET/POST para edición de usuario\n    * `user_delete_ajax()` - POST para eliminación segura\n  - **3 nuevas URLs AJAX**:\n    * `/accounts/admin/user/\u003cid\u003e/view/`\n    * `/accounts/admin/user/\u003cid\u003e/edit/`\n    * `/accounts/admin/user/\u003cid\u003e/delete/`\n  - **Seguridad multinivel**:\n    * Verificación de permisos de administrador en todas las vistas\n    * Prevención de auto-eliminación (botón oculto + validación backend)\n    * Prevención de eliminar último superusuario del sistema\n    * Validación de username y email únicos\n    * CSRF tokens en todas las peticiones\n  - **JavaScript actualizado**: `user-list.js` (618 líneas)\n    * Lógica completa de modales con fetch API\n    * Manejo de estados de carga con spinners\n    * Formulario de edición dinámico\n    * Modal de eliminación con confirmación obligatoria\n    * Integración con sistema de modales personalizados\n  - **Template actualizado**: `user_list.html` (121+ líneas agregadas)\n    * 3 modales Bootstrap 5 agregados\n    * Botones con data-attributes para interactividad\n    * Integrado con filtros de zona horaria\n    * Diseño responsive y profesional\n\n- ✅ **Nuevo**: Sistema de modales personalizados\n  - **Reemplazo completo de alerts y confirms nativos**:\n    * Eliminados todos los `alert()` y `confirm()` de JavaScript\n    * Reemplazados por modales Bootstrap 5 personalizados\n    * Diseño consistente con el estilo del proyecto\n    * Mejor experiencia de usuario (UX)\n  - **Nuevos archivos JavaScript globales**:\n    * `customModals.js` (8833 líneas de código)\n      - Funciones: `showSuccess()`, `showError()`, `showWarning()`, `showInfo()`, `showConfirm()`\n      - Uso de Promises para compatibilidad async/await\n      - Creación y gestión dinámica de modales\n      - Estilos consistentes con Bootstrap 5\n    * `confirmHandlers.js` (3792 líneas de código)\n      - Manejo automático de atributos `data-confirm` en forms y buttons\n      - Intercepción de submits y clicks para mostrar confirmaciones\n      - Sistema de confirmación unificado para toda la aplicación\n  - **Templates actualizados con data-confirm**:\n    * `active_sessions.html` - Confirmaciones para cerrar sesiones\n    * `cart.html` - Confirmación para eliminar productos del carrito\n    * `edit_review.html` - Confirmación para eliminar reseñas\n    * `my_reviews.html` - Confirmación para eliminar reseñas propias\n  - **JavaScript actualizado con modales personalizados**:\n    * `register.js` - Reemplazado `alert()` con `showWarning()`\n    * `delete_account.js` - Reemplazados `alert()` y `confirm()` con modales\n    * `change_password.js` - Reemplazado `confirm()` con `showConfirm()`\n  - **Integración en base.html**:\n    * Scripts incluidos globalmente para uso en toda la aplicación\n    * Disponibles en cualquier página sin importar módulos adicionales\n\n- ✅ **Nuevo**: Sistema completo de zona horaria\n  - **Filtros personalizados de Django**:\n    * Nuevo paquete: `kitty_glow/templatetags/`\n    * Archivo: `timezone_filters.py` (184 líneas)\n    * **6 filtros de conversión**:\n      - `|localtime` - Convierte datetime UTC a zona horaria local\n      - `|local_datetime` - Fecha y hora formateada en zona local\n      - `|local_date` - Solo fecha formateada en zona local\n      - `|local_time` - Solo hora formateada en zona local\n      - `|timezone_name` - Nombre de la zona horaria\n      - `|timezone_offset` - Offset de la zona horaria\n    * **2 template tags**:\n      - `{% current_timezone %}` - Muestra zona horaria actual\n      - `{% now_local %}` - Fecha/hora actual en zona local\n  - **Configuración de zona horaria**:\n    * `TIME_ZONE = 'America/Bogota'` (UTC-5)\n    * `USE_TZ = True` (timezone-aware)\n    * Conversión automática UTC → Hora local\n  - **15 templates actualizados**:\n    * **Emails (6 archivos)**: login_notification, password_changed_notification, account_deactivation_notification, account_deleted_notification, password_reset_email, verification_email\n    * **Interfaz gráfica (8 archivos)**: active_sessions, my_reviews, producto_detail, productos_por_categoria, my_favorites, lista_productos, my_activity, notifications\n    * Todos muestran fechas en hora de Colombia (UTC-5)\n    * Formatos consistentes: \"dd/mm/YYYY HH:MM:SS AM/PM\" o \"dd/mm/YYYY\"\n  - **Beneficios implementados**:\n    * Usuarios ven hora de su ubicación (Colombia)\n    * Sin confusión con UTC\n    * Fechas legibles en español\n    * Formato 12 horas familiar en Colombia\n    * Conversión automática en todos los templates\n\n- ✅ **Corregido**: Múltiples errores críticos en producción (Railway)\n  - **Error 1**: `'timezone_filters' is not a registered tag library`\n    * Causa: kitty_glow no estaba en INSTALLED_APPS\n    * Solución: Agregado 'kitty_glow' a INSTALLED_APPS en settings.py\n    * Django ahora reconoce los template tags personalizados\n  - **Error 2**: `ModuleNotFoundError: No module named 'pytz'`\n    * Causa: pytz no estaba en requirements.txt\n    * Solución: Agregado `pytz==2024.2` a requirements.txt\n    * Dependencia necesaria para conversión de zonas horarias\n  - **Error 3**: `Cannot resolve keyword 'is_active' into field` (LoginHistory)\n    * Causa: LoginHistory no tiene campo 'is_active'\n    * Solución: Usar `logout_time__isnull=True` para sesiones activas\n    * Lógica correcta: sesión activa = sin logout_time\n  - **Error 4**: `'str' object has no attribute 'utcoffset'`\n    * Causa: Funciones de notificación pasaban strings en lugar de datetime\n    * Solución: Pasar objetos datetime y dejar que templates formateen\n    * 4 funciones corregidas: send_login_notification, send_password_changed_notification, send_account_deactivation_notification, send_account_deletion_notification\n  - **Error 5**: Advertencias de archivos duplicados en collectstatic\n    * Causa: kitty_glow/static en STATICFILES_DIRS y en INSTALLED_APPS\n    * Solución: Eliminado de STATICFILES_DIRS (Django lo encuentra automáticamente)\n    * collectstatic ahora sin advertencias: \"146 static files copied\"\n  - **Error 6**: FieldError en user_view_ajax con campos None\n    * Causa: No se manejaban campos opcionales (role, first_name, etc.)\n    * Solución: Manejo explícito de None con valores default\n    * Uso de `localtime()` para conversión correcta de fechas\n    * Logging mejorado con stack traces completos\n\n- ✅ **Mejorado**: Configuración y organización del proyecto\n  - **INSTALLED_APPS actualizado**:\n    * Agregado 'kitty_glow' para reconocer templatetags personalizados\n    * Ordenado lógicamente con comentarios explicativos\n  - **STATICFILES_DIRS limpio**:\n    * Lista vacía (Django encuentra static/ de apps automáticamente)\n    * Sin duplicados en collectstatic\n    * Mejor rendimiento y logs más limpios\n  - **Separación de responsabilidades**:\n    * Python: Pasa datos sin formatear\n    * Templates: Formateo con filtros personalizados\n    * JavaScript: Lógica de interacción en archivos externos\n  - **Mejoras de seguridad**:\n    * Validaciones backend y frontend en todas las operaciones AJAX\n    * Logging detallado de errores para debugging\n    * Manejo robusto de casos edge (usuarios sin rol, campos None, etc.)\n\n- ✅ **Documentación**:\n  - README.md completamente actualizado con todas las nuevas características\n  - Commits detallados siguiendo guías de estilo de Git\n  - Mensajes de commit en español con descripciones completas\n  - Total de commits en esta versión: 7\n    1. `6452df8`: fix(settings) - Agregado kitty_glow a INSTALLED_APPS\n    2. `97c9ea6`: feat(admin) - Sistema de gestión de usuarios con modales\n    3. `b57faf6`: fix(deps) - Agregado pytz a requirements.txt\n    4. `022a115`: fix(admin) - Corregida vista user_view_ajax\n    5. `80877d3`: fix(settings) - Eliminados duplicados en collectstatic\n    6. `6f64497`: fix(admin) - Corregido filtro de sesiones activas\n    7. `d480d7d`: fix(emails) - Corregido paso de datetime a templates\n\n### Versión 1.0.7 (4 de noviembre de 2025)\n- ✅ **Mejorado**: Separación de CSS y JavaScript de templates HTML\n  - **Organización de archivos estáticos mejorada**\n    * CSS y JavaScript movidos a archivos externos\n    * Mejor cacheo por parte de los navegadores\n    * Código más mantenible y reutilizable\n  - **Archivos CSS creados** (5 nuevos):\n    * `active_sessions.css` - Estilos para gestión de sesiones activas\n    * `change_password.css` - Estilos para cambio de contraseña\n    * `delete_account.css` - Estilos para eliminación de cuenta\n    * `password_reset.css` - Estilos para solicitud de restablecimiento\n    * `password_reset_confirm.css` - Estilos para confirmación de nueva contraseña\n  - **Archivos JavaScript creados** (4 nuevos):\n    * `active_sessions.js` - Auto-actualización de sesiones cada 30s\n    * `change_password.js` - Toggle de contraseñas y validación\n    * `delete_account.js` - Validación de formulario y confirmaciones\n    * `password_reset_confirm.js` - Validación en tiempo real de 8 requisitos\n  - **Templates actualizados** (5 archivos):\n    * `password_reset_request.html` - Referencias CSS externas\n    * `password_reset_confirm.html` - Referencias CSS/JS externas\n    * `delete_account.html` - Referencias CSS/JS externas\n    * `change_password.html` - Referencias CSS/JS externas\n    * `active_sessions.html` - Referencias CSS/JS externas\n  - **Beneficios obtenidos**:\n    * ~584 líneas de código reorganizadas\n    * Separación clara de responsabilidades (HTML/CSS/JS)\n    * Archivos estáticos cacheables\n    * Templates HTML más limpios y legibles\n    * Preparado para minificación y compresión\n  - **Comando ejecutado**: `collectstatic` (9 nuevos archivos recolectados)\n  - **Documentación**: `SEPARACION_CSS_JS.md` con detalles completos\n  - **Nota**: Templates de email mantienen CSS inline (requerido por clientes de correo)\n\n### Versión 1.0.6 (4 de noviembre de 2025)\n- ✅ **Mejorado**: Sistema de validación de contraseñas ampliado a 8 requisitos\n  - **Nuevo requisito 1.8**: Detección de caracteres consecutivos\n    * Detecta caracteres idénticos: `aaa`, `111`, `AAA`\n    * Detecta secuencias alfabéticas: `abc`, `xyz`, `ABC`\n    * Detecta secuencias numéricas: `123`, `789`, `456`\n  - Actualizado `CustomPasswordValidator` en `accounts/validators.py`\n  - Nuevas funciones de validación:\n    * `_has_identical_consecutive()` - Regex para caracteres idénticos\n    * `_has_alphabetic_sequence()` - Loop para secuencias alfabéticas\n    * `_has_numeric_sequence()` - Loop para secuencias numéricas\n  - Normalización de texto con `unicodedata` (insensible a acentos)\n  - **Templates actualizados** con lista completa de requisitos:\n    * `register.html` - 7 requisitos (1-5, 7-8)\n    * `change_password.html` - 8 requisitos completos (1-8)\n    * `password_reset_confirm.html` - 9 items (8 requisitos + confirmación)\n  - **Validación JavaScript** en tiempo real para password_reset_confirm.html\n    * Función `hasConsecutiveChars()` replica lógica del backend\n    * Indicadores visuales (verde/rojo) para cada requisito\n    * Detección instantánea de patrones consecutivos\n  - **Testing exhaustivo**:\n    * Nuevo script: `test_consecutive_chars.py` (27 tests, 100% pass)\n    * Script de demostración: `demo_validacion_pre_logout.py` (6 casos)\n  - **Documentación completa**:\n    * `ACTUALIZACION_TEMPLATES_PASSWORDS.md` - Cambios en templates\n    * `VERIFICACION_CAMBIO_PASSWORD_COMPLETA.md` - Flujo técnico\n    * `CONFIRMACION_VALIDACION_PRE_LOGOUT.md` - Verificación final\n  - **Verificado**: Validación ocurre ANTES de logout en cambio de contraseña\n    * Doble capa: formulario + vista\n    * logout() solo se ejecuta tras validación exitosa\n    * 6 casos de prueba demuestran comportamiento correcto\n  - **Configuración de archivos estáticos** corregida\n    * Eliminadas rutas duplicadas de `STATICFILES_DIRS`\n    * Django auto-descubre carpetas static de las apps\n    * Sin warnings en `collectstatic`\n\n### Versión 1.0.5 (4 de noviembre de 2025)\n- ✅ **Nuevo**: Sistema de gestión de sesiones activas\n  - Nuevo modelo `ActiveSession` en `accounts/models.py`\n  - Nuevo middleware `ActiveSessionMiddleware` en `accounts/middleware.py`\n  - 3 nuevas vistas: `active_sessions_view()`, `close_session_view()`, `close_all_sessions_view()`\n  - Template completo: `accounts/templates/accounts/active_sessions.html`\n  - Admin: `ActiveSessionAdmin` registrado\n  - **Detección automática** de dispositivos, navegador, OS, IP\n  - **Lista visual** de todas las sesiones activas del usuario\n  - **Información detallada**: IP, navegador, sistema operativo, última actividad\n  - **Cierre individual** de sesiones sospechosas\n  - **Cierre masivo** de todas las sesiones excepto la actual\n  - **Protección**: No permite cerrar la sesión actual desde la vista\n  - **Auto-actualización**: La página se recarga cada 30 segundos\n  - **Limpieza automática**: Sesiones con +30 días de inactividad\n  - Middleware actualiza sesiones en cada request\n  - Migración: `0003_activesession.py`\n  - URLs: `/accounts/active-sessions/`, `/accounts/close-session/\u003cid\u003e/`, `/accounts/close-all-sessions/`\n  - Documento de pruebas: `PRUEBA_SESIONES_ACTIVAS.md`\n\n### Versión 1.0.4 (4 de noviembre de 2025)\n- ✅ **Nuevo**: Cambio de contraseña desde el perfil con seguridad mejorada\n  - Nuevo formulario `ChangePasswordForm` en `accounts/forms.py`\n  - Nueva vista `change_password_view()` en `accounts/views.py`\n  - Nueva URL `/accounts/change-password/`\n  - Template completo: `accounts/templates/accounts/change_password.html`\n  - **Requiere contraseña actual** para autorizar el cambio\n  - **Validación estricta** de nueva contraseña (7 requisitos)\n  - **Cierre de sesión automático** después del cambio por seguridad\n  - **Notificación por email** con detalles (fecha, hora, IP, navegador)\n  - Interfaz con mostrar/ocultar contraseña\n  - Validación en tiempo real (JavaScript)\n  - Confirmación antes de enviar\n  - Sección de seguridad agregada en perfil\n  - Consejos de seguridad incluidos\n  - Documento de pruebas: `PRUEBA_CAMBIO_PASSWORD.md`\n\n### Versión 1.0.3 (4 de noviembre de 2025)\n- ✅ **Verificado**: Sistema de emails en producción\n  - Confirmado envío de HTML completo en producción\n  - Nueva función `send_html_email()` wrapper\n  - Lógica condicional basada en `IS_DEPLOYED`\n  - Producción: `EmailMultiAlternatives` con HTML + texto plano\n  - Desarrollo: `send_mail()` solo con texto plano\n  - 6 funciones de email actualizadas con wrapper\n  - Documento de verificación: `VERIFICACION_EMAIL_PRODUCCION.md`\n  - Script de prueba: `test_email_production_simple.py`\n\n### Versión 1.0.2 (4 de noviembre de 2025)\n- ✅ **Mejorado**: Emails en texto plano para desarrollo\n  - Nueva función `html_to_plain_text()` en `accounts/views.py`\n  - Emails en consola ahora sin código HTML\n  - Conversión automática: HTML → Texto limpio\n  - Listas convertidas a bullets (•)\n  - Mantiene HTML profesional en producción\n  - 6 funciones de email actualizadas\n\n### Versión 1.0.1 (4 de noviembre de 2025)\n- ✅ **Nuevo**: Login flexible con email o nombre de usuario\n  - Detección automática del tipo de credencial\n  - Una sola caja de texto para mejorar UX\n  - Mantiene compatibilidad con sistema existente\n  - Seguridad preservada (no revela si credenciales existen)\n\n### Versión 1.0.0 (4 de noviembre de 2025)\n- ✅ Sistema de autenticación completo\n- ✅ Gestión de cuentas con eliminación (gracia 30 días)\n- ✅ Exportación de datos en JSON\n- ✅ 6 tipos de notificaciones por email\n- ✅ Sistema de productos y categorías\n- ✅ Panel de administración\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandres-gutierrezri%2Fkitty_project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandres-gutierrezri%2Fkitty_project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandres-gutierrezri%2Fkitty_project/lists"}