Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7e99dd7
feat(models): add Task, Category, TaskOffered, TaskDealed, Payment
LoretoConcha Aug 22, 2025
9b7f527
tablas jaqueline
jaquenwn Aug 22, 2025
66b5715
elimine tabla fake user
LoretoConcha Aug 22, 2025
33eecf8
review no unique ids y task_dealed
jaquenwn Aug 22, 2025
6007f32
Parte de maximiliano casi lista
M-Manriquez Aug 22, 2025
4072485
Resuelvo conflictos
M-Manriquez Aug 22, 2025
260ec6a
Refactorizar modelos
M-Manriquez Aug 22, 2025
5c950bf
Resolver errores
M-Manriquez Aug 22, 2025
ae7d62a
Arreglado errores
M-Manriquez Aug 25, 2025
47efb88
Refactorizacion completa de los modelos
M-Manriquez Aug 25, 2025
0cb2a3d
vista crear tarea
jaquenwn Aug 25, 2025
1c72a79
formulario tarea
jaquenwn Aug 25, 2025
1f50d84
vista basica admin
jaquenwn Aug 26, 2025
b16abf3
feat: primera versión de vistas de perfil (privado/público) con menú …
idcarrera Aug 26, 2025
b15a325
Avances en los endpoints
M-Manriquez Aug 26, 2025
89ae313
Merge remote-tracking branch 'origin' into integration
M-Manriquez Aug 26, 2025
2bf5dad
Merge pull request #21 from 4GeeksAcademy/integration
jaquenwn Aug 26, 2025
3f96ac4
boton archivos
jaquenwn Aug 26, 2025
24b1ff1
Merge branch 'main' into feat/auth-roles-front
idcarrera Aug 26, 2025
a96fb1e
Merge pull request #22 from 4GeeksAcademy/feat/auth-roles-front
idcarrera Aug 26, 2025
4ec95f3
WIP: guardando cambios antes de actualizar main - login con google
idcarrera Aug 26, 2025
7424176
Merge main into feat/auth-roles-front
idcarrera Aug 26, 2025
d31a3ca
hooks vista tarea
jaquenwn Aug 27, 2025
ec9f4d0
post new task fetch
jaquenwn Aug 27, 2025
e52ef46
Merge pull request #23 from 4GeeksAcademy/front-jaque
idcarrera Aug 27, 2025
c6e0a81
feat: perfil público con estilos base + backend profile route
idcarrera Aug 28, 2025
536dc37
V.2 vistas de registro, navbar y perfil público con estilos base + ba…
idcarrera Aug 28, 2025
05c9728
Merge branch 'main' into feat/auth-roles-front
idcarrera Aug 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"workbench.editorAssociations": {
"*.md": "vscode.markdown.preview.editor"
},
"[javascriptreact]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
}
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"workbench.editorAssociations": {
"*.md": "vscode.markdown.preview.editor"
},
"[javascriptreact]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"githubPullRequests.ignoredPullRequestBranches": ["main"]
}
14 changes: 10 additions & 4 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ verify_ssl = true
[dev-packages]

[packages]
flask = "*"
flask-sqlalchemy = "*"
flask-migrate = "*"
flask-swagger = "*"
psycopg2-binary = "*"
python-dotenv = "*"
Expand All @@ -17,9 +14,18 @@ gunicorn = "*"
cloudinary = "*"
flask-admin = "*"
typing-extensions = "*"
flask-jwt-extended = "==4.6.0"
wtforms = "==3.1.2"
flask-jwt-extended = "*"
flask-migrate = "*"
flask-sqlalchemy = "*"
sqlalchemy = "*"
<<<<<<< HEAD
requests = "*"
google-auth = "*"
google-auth-oauthlib = "*"
=======
flask = "*"
>>>>>>> main

[requires]
python_version = "3.13"
Expand Down
489 changes: 324 additions & 165 deletions Pipfile.lock

Large diffs are not rendered by default.

Empty file added calhost
Empty file.
35 changes: 0 additions & 35 deletions migrations/versions/0763d677d453_.py

This file was deleted.

245 changes: 245 additions & 0 deletions migrations/versions/d93ef08ef900_init.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
"""init

Revision ID: d93ef08ef900
Revises:
Create Date: 2025-08-28 15:53:18.648875

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'd93ef08ef900'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('category',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=50), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('name')
)
op.create_table('rol',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('type', sa.String(length=50), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('type')
)
op.create_table('user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('email', sa.String(length=120), nullable=False),
sa.Column('username', sa.String(length=80), nullable=False),
sa.Column('password', sa.String(length=200), nullable=False),
sa.Column('created_at', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
sa.Column('modified_at', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('email'),
sa.UniqueConstraint('username')
)
op.create_table('account_settings',
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('phone', sa.String(length=20), nullable=True),
sa.Column('billing_info', sa.String(length=250), nullable=True),
sa.Column('language', sa.String(length=50), nullable=True),
sa.Column('marketing_emails', sa.Boolean(), nullable=True),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('modified_at', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('user_id')
)
op.create_table('profile',
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=100), nullable=False),
sa.Column('last_name', sa.String(length=100), nullable=False),
sa.Column('avatar', sa.String(length=100), nullable=True),
sa.Column('city', sa.String(length=50), nullable=False),
sa.Column('birth_date', sa.Date(), nullable=True),
sa.Column('bio', sa.String(length=250), nullable=True),
sa.Column('skills', sa.String(length=250), nullable=True),
sa.Column('rating_avg', sa.Float(), nullable=True),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('modified_at', sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('user_id')
)
op.create_table('task',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('title', sa.String(length=120), nullable=True),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('location', sa.String(length=120), nullable=True),
sa.Column('price', sa.Numeric(precision=10, scale=2), nullable=True),
sa.Column('due_at', sa.DateTime(), nullable=True),
sa.Column('posted_at', sa.Date(), server_default=sa.text('(CURRENT_DATE)'), nullable=False),
sa.Column('assigned_at', sa.Date(), nullable=True),
sa.Column('completed_at', sa.Date(), nullable=True),
sa.Column('status', sa.String(length=30), server_default='pending', nullable=False),
sa.Column('publisher_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['publisher_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id')
)
with op.batch_alter_table('task', schema=None) as batch_op:
batch_op.create_index(batch_op.f('ix_task_publisher_id'), ['publisher_id'], unique=False)

op.create_table('user_rol',
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('role_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['role_id'], ['rol.id'], ),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('user_id', 'role_id')
)
op.create_table('task_categories',
sa.Column('task_id', sa.Integer(), nullable=False),
sa.Column('category_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['category_id'], ['category.id'], ondelete='CASCADE'),
sa.ForeignKeyConstraint(['task_id'], ['task.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('task_id', 'category_id')
)
op.create_table('tasks_offered',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('status', sa.Numeric(precision=10, scale=2), nullable=True),
sa.Column('created_at', sa.Date(), server_default=sa.text('(CURRENT_DATE)'), nullable=False),
sa.Column('updated_at', sa.Date(), server_default=sa.text('(CURRENT_DATE)'), nullable=False),
sa.Column('task_id', sa.Integer(), nullable=False),
sa.Column('tasker_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['task_id'], ['task.id'], ),
sa.ForeignKeyConstraint(['tasker_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('task_id', 'tasker_id', name='uq_tasks_offered_task_tasker')
)
with op.batch_alter_table('tasks_offered', schema=None) as batch_op:
batch_op.create_index(batch_op.f('ix_tasks_offered_task_id'), ['task_id'], unique=False)
batch_op.create_index(batch_op.f('ix_tasks_offered_tasker_id'), ['tasker_id'], unique=False)

op.create_table('task_dealed',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('fixed_price', sa.Numeric(precision=10, scale=2), nullable=True),
sa.Column('status', sa.String(length=30), nullable=False),
sa.Column('accepted_at', sa.Date(), nullable=True),
sa.Column('delivered_at', sa.Date(), nullable=True),
sa.Column('cancelled_at', sa.Date(), nullable=True),
sa.Column('task_id', sa.Integer(), nullable=False),
sa.Column('offer_id', sa.Integer(), nullable=False),
sa.Column('client_id', sa.Integer(), nullable=False),
sa.Column('tasker_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['client_id'], ['user.id'], ),
sa.ForeignKeyConstraint(['offer_id'], ['tasks_offered.id'], ),
sa.ForeignKeyConstraint(['task_id'], ['task.id'], ),
sa.ForeignKeyConstraint(['tasker_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id')
)
with op.batch_alter_table('task_dealed', schema=None) as batch_op:
batch_op.create_index(batch_op.f('ix_task_dealed_client_id'), ['client_id'], unique=False)
batch_op.create_index(batch_op.f('ix_task_dealed_offer_id'), ['offer_id'], unique=False)
batch_op.create_index(batch_op.f('ix_task_dealed_task_id'), ['task_id'], unique=False)
batch_op.create_index(batch_op.f('ix_task_dealed_tasker_id'), ['tasker_id'], unique=False)

op.create_table('dispute',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('reason', sa.String(length=120), nullable=False),
sa.Column('details', sa.String(length=1000), nullable=False),
sa.Column('status', sa.String(length=30), nullable=False),
sa.Column('resolution', sa.String(length=1000), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('dealed_id', sa.Integer(), nullable=False),
sa.Column('raised_by', sa.Integer(), nullable=False),
sa.Column('resolved_by_admin_user', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['dealed_id'], ['task_dealed.id'], ),
sa.ForeignKeyConstraint(['raised_by'], ['user.id'], ),
sa.ForeignKeyConstraint(['resolved_by_admin_user'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('dealed_id')
)
op.create_table('message',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('body', sa.String(length=10000), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.Column('dealer_id', sa.Integer(), nullable=False),
sa.Column('sender_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['dealer_id'], ['task_dealed.id'], ),
sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('dealer_id')
)
op.create_table('payments',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('amount', sa.Numeric(precision=10, scale=2), nullable=False),
sa.Column('status', sa.String(length=20), nullable=False),
sa.Column('created_at', sa.Date(), server_default=sa.text('(CURRENT_DATE)'), nullable=False),
sa.Column('updated_at', sa.Date(), server_default=sa.text('(CURRENT_DATE)'), nullable=False),
sa.Column('dealed_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['dealed_id'], ['task_dealed.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
with op.batch_alter_table('payments', schema=None) as batch_op:
batch_op.create_index(batch_op.f('ix_payments_dealed_id'), ['dealed_id'], unique=True)

op.create_table('review',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('review', sa.String(length=10000), nullable=True),
sa.Column('rate', sa.Numeric(precision=3, scale=2), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('publisher_id', sa.Integer(), nullable=False),
sa.Column('worker_id', sa.Integer(), nullable=False),
sa.Column('task_dealed_id', sa.Integer(), nullable=False),
sa.Column('task_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['publisher_id'], ['user.id'], ),
sa.ForeignKeyConstraint(['task_dealed_id'], ['task_dealed.id'], ),
sa.ForeignKeyConstraint(['task_id'], ['task.id'], ),
sa.ForeignKeyConstraint(['worker_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('task_dealed_id')
)
op.create_table('admin_action',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('action', sa.String(length=60), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('dispute_id', sa.Integer(), nullable=False),
sa.Column('admin_user', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['admin_user'], ['user.id'], ),
sa.ForeignKeyConstraint(['dispute_id'], ['dispute.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('admin_user')
)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('admin_action')
op.drop_table('review')
with op.batch_alter_table('payments', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_payments_dealed_id'))

op.drop_table('payments')
op.drop_table('message')
op.drop_table('dispute')
with op.batch_alter_table('task_dealed', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_task_dealed_tasker_id'))
batch_op.drop_index(batch_op.f('ix_task_dealed_task_id'))
batch_op.drop_index(batch_op.f('ix_task_dealed_offer_id'))
batch_op.drop_index(batch_op.f('ix_task_dealed_client_id'))

op.drop_table('task_dealed')
with op.batch_alter_table('tasks_offered', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_tasks_offered_tasker_id'))
batch_op.drop_index(batch_op.f('ix_tasks_offered_task_id'))

op.drop_table('tasks_offered')
op.drop_table('task_categories')
op.drop_table('user_rol')
with op.batch_alter_table('task', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_task_publisher_id'))

op.drop_table('task')
op.drop_table('profile')
op.drop_table('account_settings')
op.drop_table('user')
op.drop_table('rol')
op.drop_table('category')
# ### end Alembic commands ###
Loading