Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
fae7dfd
feature(street): add image provider in schema
ofr1tz Nov 11, 2025
bca81b2
feat(street): add panoramax as image provider
ofr1tz Nov 13, 2025
119cf5c
feat(street): update firebase submodule pointer
ofr1tz Nov 18, 2025
8f67526
feat(street): update schema for image provider selection
ofr1tz Feb 11, 2026
6032034
feat(street): extend firebase_id char length to 36 to accommodate pan…
ofr1tz Feb 17, 2026
26ab735
feat(street): use safe image provider api url
ofr1tz Feb 17, 2026
08075fa
feat(street): update submodule pointer
ofr1tz Feb 17, 2026
68a84da
feat(street): update submodule pointer
ofr1tz Feb 17, 2026
5b968c3
feat(street): add image provider to firebase project type specifics
ofr1tz Feb 17, 2026
688f171
feat(street): add image provider to firebase tutorial
ofr1tz Feb 18, 2026
172cf0e
feat(street): Correctly convert Mapillary and Panoramax timestamps, e…
ofr1tz Feb 19, 2026
408a6e8
fix(street): format and typechecks
ofr1tz Feb 24, 2026
8a2546d
feat(street): submodule pointer for updated test assets
ofr1tz Feb 24, 2026
9936f03
feat(street): fix tests
ofr1tz Feb 24, 2026
e4d4fc8
feat(street): improve cov
ofr1tz Feb 24, 2026
c94dfa4
feat(streets): format
ofr1tz Feb 24, 2026
66cb605
feat(street): fix test
ofr1tz Feb 24, 2026
05ede22
feat(street): update submodule pointers
ofr1tz Feb 24, 2026
30ef921
feat(street): add panoramax custom to enum, use pano_only instead is_…
ofr1tz Mar 19, 2026
35605b9
fix(street): formatting
ofr1tz Mar 19, 2026
f15f817
fix(street): ruff errors
ofr1tz Mar 19, 2026
c3c251b
fix(street): adjust tests
ofr1tz Mar 19, 2026
d307d24
feat(street): remove url from provider if Mapillary
ofr1tz Mar 19, 2026
4dc301c
Update utils/spatial_sampling.py
ofr1tz Mar 23, 2026
cf75ff4
refactor(street): move tile level logic to StreetImageProvider and ma…
ofr1tz Mar 23, 2026
c924b01
feat(street): update graphql schema
ofr1tz Mar 23, 2026
036888a
test(street): update test assets to reflect changes (default image pr…
ofr1tz Mar 23, 2026
cfd7c79
fix(street): Use assert_never, cast firebase task id to int when prov…
ofr1tz Apr 2, 2026
3550252
fix(street): update firebase submodule pointer
ofr1tz Apr 2, 2026
3089d82
fix(street): update e2e test, firebase submodule pointer
ofr1tz Apr 2, 2026
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
19 changes: 19 additions & 0 deletions apps/common/migrations/0003_alter_announcement_firebase_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.2.5 on 2026-02-17 12:03

import ulid
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('common', '0002_initial'),
]

operations = [
migrations.AlterField(
model_name='announcement',
name='firebase_id',
field=models.CharField(default=ulid.ULID, max_length=36, unique=True),
),
]
3 changes: 2 additions & 1 deletion apps/common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ class FirebasePushResource(Model):
# NOTE: We should not directly use old_id. This is ID reference to old system
old_id = models.CharField[str | None, str | None](max_length=30, db_index=True, null=True, blank=True)

firebase_id = models.CharField[str, str](max_length=30, unique=True, default=ULID)
# NOTE: Panoramax uses UUIDv4 (length 36) for identifiers, which we use as firebase_id for street project tasks
firebase_id = models.CharField[str, str](max_length=36, unique=True, default=ULID)

firebase_push_status: int | None = IntegerChoicesField( # type: ignore[reportAssignmentType]
choices_enum=FirebasePushStatusEnum,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 5.2.5 on 2026-02-17 12:03

import ulid
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('contributor', '0002_initial'),
]

operations = [
migrations.AlterField(
model_name='contributorteam',
name='firebase_id',
field=models.CharField(default=ulid.ULID, max_length=36, unique=True),
),
migrations.AlterField(
model_name='contributorusergroup',
name='firebase_id',
field=models.CharField(default=ulid.ULID, max_length=36, unique=True),
),
]
5 changes: 5 additions & 0 deletions apps/project/graphql/inputs/project_types/street.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import strawberry

from project_types.street import project as street_project
from utils.geo.street_image_provider.models import StreetImageProvider


@strawberry.experimental.pydantic.input(model=street_project.StreetMapillaryImageFilters, all_fields=True)
class StreetMapillaryImageFiltersInput: ...


@strawberry.experimental.pydantic.input(model=StreetImageProvider, all_fields=True)
class StreetImageProviderInput: ...


@strawberry.experimental.pydantic.input(model=street_project.StreetProjectProperty, all_fields=True)
class StreetProjectPropertyInput: ...
5 changes: 5 additions & 0 deletions apps/project/graphql/types/project_types/street.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import strawberry

from project_types.street import project as street_project
from utils.geo.street_image_provider.models import StreetImageProvider as StreetImageProviderModel


@strawberry.experimental.pydantic.type(model=street_project.StreetMapillaryImageFilters, all_fields=True)
class StreetMapillaryImageFilters: ...


@strawberry.experimental.pydantic.type(model=StreetImageProviderModel, all_fields=True)
class StreetImageProvider: ...


@strawberry.experimental.pydantic.type(model=street_project.StreetProjectProperty, all_fields=True)
class StreetProjectPropertyType: ...
18 changes: 18 additions & 0 deletions apps/project/migrations/0011_alter_projecttask_firebase_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.2.5 on 2025-11-12 15:12

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('project', '0010_alter_projecttask_unique_together'),
]

operations = [
migrations.AlterField(
model_name='projecttask',
name='firebase_id',
field=models.CharField(max_length=36),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 5.2.5 on 2026-02-17 12:03

import ulid
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('project', '0011_alter_projecttask_firebase_id'),
]

operations = [
migrations.AlterField(
model_name='organization',
name='firebase_id',
field=models.CharField(default=ulid.ULID, max_length=36, unique=True),
),
migrations.AlterField(
model_name='project',
name='firebase_id',
field=models.CharField(default=ulid.ULID, max_length=36, unique=True),
),
]
2 changes: 1 addition & 1 deletion apps/project/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ class ProjectTask(FirebasePushResource):
in the context of a larger mapping or data collection project.
"""

firebase_id = models.CharField[str, str](max_length=30)
firebase_id = models.CharField[str, str](max_length=36)

task_group: ProjectTaskGroup = models.ForeignKey[ProjectTaskGroup, ProjectTaskGroup]( # type: ignore[reportAssignmentType]
ProjectTaskGroup,
Expand Down
6 changes: 6 additions & 0 deletions apps/project/tests/e2e_create_street_project_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,12 @@ def _test_project(self, filename: str):
sanitized_tasks_actual = project_tasks_fb_data
sanitized_tasks_expected = test_data["expected_project_tasks_data"]

for tasks in sanitized_tasks_expected.values():
for task in tasks:
task_id = task.get("taskId")
if isinstance(task_id, str) and task_id.isdigit():
task["taskId"] = int(task_id)

assert sanitized_tasks_actual == sanitized_tasks_expected, (
"Differences found between expected and actual tasks on project in firebase."
)
Expand Down
2 changes: 1 addition & 1 deletion apps/project/tests/mutation_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1652,7 +1652,7 @@ def test_project_street(self, mock_requests): # type: ignore[reportMissingParam
],
},
"mapillaryImageFilters": {
"isPano": True,
"panoOnly": True,
"creatorId": None,
"organizationId": None,
"startTime": None,
Expand Down
1 change: 1 addition & 0 deletions main/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class Config:
# NOTE: We get mapillary data from mapillary
MAPILLARY_API_LINK = "https://tiles.mapillary.com/maps/vtp/mly1_computed_public/2/"
MAPILLARY_API_KEY = typing.cast("str", settings.MAPILLARY_API_KEY)
PANORAMAX_API_LINK = "https://api.panoramax.xyz/"

FIREBASE_HELPER = typing.cast("FirebaseHelper", settings.FIREBASE_HELPER)
FIREBASE_EMULATOR_USE = typing.cast("str | None", settings.FIREBASE_EMULATOR_USE)
Expand Down
2 changes: 2 additions & 0 deletions main/graphql/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
from project_types.validate.project import ValidateObjectSourceTypeEnum
from project_types.validate_image.project import ValidateImageSourceTypeEnum
from utils.geo.raster_tile_server.config import RasterTileServerNameEnum
from utils.geo.street_image_provider.models import StreetImageProviderNameEnum
from utils.geo.vector_tile_server.config import VectorTileServerNameEnum

ENUM_TO_STRAWBERRY_ENUMS: list[type] = [
RasterTileServerNameEnum,
StreetImageProviderNameEnum,
VectorTileServerNameEnum,
ValidateObjectSourceTypeEnum,
ValidateImageSourceTypeEnum,
Expand Down
Loading
Loading