Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
64 changes: 43 additions & 21 deletions apps/project/slack_messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ def get_project_information_block(
) -> dict: # type: ignore[reportMissingTypeArgument]
progress_bar = SlackMessage.format_progress_bar(project.progress)
username = SlackMessage.format_user_link(project.created_by)
project_text = SlackMessage.format_project_link(project)
tutorial_text = SlackMessage.format_tutorial_link(project.tutorial)
status = SlackMessage.format_project_status(project.status_enum)
project_type = SlackMessage.format_project_type(project.project_type_enum)
Expand All @@ -89,7 +88,6 @@ def get_project_information_block(
"text": {
"type": "mrkdwn",
"text": (
f"Project: {project_text}\n"
f"Tutorial: {tutorial_text}\n"
f"Project Type: {project_type}\n"
f"Requesting Organization: {project.requesting_organization.name}\n"
Expand Down Expand Up @@ -122,7 +120,7 @@ def get_message_for_project_progress(
website_url = Config.WebsiteKeys.project(firebase_id=project.firebase_id)

if progress >= 100:
text = f"Project '{SlackMessage.format_project_name(project)}' reached 100%"
text = "Project reached 100%"
blocks = [
{
"type": "header",
Expand All @@ -135,21 +133,20 @@ def get_message_for_project_progress(
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Congratulations! This project is now complete. Great work!",
"text": f"Congratulations! {SlackMessage.format_project_link(project)} is now complete. Great work!",
},
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"You can now *finish* this <{project_url}|project> and create another one. :mapswipe:",
"text": f"You can now *finish* this <{project_url}|project> and create another one.",
},
"accessory": {
"type": "button",
"text": {
"type": "plain_text",
"text": "Visit Website",
"emoji": True,
},
"value": "website-link",
"url": website_url,
Expand All @@ -163,7 +160,7 @@ def get_message_for_project_progress(
}

if 90 <= progress < 100:
text = f"Project '{SlackMessage.format_project_name(project)}' reached 90%"
text = "Project reached 90%"
blocks = [
{
"type": "header",
Expand All @@ -176,7 +173,10 @@ def get_message_for_project_progress(
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Almost there! Get your next projects ready.",
"text": (
f"Almost there! {SlackMessage.format_project_link(project)} is nearing completion.\n\n"
"Get your next projects ready."
),
},
},
]
Expand All @@ -185,12 +185,19 @@ def get_message_for_project_progress(
"blocks": blocks,
}

text = f"Project '{SlackMessage.format_project_name(project)}' reached {project.progress}%"
text = f"Project reached {project.progress}%"
blocks = [
{
"type": "header",
"text": {
"type": "plain_text",
"text": f"Project reached {project.progress}%",
},
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"type": "plain_text",
"text": "We are getting there! One swipe at a time.",
},
},
Expand All @@ -206,6 +213,7 @@ def get_message_for_project_publish(
project: Project,
) -> MapswipeSlack.MapswipeSlackMessageArgumentType:
website_url = Config.WebsiteKeys.project(firebase_id=project.firebase_id)
project_url = Config.ManagerDashboardUrls.project_url(project_id=project.pk)

text = "Project published! :raised_hands:"
blocks = [
Expand All @@ -221,20 +229,34 @@ def get_message_for_project_publish(
{
"type": "section",
"text": {
"type": "mrkdwn",
"type": "plain_text",
"text": "Happy Swiping! :slightly_smiling_face: :mapswipe:",
},
"accessory": {
"type": "button",
"text": {
"type": "plain_text",
"text": "Visit Website",
"emoji": True,
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "Manage",
},
"value": project.pk,
"url": project_url,
"action_id": "open-manager-dashboard-link",
},
"value": "website-link",
"url": website_url,
"action_id": "button-action",
},
{
"type": "button",
"text": {
"type": "plain_text",
"text": "Visit Website",
},
"value": project.firebase_id,
"url": website_url,
"action_id": "open-website-link",
},
],
},
]
return {
Expand Down
2 changes: 1 addition & 1 deletion assets
Submodule assets updated 23 files
+72 −72 tests/projects/compare/exports/expected_project_aggregated_result.csv
+72 −72 tests/projects/compare/exports/expected_project_aggregated_result_modified.csv
+72 −72 tests/projects/compare/exports/expected_project_aggregated_result_with_geometry.geojson
+72 −72 tests/projects/compare/exports/expected_project_aggregated_result_with_geometry_modified.geojson
+72 −72 tests/projects/compare/exports/expected_project_tasks.csv
+72 −72 tests/projects/compare/exports/expected_project_tasks_modified.csv
+112 −112 tests/projects/compare/project_data.json5
+12 −12 tests/projects/completeness/exports/expected_project_aggregated_result.csv
+12 −12 tests/projects/completeness/exports/expected_project_aggregated_result_modified.csv
+24 −24 tests/projects/completeness/exports/expected_project_aggregated_result_with_geometry.geojson
+12 −12 tests/projects/completeness/exports/expected_project_aggregated_result_with_geometry_modified.geojson
+12 −12 tests/projects/completeness/exports/expected_project_tasks.csv
+12 −12 tests/projects/completeness/exports/expected_project_tasks_modified.csv
+8 −8 tests/projects/completeness/project_data.json5
+78 −78 tests/projects/find/exports/expected_project_aggregated_result.csv
+78 −78 tests/projects/find/exports/expected_project_aggregated_result_modified.csv
+78 −78 tests/projects/find/exports/expected_project_aggregated_result_with_geometry.geojson
+78 −78 tests/projects/find/exports/expected_project_aggregated_result_with_geometry_modified.geojson
+108 −108 tests/projects/find/exports/expected_project_tasks.csv
+108 −108 tests/projects/find/exports/expected_project_tasks_modified.csv
+8 −8 tests/projects/find/project_data.json5
+2 −2 tests/projects/validate/project_data.json5
+2 −1 tests/projects/validate_image/project_data.json5
43 changes: 27 additions & 16 deletions project_types/base/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def __init_subclass__(cls, **kwargs): # type: ignore[reportMissingParameterType
cls._inheritance_checks()

@abstractmethod
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int) -> BaseModel: ...
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int) -> BaseModel: ...

@abstractmethod
def get_group_specifics_for_firebase(self) -> BaseModel: ...
Expand Down Expand Up @@ -121,10 +121,21 @@ def create_tasks_on_firebase(self, task_ref: FbReference):
*self.get_task_sort_keys(["scenario__scenario_page_number"]),
)

# NOTE: We want to use the index of the scenario instead of the scenario page
scenario_index_map: dict[int, int] = {}
# FIXME(tnagorra): We only need to read scenario.pk
scenarios = self.tutorial.scenarios.order_by("scenario_page_number").all()
for scenario_index, scenario in enumerate(scenarios):
scenario_index_map[scenario.pk] = scenario_index + 1

fb_tasks: list[dict[str, typing.Any]] = []
index = 1
for task in tasks.iterator():
task_tutorial_specific_data = self.get_task_specifics_for_firebase(task, index)
task_tutorial_specific_data = self.get_task_specifics_for_firebase(
task,
index,
scenario_index_map[task.scenario.pk],
)
fb_tasks.append(firebase_utils.serialize(task_tutorial_specific_data))
index += 1

Expand Down Expand Up @@ -177,28 +188,28 @@ def create_tutorial_on_firebase(self, tutorial_ref: FbReference):
self.create_tasks_on_firebase(task_ref)
self.create_groups_on_firebase(group_ref)

scenarios = self.tutorial.scenarios.all()
informationPages = self.tutorial.information_pages.all()
scenarios = self.tutorial.scenarios.order_by("scenario_page_number").all()
information_pages = self.tutorial.information_pages.order_by("page_number").all()

tutorial_data = firebase_models.FbBaseTutorial(
exampleImage1=None,
exampleImage2=None,
contributorCount=0,
informationPages=[
firebase_models.FbInformationPage(
title=informationPage.title,
pageNumber=informationPage.page_number,
title=info_page.title,
pageNumber=info_page_index + 1,
blocks=[
firebase_models.FbInformationPageBlock(
blockNumber=block.block_number,
blockNumber=block_index + 1,
blockType=TutorialInformationPageBlockTypeEnum(block.block_type).to_firebase(),
textDescription=block.text,
image=get_absolute_uri(block.image.file if block.image else None),
)
for block in informationPage.blocks.all()
for block_index, block in enumerate(info_page.blocks.order_by("block_number").all())
],
)
for informationPage in informationPages
for info_page_index, info_page in enumerate(information_pages)
],
lookFor=self.tutorial.project.look_for,
name=self.tutorial.name,
Expand Down Expand Up @@ -258,28 +269,28 @@ def update_tutorial_on_firebase(self, tutorial_ref: FbReference, fb_tutorial: fi
self.create_tasks_on_firebase(task_ref)
self.create_groups_on_firebase(group_ref)

scenarios = self.tutorial.scenarios.all()
informationPages = self.tutorial.information_pages.all()
scenarios = self.tutorial.scenarios.order_by("scenario_page_number").all()
information_pages = self.tutorial.information_pages.order_by("page_number").all()

tutorial_data = firebase_models.FbBaseTutorial(
exampleImage1=None,
exampleImage2=None,
contributorCount=0,
informationPages=[
firebase_models.FbInformationPage(
title=informationPage.title,
pageNumber=informationPage.page_number,
title=info_page.title,
pageNumber=info_page_index + 1,
blocks=[
firebase_models.FbInformationPageBlock(
blockNumber=block.block_number,
blockNumber=block_index + 1,
blockType=TutorialInformationPageBlockTypeEnum(block.block_type).to_firebase(),
textDescription=block.text,
image=get_absolute_uri(block.image.file if block.image else None),
)
for block in informationPage.blocks.all()
for block_index, block in enumerate(info_page.blocks.order_by("block_number").all())
],
)
for informationPage in informationPages
for info_page_index, info_page in enumerate(information_pages)
],
lookFor=self.tutorial.project.look_for,
name=self.tutorial.name,
Expand Down
4 changes: 2 additions & 2 deletions project_types/street/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ def compress_tasks_on_firebase(self) -> bool:
return True

@typing.override
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int):
task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)
return firebase_models.FbStreetTutorialTask(
projectId=self.tutorial.firebase_id,
groupId=self.get_tutorial_group_key(),
taskId=task_specifics.mapillary_image_id,
geometry="",
referenceAnswer=task.reference,
screen=task.scenario.scenario_page_number,
screen=screen,
)

@typing.override
Expand Down
7 changes: 3 additions & 4 deletions project_types/tile_map_service/base/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,13 @@ def get_task_specifics_for_firebase(
self,
task: TutorialTask,
index: int,
screen: int,
) -> firebase_models.FbTileMapServiceTutorialTask:
task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)

# FIXME(tnagorra): Add validation that scenario_page_number should start from 1

i = index % 6

task_x = 100 + (2 * task.scenario.scenario_page_number - 1)
task_x = 100 + (2 * screen - 1)
if i < 3:
task_x += 0
else:
Expand All @@ -65,7 +64,7 @@ def get_task_specifics_for_firebase(
groupId=self.get_tutorial_group_key(),
projectId=self.tutorial.firebase_id,
referenceAnswer=task.reference,
screen=task.scenario.scenario_page_number,
screen=screen,
taskId_real=f"{task_specifics.tile_z}-{task_specifics.tile_x}-{task_specifics.tile_y}",
taskX=task_x,
taskY=task_y,
Expand Down
4 changes: 2 additions & 2 deletions project_types/tile_map_service/compare/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ def __init__(self, tutorial: Tutorial):
super().__init__(tutorial)

@typing.override
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int):
tsp = self.project_type_specifics.tile_server_property
tsp_b = self.project_type_specifics.tile_server_b_property

task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)

resp = super().get_task_specifics_for_firebase(task, index)
resp = super().get_task_specifics_for_firebase(task, index, screen)

return firebase_ext_models.FbCompareTutorialTaskComplete(
geometry=resp.geometry,
Expand Down
4 changes: 2 additions & 2 deletions project_types/tile_map_service/completeness/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ def __init__(self, tutorial: Tutorial):
super().__init__(tutorial)

@typing.override
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int):
tsp = self.project_type_specifics.tile_server_property
tsp_overlay = self.project_type_specifics.overlay_tile_server_property

task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)

resp = super().get_task_specifics_for_firebase(task, index)
resp = super().get_task_specifics_for_firebase(task, index, screen)

return firebase_ext_models.FbCompletenessTutorialTaskComplete(
geometry=resp.geometry,
Expand Down
4 changes: 2 additions & 2 deletions project_types/tile_map_service/find/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ def __init__(self, tutorial: Tutorial):
super().__init__(tutorial)

@typing.override
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int):
tsp = self.project_type_specifics.tile_server_property

task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)

resp = super().get_task_specifics_for_firebase(task, index)
resp = super().get_task_specifics_for_firebase(task, index, screen)

return firebase_ext_models.FbFindTutorialTaskComplete(
geometry=resp.geometry,
Expand Down
4 changes: 2 additions & 2 deletions project_types/validate/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def compress_tasks_on_firebase(self) -> bool:
return True

@typing.override
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int):
task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)

geojson = json.loads(task_specifics.object_geometry)
Expand All @@ -52,7 +52,7 @@ def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
properties=firebase_models.FbValidateTutorialTaskProperties(
id=task_specifics.identifier,
reference=task.reference,
screen=task.scenario.scenario_page_number,
screen=screen,
),
geometry=geometry_wkt,
)
Expand Down
4 changes: 2 additions & 2 deletions project_types/validate_image/tutorial.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ def __init__(self, tutorial: Tutorial):
super().__init__(tutorial)

@typing.override
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int):
def get_task_specifics_for_firebase(self, task: TutorialTask, index: int, screen: int):
task_specifics = self.tutorial_task_property_class.model_validate(task.project_type_specifics)

return firebase_models.FbValidateImageTutorialTask(
geometry="",
groupId=self.get_tutorial_group_key(),
projectId=self.tutorial.firebase_id,
referenceAnswer=task.reference,
screen=task.scenario.scenario_page_number,
screen=screen,
taskId=task_specifics.image_id or str(index),
url=task_specifics.url,
fileName=task_specifics.file_name,
Expand Down
Loading
Loading