Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions backend/app/models/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Job(db.Model):
# Guardamos el hash de la descripción para detectar rápidamente si una vacante ya fue procesada o si cambió en su origen
description_hash = db.Column(db.String(64), nullable=False, unique=True)
processed = db.Column(db.Boolean, default=False, nullable=False)
remote = db.Column(db.Boolean, nullable=False, default=False, server_default=db.text("false"))

created_at = db.Column(db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
updated_at = db.Column(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""add remote column to jobs table

Revision ID: e269761308d8
Revises: a1b2c3d4e5f6
Create Date: 2026-07-30 21:24:09.402072

"""
from alembic import op
import sqlalchemy as sa


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


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('jobs', schema=None) as batch_op:
batch_op.add_column(sa.Column('remote', sa.Boolean(), server_default=sa.text('false'), nullable=False))

# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('jobs', schema=None) as batch_op:
batch_op.drop_column('remote')

# ### end Alembic commands ###
2 changes: 1 addition & 1 deletion backend/scripts/backfill_remote_flag.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def backfill_remote_flag(execute):
try:
# El título o descripción pueden ser None en la BD? Según los modelos y el schema, title y description suelen ser strings, pero por precaución:
title = job.title or ""
description = job.description or ""
description = job.raw_description or ""

new_remote = IngestionService._compute_is_remote(title, description)

Expand Down
39 changes: 39 additions & 0 deletions backend/tests/integration/test_job_model_remote_column.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import pytest
from app.models.job import Job

def test_job_remote_defaults_to_false_when_not_specified(app, db_session):
""" crea un Job sin especificar remote, lo persiste, lo recupera con una query nueva y afirma que remote es False """
job = Job(
source="Test Source",
title="Test Job Title",
raw_description="This is a test job description",
description_hash="hash1234567890abcdef"
)
db_session.add(job)
db_session.commit()

db_session.expire_all()

with app.app_context():
fetched_job = db_session.get(Job, job.id)
assert fetched_job is not None
assert fetched_job.remote is False

def test_job_remote_persists_explicit_true_value(app, db_session):
""" crea un Job con remote=True explícito, lo persiste, lo recupera igual que el test anterior, y afirma que remote es True """
job = Job(
source="Test Source 2",
title="Test Job Title 2",
raw_description="This is another test job description",
description_hash="hash0987654321fedcba",
remote=True
)
db_session.add(job)
db_session.commit()

db_session.expire_all()

with app.app_context():
fetched_job = db_session.get(Job, job.id)
assert fetched_job is not None
assert fetched_job.remote is True
Loading