Skip to content

Commit 560fb75

Browse files
authored
Merge pull request #507 from Police-Data-Accessibility-Project/mc_494_data_source_submission
Add linking to batch logic, remove required user id for batches
2 parents 67cd9ef + f24f6c4 commit 560fb75

File tree

5 files changed

+72
-8
lines changed

5 files changed

+72
-8
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Set batches.user_id to be nullable
2+
3+
Revision ID: f32ba7664e9f
4+
Revises: 6adf9d894180
5+
Create Date: 2025-10-21 11:23:35.611484
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = 'f32ba7664e9f'
16+
down_revision: Union[str, None] = '6adf9d894180'
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
op.alter_column(
23+
table_name='batches',
24+
column_name='user_id',
25+
nullable=True
26+
)
27+
28+
29+
def downgrade() -> None:
30+
pass

src/api/endpoints/submit/data_source/query.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
from src.api.endpoints.submit.data_source.request import DataSourceSubmissionRequest
66
from src.api.endpoints.submit.data_source.response import SubmitDataSourceURLProposalResponse
77
from src.collectors.enums import URLStatus
8+
from src.core.enums import BatchStatus
9+
from src.db.models.impl.batch.sqlalchemy import Batch
10+
from src.db.models.impl.link.batch_url.sqlalchemy import LinkBatchURL
811
from src.db.models.impl.url.core.enums import URLSource
912
from src.db.models.impl.url.core.sqlalchemy import URL
1013
from src.db.models.impl.url.optional_ds_metadata.sqlalchemy import URLOptionalDataSourceMetadata
@@ -40,6 +43,23 @@ async def run(self, session: AsyncSession) -> Any:
4043

4144
url_id: int = url.id
4245

46+
# Add Batch
47+
batch = Batch(
48+
strategy='manual',
49+
status=BatchStatus.READY_TO_LABEL,
50+
parameters={}
51+
)
52+
session.add(batch)
53+
await session.flush()
54+
batch_id: int = batch.id
55+
56+
# Add Batch URL link
57+
batch_url_link = LinkBatchURL(
58+
batch_id=batch_id,
59+
url_id=url_id
60+
)
61+
session.add(batch_url_link)
62+
4363
# Optionally add Record Type as suggestion
4464
if self.request.record_type is not None:
4565
record_type_suggestion = AnonymousAnnotationRecordType(

src/db/models/impl/batch/sqlalchemy.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from sqlalchemy import Column, Integer, TIMESTAMP, Float, JSON
22
from sqlalchemy.dialects import postgresql
3-
from sqlalchemy.orm import relationship
3+
from sqlalchemy.orm import relationship, Mapped
44

5+
from src.core.enums import BatchStatus
56
from src.db.models.helpers import CURRENT_TIME_SERVER_DEFAULT
67
from src.db.models.impl.log.sqlalchemy import Log
78
from src.db.models.templates_.with_id import WithIDBase
@@ -23,9 +24,9 @@ class Batch(WithIDBase):
2324
'manual',
2425
name='batch_strategy'),
2526
nullable=False)
26-
user_id = Column(Integer, nullable=False)
27+
user_id = Column(Integer, nullable=True)
2728
# Gives the status of the batch
28-
status = Column(
29+
status: Mapped[BatchStatus] = Column(
2930
batch_status_enum,
3031
nullable=False
3132
)

tests/automated/integration/api/batch/test_batch.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
from src.api.endpoints.batch.dtos.get.summaries.summary import BatchSummary
2-
from src.db.models.impl.batch.pydantic.info import BatchInfo
31
from src.db.dtos.url.insert import InsertURLsInfo
4-
from src.collectors.impl.example.dtos.input import ExampleInputDTO
5-
from src.core.enums import BatchStatus
2+
63

74
def test_get_batch_urls(api_test_helper):
85

tests/automated/integration/api/submit/data_source/test_core.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
from src.api.endpoints.submit.data_source.request import DataSourceSubmissionRequest
66
from src.collectors.enums import URLStatus
7-
from src.core.enums import RecordType
7+
from src.core.enums import RecordType, BatchStatus
88
from src.db.client.async_ import AsyncDatabaseClient
9+
from src.db.models.impl.batch.sqlalchemy import Batch
10+
from src.db.models.impl.link.batch_url.sqlalchemy import LinkBatchURL
911
from src.db.models.impl.url.core.enums import URLSource
1012
from src.db.models.impl.url.core.sqlalchemy import URL
1113
from src.db.models.impl.url.optional_ds_metadata.enums import AgencyAggregationEnum, UpdateMethodEnum, \
@@ -73,6 +75,20 @@ async def test_submit_data_source(
7375
assert url.source == URLSource.MANUAL
7476
assert url.status == URLStatus.OK
7577

78+
# Check for Batch
79+
batch: Batch = await adb_client.one_or_none_model(Batch)
80+
assert batch is not None
81+
assert batch.user_id is None
82+
assert batch.strategy == 'manual'
83+
assert batch.status == BatchStatus.READY_TO_LABEL.value
84+
assert batch.parameters == {}
85+
86+
# Check for Batch URL Link
87+
batch_url_link: LinkBatchURL = await adb_client.one_or_none_model(LinkBatchURL)
88+
assert batch_url_link is not None
89+
assert batch_url_link.batch_id == batch.id
90+
assert batch_url_link.url_id == url.id
91+
7692
# Check for Location Suggestion
7793
location_suggestion: AnonymousAnnotationLocation = await adb_client.one_or_none_model(AnonymousAnnotationLocation)
7894
assert location_suggestion is not None

0 commit comments

Comments
 (0)