Una aplicación web moderna para gestionar mascotas con amor y tecnología
Pets de Sigmotoa es una aplicación web completa para gestionar información de mascotas, desarrollada con FastAPI y SQLModel. El proyecto ha evolucionado desde un simple CRUD con archivos CSV hasta una aplicación robusta con base de datos PostgreSQL alojada en un servidor de Clever-Cloud en y almacenamiento de imágenes en Supabase.
- 🏠 Interfaz Web Moderna: Templates con Bulma CSS y navegación intuitiva
- 📱 API RESTful Completa: Endpoints para todas las operaciones CRUD
- 🖼️ Gestión de Imágenes: Subida y almacenamiento en Supabase Storage
- 🗃️ Múltiples Persistencias: Soporte para CSV, SQLite y PostgreSQL (en servidor de clever)
- 🐕 Tipado de Mascotas: Sistema de clasificación por tipo y género
- 🔄 Soft Delete: Marcado de mascotas como inactivas sin eliminación física
- 📊 Documentación Automática: Swagger UI integrado
| Versión | Nombre | Descripción | Estado |
|---|---|---|---|
| v1.0.0 | 🗂️ File Era | CRUD básico con almacenamiento CSV | ✅ Completado |
| v1.5.0 | 🔗 Database Bridge | Migración a SQLAlchemy + AsyncPG | ✅ Completado |
| v2.0.0 | 🌟 Modern Stack | SQLModel + Supabase + Web UI | ✅ Actual |
| v2.1.0 | 🖼️ Image Plus | Optimización de imágenes y thumbnails | 🚧 Planificado |
| v3.0.0 | 👥 Multi-User | Sistema de usuarios y autenticación | 💡 Futuro |
- Modelos Pydantic básicos
- Operaciones CRUD con CSV
- Validación de datos
- API endpoints básicos
- Migración a SQLAlchemy
- Conexiones asíncronas
- Operaciones de base de datos
- Manejo de sesiones
- SQLModel para ORM moderno
- Integración con Supabase
- Interfaz web con Jinja2
- Subida de imágenes
- Sistema de enums para tipos
- Soft delete functionality
- Templates responsivos con Bulma
graph TB
A[👤 Usuario] --> B[🌐 FastAPI App]
B --> C[🎨 Templates/Web UI]
B --> D[📡 API Endpoints]
D --> E[🔧 SQLModel Operations]
E --> F[🗄️ PostgreSQL/SQLite]
B --> G[📁 File Utils]
G --> H[☁️ Supabase Storage]
B --> I[🎭 Router System]
I --> J[🐾 Pets Router]
style A fill:#e1f5fe
style B fill:#f3e5f5
style F fill:#e8f5e8
style H fill:#fff3e0
pets-de-sigmotoa/
├── 📂 routers/
│ └── pets/
│ └── web.py # Rutas web para mascotas
├── 📂 templates/ # Templates Jinja2
│ ├── base.html # Template base
│ ├── home.html # Página principal
│ ├── includes/ # Componentes reutilizables
│ └── pets/ # Templates de mascotas
├── 📂 utils/ # Utilidades
│ ├── file_utils.py # Gestión de archivos/imágenes
│ └── terms.py # Enums y constantes
├── 📄 main.py # Aplicación principal
├── 📄 models.py # Modelos Pydantic v1
├── 📄 sqlmodel_db.py # Modelos SQLModel
├── 📄 sqlmodel_ops.py # Operaciones de base de datos
├── 📄 sqlmodel_conn.py # Configuración de conexión
└── 📄 operations.py # Operaciones CSV (legacy)
erDiagram
PetSQL {
int id PK
string name
string breed
int birth
Kind kind
Genre genre
string image_path
boolean is_alive
datetime created_at
datetime updated_at
}
PetSQL }o--|| Kind : has_kind
PetSQL }o--|| Genre : has_genre
Kind {
string kind PK
}
Genre {
string genre PK
}
| Kind | Emoji |
|---|---|
| Dog | 🐶 |
| Cat | 😻 |
| Bird | 🦉 |
| Alligator | 🐊 |
| Rabbit | 🐇 |
| Hamster | 🐁 |
| Genre |
|---|
| Male |
| Female |
class PetSQL(PetBase, table=True):
__tablename__ = "pets"
id: Optional[int] = Field(default=None, primary_key=True)
name: Optional[str] = Field(index=True, min_length=3, max_length=20)
breed: Optional[str] = Field(default=None, min_length=3, max_length=30)
birth: Optional[int] = Field(default=None, le=CURRENT_YEAR)
kind: Optional[Kind] = Field(default=None)
genre: Optional[Genre] = Field(default=None)
image_path: Optional[str] = Field(default=None)
is_alive: Optional[bool] = Field(default=True)
created_at: Optional[datetime] = Field(default_factory=datetime.now)
updated_at: Optional[datetime] = Field(default=None)La aplicación soporta múltiples tipos de base de datos:
# PostgreSQL (Producción - Clever Cloud)
CLEVER_DB = f"postgresql+asyncpg://{user}:{password}@{host}:{port}/{database}"
# SQLite (Desarrollo)
DATABASE_URL = "sqlite+aiosqlite:///.petsdb.db"Integración con Supabase Storage para gestión de imágenes:
# Configuración Supabase
SUPABASE_URL = os.getenv("NEXT_PUBLIC_SUPABASE_URL")
SUPABASE_KEY = os.getenv("NEXT_PUBLIC_SUPABASE_ANON_KEY")
SUPABASE_BUCKET = os.getenv("SUPABASE_BUCKET")- Python 3.8+
- PostgreSQL (opcional)
- Cuenta de Supabase (para imágenes)
- Clonar el repositorio
git clone https://github.com/sigmotoa/dev_mypets
cd dev_mypets- Crear entorno virtual
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows- Instalar dependencias
pip install -r requirements.txt- Configurar variables de entorno
# Crear archivo .env
NEXT_PUBLIC_SUPABASE_URL=tu_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu_supabase_key
SUPABASE_BUCKET=tu_bucket_name
# Base de datos (opcional)
CLEVER_USER=tu_usuario
CLEVER_PASSWORD=tu_password
CLEVER_HOST=tu_host
CLEVER_PORT=tu_puerto
CLEVER_DATABASE=tu_database- Ejecutar la aplicación
uvicorn main:app --reload- Web UI: http://localhost:8000/web/
- API Docs: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/pets |
Crear mascota con imagen |
GET |
/pets |
Listar todas las mascotas |
GET |
/pets/{id} |
Obtener mascota por ID |
PATCH |
/pets/{id} |
Actualizar mascota |
PATCH |
/petsm/{id} |
Desactivar mascota (soft delete) |
| Ruta | Descripción |
|---|---|
/web/ |
Página principal |
/web/pets |
Lista de mascotas |
/web/new |
Formulario nueva mascota |
/web/pet/{id} |
Detalle de mascota |
- FastAPI: Framework web moderno y rápido
- SQLModel: ORM con tipado estático
- Pydantic: Validación de datos
- AsyncPG: Driver PostgreSQL asíncrono
- Aiosqlite: Driver SQLite asíncrono
- Jinja2: Motor de templates
- Bulma CSS: Framework CSS moderno
- Material Design Icons: Iconografía
- Supabase: Storage de imágenes
- Clever Cloud: Hosting PostgreSQL
- Render: Render como servidor
- Redimensionamiento automático de imágenes
- Generación de thumbnails
- Compresión optimizada
- Lazy loading en la web
- Sistema de autenticación
- Perfiles de usuario
- Mascotas por usuario
- Roles y permisos
- Comentarios en mascotas
- Sistema de likes
- Compartir mascotas
- Feed de actividades
- Fork el proyecto
- Crea tu rama de feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.
sigmotoa
- Website: sigmotoa.com
- GitHub: @sigmotoa
- Instagram: @sigmotoa
- LinkedIn: sigmotoa
- Estudiantes que han contribuido con contenido
- Comunidad FastAPI por la excelente documentación
- Render por el servicio gratuito
- Supabase por el storage gratuito
- Clever cloud por el db gratuito
- Bulma por el framework CSS
-
Grupo 7-9: grupo 7-9
-
Grupo 9-11: grupo 9-11
-
Debes tener paciencia mientras el server despierta.
¡Hecho con ❤️ para los amigos peludos de sigmotoa!
⭐ ¡Dale una estrella si te gustó el proyecto! ⭐