+
+
+
);
};
\ No newline at end of file
diff --git a/src/front/index.css b/src/front/index.css
index e69de29bb2..e30f48390f 100644
--- a/src/front/index.css
+++ b/src/front/index.css
@@ -0,0 +1,161 @@
+.navbar {
+ background-color: #5aa8ab;
+}
+
+.icon {
+ width: 8rem;
+ height: auto;
+ margin-right: 5px;
+}
+
+.icon-text {
+ font-family: "Poppins", sans-serif;
+ font-size: 1.5rem;
+}
+
+.navbar-btn {
+ background-color: #184039;
+ border: 0;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.4);
+ transition: all 0.3s ease;
+}
+
+.navbar-btn:hover {
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px);
+ background-color: #77a6aa;
+}
+
+.navbar-text,
+.navbar-btn {
+ font-family: "Inter";
+}
+
+
+.hero-section {
+ position: relative;
+ width: 100%;
+ height: 480px; /* O la altura que prefieras */
+ display: flex;
+ justify-content: center;
+ margin-top: 5rem;
+ overflow: hidden;
+}
+
+.hero-content {
+ text-align: center;
+ max-width: 800px;
+ padding: 20px;
+ z-index: 2; /* Para que el contenido esté por encima de posibles animaciones de fondo */
+}
+
+.hero-image {
+ width: 12rem; /* Ajusta el tamaño de tu imagen */
+ margin-bottom: 2rem;
+ opacity: 0; /* Inicia invisible para la animación */
+ transform: translateY(-20px); /* Inicia un poco arriba */
+ animation: fadeInSlideDown 1s forwards;
+ animation-delay: 0.5s; /* Retrasa la aparición de la imagen */
+}
+
+h1 {
+ font-family: "Poppins", sans-serif; /* Puedes elegir tu fuente */
+ font-size: 2.5em;
+ font-weight: bold;
+ color: #263c5e;
+ margin-bottom: 15px;
+ opacity: 0;
+ transform: translateY(20px);
+ animation: fadeInSlideUp 1s forwards;
+ animation-delay: 1s; /* Retrasa la aparición del título */
+}
+
+.span-text {
+ color: #77a6aa; /* Un color verde, por ejemplo */
+}
+
+.hero-text {
+ font-family: "Inter", sans-serif; /* Puedes elegir tu fuente */
+ font-size: 0.94em;
+ font-weight: lighter;
+ color: #263c5e;
+ margin-bottom: 30px;
+ opacity: 0;
+ transform: translateY(20px);
+ animation: fadeInSlideUp 1s forwards;
+ animation-delay: 1.5s; /* Retrasa la aparición del párrafo */
+}
+
+.cta-button {
+ padding-top: 0px;
+ padding-bottom: 0px;
+ width: 297px;
+ height: 46px;
+ font-family: "Inter", sans-serif;
+ background-color: #184039; /* Color de tu botón */
+ color: white;
+ border: none;
+ border-radius: 50px;
+ font-size: 0.94em;
+ cursor: pointer;
+ transition: background-color 0.3s ease, transform 0.3s ease;
+ opacity: 0;
+ transform: translateY(20px);
+ animation: fadeInSlideUp 1s forwards;
+ animation-delay: 2s; /* Retrasa la aparición del botón */
+ border: 0;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.4);
+ transition: all 0.3s ease;
+}
+
+.cta-button:hover {
+ background-color: #77a6aa;
+ transform: translateY(-5px); /* Pequeño efecto al pasar el mouse */
+}
+
+/* Animaciones */
+@keyframes fadeInSlideDown {
+ from {
+ opacity: 0;
+ transform: translateY(-20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeInSlideUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.div-card {
+ width: 100%;
+ height: auto;
+ background: radial-gradient(circle, #ffffff 10%, #5AA8AB 100%);
+ /* Opcional: define un tamaño y padding para que veas el efecto */
+
+ min-height: 300px;
+ padding: 20px;
+ box-sizing: border-box; /* Para que el padding no aumente el ancho/alto total */
+ position: relative;
+ display: flex;
+ justify-content: center;
+ overflow: hidden;
+
+}
+
+.title {
+ padding-left: 2rem;
+ color: #263c5e;
+ font-family: "Poppins", sans-serif;
+ font-weight: normal;
+
+}
diff --git a/src/front/pages/Home.jsx b/src/front/pages/Home.jsx
index 341ed21768..6e6729e110 100644
--- a/src/front/pages/Home.jsx
+++ b/src/front/pages/Home.jsx
@@ -1,6 +1,11 @@
import React, { useEffect } from "react"
import rigoImageUrl from "../assets/img/rigo-baby.jpg";
import useGlobalReducer from "../hooks/useGlobalReducer.jsx";
+import { motion } from "framer-motion";
+
+import Particles from "react-tsparticles";
+import { Hero } from "../components/Hero.jsx";
+import MentorsTop from "../components/MentorsTop.jsx";
export const Home = () => {
@@ -33,20 +38,16 @@ export const Home = () => {
}, [])
return (
-
-
Hello Rigo!!
-
-
-
-
- {store.message ? (
- {store.message}
- ) : (
-
- Loading message from the backend (make sure your python 🐍 backend is running)...
-
- )}
-
+
+
+
+
+
+
+
+
+
+
);
};
\ No newline at end of file
From 215b85f947efa41a4fd36c3cdf1d41e6951fecba Mon Sep 17 00:00:00 2001
From: Juan Silva <162917944+juancapanegra@users.noreply.github.com>
Date: Wed, 15 Oct 2025 20:33:03 +0000
Subject: [PATCH 03/75] Primer avance
---
src/api/admin.py | 14 ++-
src/api/models.py | 275 ++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 278 insertions(+), 11 deletions(-)
diff --git a/src/api/admin.py b/src/api/admin.py
index 3eecb64140..732cb2bb05 100644
--- a/src/api/admin.py
+++ b/src/api/admin.py
@@ -1,17 +1,23 @@
-
+
import os
from flask_admin import Admin
-from .models import db, User
+from .models import db, User, MentorProfile, StudentProfile, MentorTopic, Mentoring, Review, Comments
from flask_admin.contrib.sqla import ModelView
+
def setup_admin(app):
app.secret_key = os.environ.get('FLASK_APP_KEY', 'sample key')
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
admin = Admin(app, name='4Geeks Admin', template_mode='bootstrap3')
-
# Add your models here, for example this is how we add a the User model to the admin
admin.add_view(ModelView(User, db.session))
+ admin.add_view(ModelView(MentorProfile, db.session))
+ admin.add_view(ModelView(StudentProfile, db.session))
+ admin.add_view(ModelView(MentorTopic, db.session))
+ admin.add_view(ModelView(Mentoring, db.session))
+ admin.add_view(ModelView(Review, db.session))
+ admin.add_view(ModelView(Comments, db.session))
# You can duplicate that line to add mew models
- # admin.add_view(ModelView(YourModelName, db.session))
\ No newline at end of file
+ # admin.add_view(ModelView(YourModelName, db.session))
diff --git a/src/api/models.py b/src/api/models.py
index da515f6a1a..f741f2decb 100644
--- a/src/api/models.py
+++ b/src/api/models.py
@@ -4,16 +4,277 @@
db = SQLAlchemy()
+# Definición de ENUMs
+class ExperienceLevelEnum(enum.Enum):
+ BEGINNER = "beginner"
+ INTERMEDIATE = "intermediate"
+ ADVANCED = "advanced"
+
+
class User(db.Model):
+ __tablename__ = 'user'
+ id: Mapped[int] = mapped_column(
+ primary_key=True)
+ username: Mapped[str] = mapped_column(
+ String(20), unique=True, nullable=False)
+ name: Mapped[str] = mapped_column(
+ String(15), nullable=False)
+ email: Mapped[str] = mapped_column(
+ String(30), unique=True, nullable=False)
+ password: Mapped[str] = mapped_column(
+ String(50), unique=True, nullable=False)
+ avatar: Mapped[str] = mapped_column(
+ String(50), unique=True, nullable=False)
+ role: Mapped[bool] = mapped_column(
+ Boolean(), nullable=False) # False=student, True=mentor
+ created_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.utcnow)
+ updated_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.func.utcnow)
+
+ #Relaciones
+ mentor_profile = relationship("MentorProfile", back_populates='user', uselist=False)
+ student_profile = relationship ("StudentProfile", back_populates='user', uselist=False)
+
+ def serialize(self):
+ return {
+ 'id': self.id,
+ 'username': self.username,
+ 'name': self.name,
+ 'email': self.email,
+ 'avatar': self.avatar,
+ 'role': self.role, # False=student, True=mentor
+ 'created_at': self.created_at.isoformat() if self.created_at else None,
+ 'updated_at': self.updated_at.isoformat() if self.updated_at else None
+ }
+
+
+class MentorProfile(db.Model):
+ __tablename__ = 'mentor_profile'
+ id: Mapped[int] = mapped_column(
+ primary_key=True)
+ user_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('user.id'), nullable=False)
+ rate: Mapped[int] = mapped_column(
+ Integer, nullable=False)
+ years_experience: Mapped[int] = mapped_column(
+ Integer, nullable=False)
+ bio: Mapped[str] = mapped_column(
+ Text, nullable=True)
+ availability: Mapped[str] = mapped_column(
+ String(400) nullable=True)
+ hourly_rate: Mapped[float] = mapped_column(
+ Float, nullable=True)
+ linkedin_url: Mapped[str] = mapped_column(
+ String(100), nullable=True)
+ website: Mapped[str] = mapped_column(
+ String(100), nullable=True)
+ skills: Mapped[str] = mapped_column(
+ Text, nullable=True)
+ interests: Mapped[str] = mapped_column(
+ Text, nullable=True)
+
+ #Relaciones
+ user = relationship("User", back_populates="mentor_profile")
+ topics = relatiopnship("MentorTopic", back_populates="mentor_profile")
+ mentorings: relationship("Mentoring", back_populates="mentor_profile")
+
+ def serialize(self):
+ return {
+ 'id': self.id,
+ 'user_id': self.user_id,
+ 'rate': self.rate,
+ 'years_experience': self.years_experience,
+ 'bio': self.bio,
+ 'availability': self.availability,
+ 'hourly_rate': self.hourly_rate,
+ 'linkedin_url': self.linkedin_url,
+ 'website': self.website,
+ 'skills': self.skills,
+ 'interests': self.interests
+ }
+
+class StudentProfile(db.Model):
+ __tablename__ = 'student_profile'
+ id: Mapped[int] = mapped_column(
+ primary_key=True)
+ user_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('user.id'), nullable=False)
+ interests: Mapped[str] = mapped_column(
+ Text, nullable=True)
+ goals: Mapped[str] = mapped_column(
+ Text, nullable=True)
+ experience_level: Mapped[ExperienceLevelEnum] = mapped_column(
+ Enum(ExperienceLevelEnum), nullable=True)
+ skills: Mapped[str] = mapped_column(
+ Text, nullable=True)
+
+ # Relaciones
+ user = relationship("User", back_populates="student_profile")
+ mentorings = relationship("Mentoring", back_populates="student", foreign_keys="Mentoring.student_id")
+ mentorings_profile = relationship("MentorProfile", back_populates="mentor", foreign_keys="Mentoring.mentor_id")
+
+ def serialize(self):
+ return {
+ 'id': self.id,
+ 'user_id': self.user_id,
+ 'interests': self.interests,
+ 'goals': self.goals,
+ 'exp erience_level': self.experience_level.value if self.experience_level else None,
+ 'skills': self.skills
+ }
+
+
+class MentorTopic(db.Model):
+ __tablename__ = 'mentor_topic'
+ id: Mapped[int] = mapped_column(
+ primary_key=True)
+ mentor_profile_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('mentor_profile.id'), nullable=False)
+ title: Mapped[str] = mapped_column(
+ String(50), nullable=False)
+ description: Mapped[str] = mapped_column(
+ Text, nullable=True)
+ difficulty_level: Mapped[DifficultyLevelEnum] = mapped_column(
+ Enum(DifficultyLevelEnum), nullable=True)
+ price: Mapped[float] = mapped_column(
+ Float, nullable=False)
+
+ # Relaciones
+ mentor_profile = relationship("MentorProfile", back_populates="topics")
+ mentorings = relationship("Mentoring", back_populates="topic")
+
+ def serialize(self):
+ return {
+ 'id': self.id,
+ 'mentor_profile_id': self.mentor_profile_id,
+ 'title': self.title,
+ 'description': self.description,
+ 'difficulty_level': self.difficulty_level.value if self.difficulty_level else None,
+ 'price': self.price
+ }
+
+class Mentoring(db.Model):
+ __tablename__ = 'mentoring'
+ id: Mapped[int] = mapped_column(primary_key=True)
+ topic_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('mentor_topic.id'), nullable=False)
+ mentor_profile_id: Mapped[int] = mapped_column(Integer, ForeignKey('mentor_profile.id'), nullable=False)
+ student_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('student_profile.id'), nullable=False)
+ scheduled_at: Mapped[datetime] = mapped_column(
+ DateTime, nullable=False)
+ duration_minutes: Mapped[int] = mapped_column(
+ Integer, nullable=False)
+ status: Mapped[StatusEnum] = mapped_column(
+ Enum(StatusEnum), nullable=False)
+ pricing_topic: Mapped[float] = mapped_column(
+ Float, nullable=False)
+ notes: Mapped[str] = mapped_column(Text, nullable=True)
+ payment_status: Mapped[PaymentStatusEnum] = mapped_column(
+ Enum(PaymentStatusEnum), nullable=True)
+ created_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.utcnow)
+ updated_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
+
+ # Relationships
+ topic = relationship("MentorTopic", back_populates="mentorings")
+ mentor_profile = relationship("MentorProfile", back_populates="mentorings")
+ student = relationship("StudentProfile", back_populates="mentorings", foreign_keys=[student_id])
+ reviews = relationship("Review", back_populates="mentoring")
+
+ def serialize(self):
+ return {
+ 'id': self.id,
+ 'topic_id': self.topic_id,
+ 'mentor_profile_id': self.mentor_profile_id,
+ 'student_id': self.student_id,
+ 'scheduled_at': self.scheduled_at.isoformat() if self.scheduled_at else None,
+ 'duration_minutes': self.duration_minutes,
+ 'status': self.status.value,
+ 'pricing_topic': self.pricing_topic,
+ 'notes': self.notes,
+ 'payment_status': self.payment_status.value if self.payment_status else None,
+ 'created_at': self.created_at.isoformat() if self.created_at else None,
+ 'updated_at': self.updated_at.isoformat() if self.updated_at else None
+ }
+
+
+class Review(db.Model):
+ __tablename__ = 'review'
id: Mapped[int] = mapped_column(primary_key=True)
- email: Mapped[str] = mapped_column(String(120), unique=True, nullable=False)
- password: Mapped[str] = mapped_column(nullable=False)
- is_active: Mapped[bool] = mapped_column(Boolean(), nullable=False)
+ mentoring_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('mentoring.id'), nullable=False)
+ reviewer_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('user.id'), nullable=False)
+ reviewed_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('user.id'), nullable=False)
+ role: Mapped[ReviewRoleEnum] = mapped_column(
+ Enum(ReviewRoleEnum), nullable=False)
+ ranking: Mapped[float] = mapped_column(
+ Float, nullable=False)
+ title: Mapped[str] = mapped_column(
+ String(100), nullable=True)
+ comment: Mapped[str] = mapped_column(
+ Text, nullable=True)
+ created_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.utcnow)
+ updated_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
+ # Relationships
+ mentoring = relationship("Mentoring", back_populates="reviews")
+ reviewer = relationship("User", foreign_keys=[reviewer_id])
+ reviewed = relationship("User", foreign_keys=[reviewed_id])
def serialize(self):
return {
- "id": self.id,
- "email": self.email,
- # do not serialize the password, its a security breach
- }
\ No newline at end of file
+ 'id': self.id,
+ 'mentoring_id': self.mentoring_id,
+ 'reviewer_id': self.reviewer_id,
+ 'reviewed_id': self.reviewed_id,
+ 'role': self.role.value,
+ 'ranking': self.ranking,
+ 'title': self.title,
+ 'comment': self.comment,
+ 'created_at': self.created_at.isoformat() if self.created_at else None,
+ 'updated_at': self.updated_at.isoformat() if self.updated_at else None
+ }
+
+
+class Comments(db.Model):
+ __tablename__ = 'comments'
+ id: Mapped[int] = mapped_column(primary_key=True)
+ user_id: Mapped[int] = mapped_column(
+ Integer, ForeignKey('user.id'), nullable=False)
+ message: Mapped[str] = mapped_column(
+ Text, nullable=False)
+ id_mentor: Mapped[int] = mapped_column(
+ Integer, ForeignKey('mentor_profile.id'), nullable=False)
+ id_student: Mapped[int] = mapped_column
+ Integer, ForeignKey('student_profile.id'), nullable=False)
+ created_at: Mapped[datetime] = mapped_column(
+ DateTime, default=datetime.utcnow)
+
+ # Relationships
+ user = relationship("User", back_populates="comments")
+ mentor = relationship("MentorProfile")
+ student = relationship("StudentProfile")
+
+ def serialize(self):
+ return {
+ 'id': self.id,
+ 'user_id': self.user_id,
+ 'message': self.message,
+ 'id_mentor': self.id_mentor,
+ 'id_student': self.id_student,
+ 'created_at': self.created_at.isoformat() if self.created_at else None
+ }
+
+
+
+
+
+
+
From 50c95735a33a7378dfc4d0e1814f9068475c2969 Mon Sep 17 00:00:00 2001
From: Juan Silva <162917944+juancapanegra@users.noreply.github.com>
Date: Thu, 16 Oct 2025 23:10:37 +0000
Subject: [PATCH 04/75] Segundo avance: Models
---
Pipfile | 3 +
Pipfile.lock | 390 +++++++++++++++++----------
database_diagram.png | Bin 0 -> 147169 bytes
generate_diagram.py | 56 ++++
migrations/versions/0b67aef305cd_.py | 145 ++++++++++
src/api/models.py | 94 ++++---
6 files changed, 514 insertions(+), 174 deletions(-)
create mode 100644 database_diagram.png
create mode 100644 generate_diagram.py
create mode 100644 migrations/versions/0b67aef305cd_.py
diff --git a/Pipfile b/Pipfile
index 44e04f14ff..227108a6a5 100644
--- a/Pipfile
+++ b/Pipfile
@@ -20,11 +20,14 @@ typing-extensions = "*"
flask-jwt-extended = "==4.6.0"
wtforms = "==3.1.2"
sqlalchemy = "*"
+sqlalchemy-schemadisplay = "*"
+pydot = "*"
[requires]
python_version = "3.13"
[scripts]
+diagram = "python generate_diagram.py"
start="flask run -p 3001 -h 0.0.0.0"
init="flask db init"
migrate="flask db migrate"
diff --git a/Pipfile.lock b/Pipfile.lock
index b201c3decc..9afd9ce69f 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "d2e672e650278aeeee2fe49bd76d76497d8b65a50f8b5dbb121d265cbc6ef4e5"
+ "sha256": "0eaf2e03ae586309b63180d79ff72e840e965f4bdc5eee6326d1ccc4ed42f37c"
},
"pipfile-spec": 6,
"requires": {
@@ -114,82 +114,63 @@
},
"greenlet": {
"hashes": [
- "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e",
- "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7",
- "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01",
- "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1",
- "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159",
- "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563",
- "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83",
- "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9",
- "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395",
- "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa",
- "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942",
- "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1",
- "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441",
- "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22",
- "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9",
- "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0",
- "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba",
- "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3",
- "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1",
- "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6",
- "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291",
- "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39",
- "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d",
- "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467",
- "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475",
- "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef",
- "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c",
- "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511",
- "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c",
- "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822",
- "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a",
- "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8",
- "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d",
- "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01",
- "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145",
- "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80",
- "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13",
- "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e",
- "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b",
- "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1",
- "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef",
- "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc",
- "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff",
- "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120",
- "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437",
- "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd",
- "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981",
- "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36",
- "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a",
- "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798",
- "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7",
- "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761",
- "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0",
- "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e",
- "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af",
- "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa",
- "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c",
- "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42",
- "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e",
- "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81",
- "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e",
- "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617",
- "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc",
- "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de",
- "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111",
- "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383",
- "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70",
- "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6",
- "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4",
- "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011",
- "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803",
- "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79",
- "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"
- ],
- "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))",
- "version": "==3.1.1"
+ "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b",
+ "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735",
+ "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079",
+ "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d",
+ "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433",
+ "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58",
+ "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52",
+ "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31",
+ "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246",
+ "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f",
+ "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671",
+ "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8",
+ "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d",
+ "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f",
+ "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0",
+ "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd",
+ "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337",
+ "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0",
+ "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633",
+ "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b",
+ "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa",
+ "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31",
+ "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9",
+ "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b",
+ "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4",
+ "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc",
+ "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c",
+ "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98",
+ "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f",
+ "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c",
+ "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590",
+ "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3",
+ "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2",
+ "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9",
+ "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5",
+ "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02",
+ "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0",
+ "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1",
+ "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c",
+ "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594",
+ "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5",
+ "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d",
+ "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a",
+ "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6",
+ "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b",
+ "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df",
+ "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945",
+ "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae",
+ "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb",
+ "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504",
+ "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb",
+ "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01",
+ "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c",
+ "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==3.2.4"
},
"gunicorn": {
"hashes": [
@@ -298,6 +279,103 @@
"markers": "python_version >= '3.8'",
"version": "==24.2"
},
+ "pillow": {
+ "hashes": [
+ "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643",
+ "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e",
+ "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e",
+ "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc",
+ "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642",
+ "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6",
+ "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1",
+ "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b",
+ "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399",
+ "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba",
+ "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad",
+ "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47",
+ "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739",
+ "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b",
+ "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f",
+ "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10",
+ "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52",
+ "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d",
+ "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b",
+ "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a",
+ "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9",
+ "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d",
+ "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098",
+ "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905",
+ "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b",
+ "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3",
+ "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371",
+ "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953",
+ "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01",
+ "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca",
+ "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e",
+ "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7",
+ "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27",
+ "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082",
+ "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e",
+ "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d",
+ "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8",
+ "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a",
+ "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad",
+ "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3",
+ "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a",
+ "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d",
+ "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353",
+ "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee",
+ "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b",
+ "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b",
+ "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a",
+ "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7",
+ "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef",
+ "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a",
+ "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a",
+ "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257",
+ "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07",
+ "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4",
+ "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c",
+ "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c",
+ "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4",
+ "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe",
+ "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8",
+ "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5",
+ "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6",
+ "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e",
+ "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8",
+ "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e",
+ "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275",
+ "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3",
+ "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76",
+ "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227",
+ "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9",
+ "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5",
+ "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79",
+ "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca",
+ "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa",
+ "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b",
+ "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e",
+ "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197",
+ "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab",
+ "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79",
+ "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2",
+ "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363",
+ "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0",
+ "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e",
+ "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782",
+ "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925",
+ "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0",
+ "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b",
+ "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced",
+ "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c",
+ "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344",
+ "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9",
+ "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==12.0.0"
+ },
"psycopg2-binary": {
"hashes": [
"sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff",
@@ -372,6 +450,15 @@
"index": "pypi",
"version": "==2.9.10"
},
+ "pydot": {
+ "hashes": [
+ "sha256:869c0efadd2708c0be1f916eb669f3d664ca684bc57ffb7ecc08e70d5e93fee6",
+ "sha256:c2148f681c4a33e08bf0e26a9e5f8e4099a82e0e2a068098f32ce86577364ad5"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==4.0.1"
+ },
"pyjwt": {
"hashes": [
"sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953",
@@ -380,6 +467,14 @@
"markers": "python_version >= '3.9'",
"version": "==2.10.1"
},
+ "pyparsing": {
+ "hashes": [
+ "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6",
+ "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==3.2.5"
+ },
"python-dotenv": {
"hashes": [
"sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca",
@@ -447,6 +542,14 @@
"markers": "python_version >= '3.8'",
"version": "==6.0.2"
},
+ "setuptools": {
+ "hashes": [
+ "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922",
+ "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==80.9.0"
+ },
"six": {
"hashes": [
"sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
@@ -457,74 +560,85 @@
},
"sqlalchemy": {
"hashes": [
- "sha256:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d",
- "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03",
- "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea",
- "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50",
- "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d",
- "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3",
- "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1",
- "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727",
- "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68",
- "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149",
- "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06",
- "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7",
- "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca",
- "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5",
- "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3",
- "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3",
- "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443",
- "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff",
- "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86",
- "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6",
- "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753",
- "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2",
- "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297",
- "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578",
- "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728",
- "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178",
- "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2",
- "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096",
- "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9",
- "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8",
- "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b",
- "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4",
- "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a",
- "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079",
- "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725",
- "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373",
- "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248",
- "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd",
- "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda",
- "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6",
- "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579",
- "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444",
- "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d",
- "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4",
- "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc",
- "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7",
- "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c",
- "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba",
- "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32",
- "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e",
- "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb",
- "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120",
- "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd",
- "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e",
- "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63",
- "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2",
- "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae"
+ "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7",
+ "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22",
+ "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45",
+ "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd",
+ "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1",
+ "sha256:11bac86b0deada30b6b5f93382712ff0e911fe8d31cb9bf46e6b149ae175eff0",
+ "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d",
+ "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749",
+ "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05",
+ "sha256:1df4763760d1de0dfc8192cc96d8aa293eb1a44f8f7a5fbe74caf1b551905c5e",
+ "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40",
+ "sha256:22be14009339b8bc16d6b9dc8780bacaba3402aa7581658e246114abbd2236e3",
+ "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3",
+ "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976",
+ "sha256:2bf4bb6b3d6228fcf3a71b50231199fb94d2dd2611b66d33be0578ea3e6c2726",
+ "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d",
+ "sha256:2f19644f27c76f07e10603580a47278abb2a70311136a7f8fd27dc2e096b9013",
+ "sha256:2fc44e5965ea46909a416fff0af48a219faefd5773ab79e5f8a5fcd5d62b2667",
+ "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165",
+ "sha256:3255d821ee91bdf824795e936642bbf43a4c7cedf5d1aed8d24524e66843aa74",
+ "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399",
+ "sha256:357bade0e46064f88f2c3a99808233e67b0051cdddf82992379559322dfeb183",
+ "sha256:3caef1ff89b1caefc28f0368b3bde21a7e3e630c2eddac16abd9e47bd27cc36a",
+ "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e",
+ "sha256:3fe166c7d00912e8c10d3a9a0ce105569a31a3d0db1a6e82c4e0f4bf16d5eca9",
+ "sha256:471733aabb2e4848d609141a9e9d56a427c0a038f4abf65dd19d7a21fd563632",
+ "sha256:4848395d932e93c1595e59a8672aa7400e8922c39bb9b0668ed99ac6fa867822",
+ "sha256:48bf7d383a35e668b984c805470518b635d48b95a3c57cb03f37eaa3551b5f9f",
+ "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985",
+ "sha256:4d18cd0e9a0f37c9f4088e50e3839fcb69a380a0ec957408e0b57cff08ee0a26",
+ "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29",
+ "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b",
+ "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250",
+ "sha256:78e6c137ba35476adb5432103ae1534f2f5295605201d946a4198a0dea4b38e7",
+ "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5",
+ "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce",
+ "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e",
+ "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4",
+ "sha256:8e0e4e66fd80f277a8c3de016a81a554e76ccf6b8d881ee0b53200305a8433f6",
+ "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5",
+ "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44",
+ "sha256:9e9018544ab07614d591a26c1bd4293ddf40752cc435caf69196740516af7100",
+ "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c",
+ "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e",
+ "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e",
+ "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2",
+ "sha256:cc2856d24afa44295735e72f3c75d6ee7fdd4336d8d3a8f3d44de7aa6b766df2",
+ "sha256:d733dec0614bb8f4bcb7c8af88172b974f685a31dc3a65cca0527e3120de5606",
+ "sha256:dc8b3850d2a601ca2320d081874033684e246d28e1c5e89db0864077cfc8f5a9",
+ "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa",
+ "sha256:e998cf7c29473bd077704cea3577d23123094311f59bdc4af551923b168332b1",
+ "sha256:ebac3f0b5732014a126b43c2b7567f2f0e0afea7d9119a3378bde46d3dcad88e",
+ "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73",
+ "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0",
+ "sha256:f7027414f2b88992877573ab780c19ecb54d3a536bef3397933573d6b5068be4",
+ "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e",
+ "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1"
],
"index": "pypi",
- "version": "==2.0.38"
+ "markers": "python_version >= '3.7'",
+ "version": "==2.0.44"
+ },
+ "sqlalchemy-schemadisplay": {
+ "hashes": [
+ "sha256:e4b928e2aec145f72a2b35de7855a78fca5e09ac4d48f2d58b4472cb640cd362",
+ "sha256:e90b9c9868814975d674a889aadb7c4651658f0e119e1c9320279ea527744d5e"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==2.0"
},
"typing-extensions": {
"hashes": [
- "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
- "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
+ "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466",
+ "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"
],
"index": "pypi",
- "version": "==4.12.2"
+ "markers": "python_version >= '3.9'",
+ "version": "==4.15.0"
},
"urllib3": {
"hashes": [
diff --git a/database_diagram.png b/database_diagram.png
new file mode 100644
index 0000000000000000000000000000000000000000..df0898593e6b09641060de268a2b446ea1039595
GIT binary patch
literal 147169
zcmd?Rc{rDC+ctVBm7$P`WQZa~LX;3?E`$upRG~5^%8*QzF;hZHQ7E&d3}wz(8VnhV
zOi6
P<-h11g`}XShyRP#*&g0mRecz8WM0daX3I;9)
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