diff --git a/backend/app/models/job.py b/backend/app/models/job.py index 69ed9af..82ec882 100644 --- a/backend/app/models/job.py +++ b/backend/app/models/job.py @@ -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( diff --git a/backend/migrations/versions/e269761308d8_add_remote_column_to_jobs_table.py b/backend/migrations/versions/e269761308d8_add_remote_column_to_jobs_table.py new file mode 100644 index 0000000..03997d4 --- /dev/null +++ b/backend/migrations/versions/e269761308d8_add_remote_column_to_jobs_table.py @@ -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 ### diff --git a/backend/scripts/backfill_remote_flag.py b/backend/scripts/backfill_remote_flag.py index 4d5cf23..5e9133f 100644 --- a/backend/scripts/backfill_remote_flag.py +++ b/backend/scripts/backfill_remote_flag.py @@ -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) diff --git a/backend/tests/integration/test_job_model_remote_column.py b/backend/tests/integration/test_job_model_remote_column.py new file mode 100644 index 0000000..8a0f261 --- /dev/null +++ b/backend/tests/integration/test_job_model_remote_column.py @@ -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