66from django .db import transaction
77from ulid import ULID
88
9- from apps .common .models import AssetTypeEnum
9+ from apps .common .models import AssetTypeEnum , FirebasePushStatusEnum
1010from apps .project .custom_options import get_fallback_custom_options_for_export
1111from apps .project .exports .geojson import gzipped_csv_to_gzipped_geojson
1212from apps .project .models import Project , ProjectAsset , ProjectAssetExportTypeEnum , ProjectProgressStatusEnum , ProjectTypeEnum
13- from apps .project .tasks import send_slack_message_for_project
13+ from apps .project .tasks import push_project_to_firebase , send_slack_message_for_project
1414from apps .user .models import User
1515from main .config import Config
1616from main .logging import log_extra
1717from project_types .store import get_project_type_handler
1818from project_types .tile_map_service .compare .project import CompareProjectProperty
1919from project_types .tile_map_service .completeness .project import CompletenessProjectProperty
2020from project_types .tile_map_service .find .project import FindProjectProperty
21+ from utils .geo .raster_tile_server .config import RasterTileServerNameEnum
2122
2223from .mapping_results import generate_mapping_results
2324from .mapping_results_aggregate .task import generate_mapping_results_aggregate_by_task
@@ -56,8 +57,32 @@ def _export_project_data(project: Project, tmp_directory: Path):
5657 # legacy system path: /api/hot_tm/hot_tm_{project.id}.geojson
5758 tmp_tasking_manager_hot_tm_geojson = tmp_directory / f"hot_tm_{ project .id } .geojson"
5859
59- # TODO: if maxar is used for tile_server_name, this should be true
60- add_metadata = False
60+ # FIXME(tnagorra): move this to project handler
61+ tile_servers = set [RasterTileServerNameEnum ]()
62+ if isinstance (
63+ project_type_handler .project_type_specifics ,
64+ FindProjectProperty ,
65+ ):
66+ tile_servers .add (project_type_handler .project_type_specifics .tile_server_property .name )
67+ elif isinstance (
68+ project_type_handler .project_type_specifics ,
69+ CompareProjectProperty ,
70+ ):
71+ tile_servers .add (project_type_handler .project_type_specifics .tile_server_property .name )
72+ tile_servers .add (project_type_handler .project_type_specifics .tile_server_b_property .name )
73+ elif isinstance (
74+ project_type_handler .project_type_specifics ,
75+ CompletenessProjectProperty ,
76+ ):
77+ tile_servers .add (project_type_handler .project_type_specifics .tile_server_property .name )
78+ if project_type_handler .project_type_specifics .overlay_tile_server_property .raster :
79+ tile_servers .add (
80+ project_type_handler .project_type_specifics .overlay_tile_server_property .raster .tile_server .name ,
81+ )
82+
83+ add_metadata = (
84+ RasterTileServerNameEnum .MAXAR_STANDARD in tile_servers or RasterTileServerNameEnum .MAXAR_PREMIUM in tile_servers
85+ )
6186
6287 custom_options_raw = []
6388
@@ -136,6 +161,7 @@ def _export_project_data(project: Project, tmp_directory: Path):
136161 tmp_project_stats_by_date_csv .name ,
137162 )
138163
164+ # FIXME(tnagorra): move this to project handler
139165 generate_hot_tm_geometries = project .project_type_enum in [
140166 ProjectTypeEnum .COMPARE ,
141167 ProjectTypeEnum .COMPLETENESS ,
@@ -151,14 +177,17 @@ def _export_project_data(project: Project, tmp_directory: Path):
151177 )
152178
153179 if not project_stats_by_date_df .empty :
154- project .progress = project_stats_by_date_df ["cum_progress" ].iloc [- 1 ] * 100
155- if project .progress >= 100 :
156- project .progress_status = ProjectProgressStatusEnum .COMPLETED
157180 project .number_of_contributor_users = project_stats_by_date_df ["cum_number_of_users" ].iloc [- 1 ]
158181 project .number_of_results = project_stats_by_date_df ["cum_number_of_results" ].iloc [- 1 ]
159182 project .number_of_results_for_progress = project_stats_by_date_df ["cum_number_of_results_progress" ].iloc [- 1 ]
160183 project .last_contribution_date = project_stats_by_date_df .index [- 1 ]
161- # TODO: Trigger slack notifications on progress change
184+
185+ previous_progress = project .progress
186+ project .progress = project_stats_by_date_df ["cum_progress" ].iloc [- 1 ] * 100
187+
188+ if project .progress >= 100 :
189+ project .progress_status = ProjectProgressStatusEnum .COMPLETED
190+
162191 if project .progress >= 90 and project .slack_progress_notifications < 90 :
163192 transaction .on_commit (
164193 lambda : send_slack_message_for_project .delay (project_id = project .id , action = "progress-change" ),
@@ -169,6 +198,13 @@ def _export_project_data(project: Project, tmp_directory: Path):
169198 lambda : send_slack_message_for_project .delay (project_id = project .id , action = "progress-change" ),
170199 )
171200
201+ if project .progress != previous_progress :
202+ # FIXME(tnagorra): Do we only send updates for the 2 fields?
203+ transaction .on_commit (
204+ lambda : push_project_to_firebase .delay (project_id = project .id ),
205+ )
206+ project .update_firebase_push_status (FirebasePushStatusEnum .PENDING , False )
207+
172208 project .save (
173209 update_fields = (
174210 "progress" ,
@@ -177,6 +213,8 @@ def _export_project_data(project: Project, tmp_directory: Path):
177213 "number_of_results" ,
178214 "number_of_results_for_progress" ,
179215 "last_contribution_date" ,
216+ "firebase_push_status" ,
217+ "firebase_last_pushed" ,
180218 ),
181219 )
182220
0 commit comments