Skip to content

Commit 86bf782

Browse files
frozenheliumtnagorra
authored andcommitted
Add Validate project type
1 parent 01ee972 commit 86bf782

File tree

25 files changed

+748
-23
lines changed

25 files changed

+748
-23
lines changed

apps/project/graphql/inputs.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from apps.project.project_types.tile_map_service.compare import project as compare_project
1111
from apps.project.project_types.tile_map_service.completeness import project as completeness_project
1212
from apps.project.project_types.tile_map_service.find import project as find_project
13+
from apps.project.project_types.validate import project as validate_project
1314
from utils.geo.tile_server.models import TileServerCommonConfig, TileServerConfig, TileServerCustomConfig
1415

1516

@@ -26,6 +27,10 @@ class TileServerCommonConfigInput: ...
2627
class ProjectTileServerConfigInput: ...
2728

2829

30+
@strawberry.experimental.pydantic.input(model=validate_project.ValidateObjectSourceConfig, all_fields=True)
31+
class ValidateObjectSourceConfigInput: ...
32+
33+
2934
# Project Properties
3035
@strawberry.experimental.pydantic.input(model=compare_project.CompareProjectProperty, all_fields=True)
3136
class CompareProjectPropertyInput: ...
@@ -39,6 +44,10 @@ class FindProjectPropertyInput: ...
3944
class CompletenessProjectPropertyInput: ...
4045

4146

47+
@strawberry.experimental.pydantic.input(model=validate_project.ValidateProjectProperty, all_fields=True)
48+
class ValidateProjectPropertyInput: ...
49+
50+
4251
@strawberry_django.input(Organization)
4352
class OrganizationCreateInput(UserResourceCreateInputMixin):
4453
name: strawberry.auto
@@ -49,6 +58,7 @@ class ProjectTypeSpecificInput:
4958
compare: CompareProjectPropertyInput | None = strawberry.UNSET
5059
find: FindProjectPropertyInput | None = strawberry.UNSET
5160
completeness: CompletenessProjectPropertyInput | None = strawberry.UNSET
61+
validate: ValidateProjectPropertyInput | None = strawberry.UNSET
5262

5363

5464
# NOTE: Make sure this matches with the serializers ../serializers.py

apps/project/graphql/types.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from apps.project.project_types.tile_map_service.compare import project as compare_project
99
from apps.project.project_types.tile_map_service.completeness import project as completeness_project
1010
from apps.project.project_types.tile_map_service.find import project as find_project
11+
from apps.project.project_types.validate import project as validate_project
1112
from apps.tutorial.graphql.types import TutorialType
1213
from utils.geo.tile_server.models import TileServerCommonConfig, TileServerConfig, TileServerCustomConfig
1314

@@ -31,6 +32,10 @@ class ProjectTileServerCommonConfig: ...
3132
class ProjectTileServerConfig: ...
3233

3334

35+
@strawberry.experimental.pydantic.type(model=validate_project.ValidateObjectSourceConfig, all_fields=True)
36+
class ValidateObjectSourceConfig: ...
37+
38+
3439
# Project Properties
3540
@strawberry.experimental.pydantic.type(model=compare_project.CompareProjectProperty, all_fields=True)
3641
class CompareProjectPropertyType: ...
@@ -40,6 +45,10 @@ class CompareProjectPropertyType: ...
4045
class FindProjectPropertyType: ...
4146

4247

48+
@strawberry.experimental.pydantic.type(model=validate_project.ValidateProjectProperty, all_fields=True)
49+
class ValidateProjectPropertyType: ...
50+
51+
4352
@strawberry.experimental.pydantic.type(model=completeness_project.CompletenessProjectProperty, all_fields=True)
4453
class CompletenessProjectPropertyType: ...
4554

@@ -79,14 +88,22 @@ class ProjectType(UserResourceTypeMixin):
7988
async def project_type_specifics(
8089
self,
8190
project: strawberry.Parent[Project],
82-
) -> CompareProjectPropertyType | FindProjectPropertyType | CompletenessProjectPropertyType | None:
91+
) -> (
92+
CompareProjectPropertyType
93+
| FindProjectPropertyType
94+
| ValidateProjectPropertyType
95+
| CompletenessProjectPropertyType
96+
| None
97+
):
8398
data = project.project_type_specifics
8499
if data is None:
85100
return None
86101
if project.project_type_enum == Project.Type.FIND:
87102
return typing.cast("FindProjectPropertyType", find_project.FindProjectProperty.model_validate(data))
88103
if project.project_type_enum == Project.Type.COMPARE:
89104
return typing.cast("CompareProjectPropertyType", compare_project.CompareProjectProperty.model_validate(data))
105+
if project.project_type_enum == Project.Type.VALIDATE:
106+
return typing.cast("ValidateProjectPropertyType", validate_project.ValidateProjectProperty.model_validate(data))
90107
if project.project_type_enum == Project.Type.COMPLETENESS:
91108
return typing.cast(
92109
"CompletenessProjectPropertyType",
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.1.6 on 2025-05-29 10:44
2+
3+
import django.contrib.gis.db.models.fields
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('project', '0003_alter_organization_client_id_alter_project_client_id_and_more'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='projecttask',
16+
name='geometry',
17+
field=django.contrib.gis.db.models.fields.GeometryField(blank=True, default=None, null=True, srid=4326),
18+
),
19+
]

apps/project/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class ProjectTypeEnum(models.IntegerChoices):
4646
FIND = 1, "Find"
4747
""" Find project type. Previously known as Classification / Build Area. """
4848

49-
# FOOTPRINT = 2, "Validate"
50-
# """ Validate project type. Previously known as Footprint """
49+
VALIDATE = 2, "Validate"
50+
""" Validate project type. Previously known as Footprint """
5151

5252
COMPARE = 3, "Compare"
5353
""" Compare project type. Previously known as Change Detection. """
@@ -393,9 +393,9 @@ class ProjectTask(models.Model):
393393
related_name="+",
394394
)
395395

396-
# NOTE(tnagorra): The geometry is only necessary for footprint project type
396+
# NOTE(tnagorra): The geometry is only necessary for validate project type
397397
# FIXME(thenav56): Existing gid_models.MultiPolygonField(srid=4326, blank=True, null=True)
398-
geometry = gis_models.GeometryField(null=True, blank=True, default=None, dim=3)
398+
geometry = gis_models.GeometryField(null=True, blank=True, default=None, dim=2)
399399

400400
# TODO(thenav56): Currently this field collects any data not stored by another fields, pulled from firebase.
401401
# Also, used in SQL queries

apps/project/project_types/base/project.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ def get_max_time_spend_percentile(project_type: ProjectTypeEnum) -> float:
2929
return 1.4
3030
case ProjectTypeEnum.COMPARE:
3131
return 11.2
32-
# case ProjectTypeEnum.FOOTPRINT:
33-
# return 6.1
32+
case ProjectTypeEnum.VALIDATE:
33+
return 6.1
3434
# case ProjectTypeEnum.STREET:
3535
# return 65
3636

apps/project/project_types/store.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from .tile_map_service.compare.project import CompareProject
66
from .tile_map_service.completeness.project import CompletenessProject
77
from .tile_map_service.find.project import FindProject
8+
from .validate.project import ValidateProject
89

9-
type ProjectTypeHandlers = type[CompareProject | FindProject | CompletenessProject]
10+
type ProjectTypeHandlers = type[CompareProject | ValidateProject | FindProject | CompletenessProject]
1011

1112

1213
@typing.overload
@@ -21,6 +22,12 @@ def get_project_type_handler(
2122
) -> type[CompareProject]: ...
2223

2324

25+
@typing.overload
26+
def get_project_type_handler(
27+
project_type: typing.Literal[ProjectTypeEnum.VALIDATE],
28+
) -> type[ValidateProject]: ...
29+
30+
2431
@typing.overload
2532
def get_project_type_handler(
2633
project_type: typing.Literal[ProjectTypeEnum.COMPLETENESS],
@@ -33,5 +40,7 @@ def get_project_type_handler(project_type: ProjectTypeEnum) -> ProjectTypeHandle
3340
return FindProject
3441
case ProjectTypeEnum.COMPARE:
3542
return CompareProject
43+
case ProjectTypeEnum.VALIDATE:
44+
return ValidateProject
3645
case ProjectTypeEnum.COMPLETENESS:
3746
return CompletenessProject

apps/project/project_types/tile_map_service/base/project.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,9 @@ def validate(self):
231231

232232
extension = Path(aoi_asset.file.name).suffix
233233
with tempfile.NamedTemporaryFile(suffix=extension, dir=settings.TEMP_DIR) as temp_file:
234-
temp_file.write(aoi_asset.file.read())
234+
# FIXME(frozenhelium): close the aoi_asset file?
235+
with aoi_asset.file.open() as aoi_file:
236+
temp_file.write(aoi_file.read())
235237
temp_file.flush()
236238

237239
aoi_geometry = tile_grouping.get_geometry_from_file(temp_file.name)
Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,37 @@
1-
from apps.project.project_types.tile_map_service.compare import project as compare
1+
import typing
22

3+
from apps.project.models import Project, ProjectTypeEnum
4+
from apps.project.project_types.tile_map_service.base import project as base_project
5+
from utils.geo.tile_server.models import TileServerConfig
6+
from utils.geo.tile_server.tile_server import AvailableTileServerTypeAlias, get_tile_server
37

4-
# NOTE: If we want to extend these property, we will need to update CompletenessProject
5-
class CompletenessProjectProperty(compare.CompareProjectProperty): ...
68

9+
class CompletenessProjectProperty(base_project.TileMapServiceProjectProperty):
10+
tile_server_b_property: TileServerConfig
711

8-
# NOTE: If we want to extend these property, we will need to update CompletenessProject
9-
class CompletenessProjectTaskGroupProperty(compare.CompareProjectTaskGroupProperty): ...
1012

13+
class CompletenessProjectTaskGroupProperty(base_project.TileMapServiceProjectTaskGroupProperty): ...
1114

12-
# NOTE: If we want to extend these property, we will need to update CompletenessProject
13-
class CompletenessProjectTaskProperty(compare.CompareProjectTaskProperty): ...
15+
16+
class CompletenessProjectTaskProperty(base_project.TileMapServiceProjectTaskProperty):
17+
url_b: str
1418

1519

1620
class CompletenessProject(
17-
compare.CompareProject,
18-
): ...
21+
base_project.TileMapServiceBaseProject[
22+
CompletenessProjectProperty,
23+
CompletenessProjectTaskGroupProperty,
24+
CompletenessProjectTaskProperty,
25+
],
26+
):
27+
tile_server_b: AvailableTileServerTypeAlias
28+
29+
project_property_class = CompletenessProjectProperty
30+
project_task_group_property_class = CompletenessProjectTaskGroupProperty
31+
project_task_property_class = CompletenessProjectTaskProperty
32+
33+
def __init__(self, project: Project):
34+
super().__init__(project)
35+
if typing.TYPE_CHECKING:
36+
assert project.project_type == ProjectTypeEnum.COMPLETENESS, f"{type(self)} is defined for COMPLETENESS"
37+
self.tile_server_b = get_tile_server(self.project_type_specifics.tile_server_b_property)

apps/project/project_types/validate/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)