From 343a8e5d13e14e8d1b8ba381be7dcae68dc0a270 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 26 Nov 2023 08:14:34 +0100 Subject: [PATCH 01/29] Added Google location logic --- .gitignore | 1 + src/framework/processing/py/port/script.py | 289 +++++++++++++----- .../processing/py/tests/script_test.py | 156 ++++++++++ 3 files changed, 362 insertions(+), 84 deletions(-) create mode 100644 src/framework/processing/py/tests/script_test.py diff --git a/.gitignore b/.gitignore index 28d6b8a4..4fa76bf0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +__pycache__/ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. release.zip diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 7f696603..8c132f9c 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -1,129 +1,250 @@ +import fnmatch +import json +from datetime import datetime +from collections import namedtuple + import port.api.props as props -from port.api.commands import (CommandSystemDonate, CommandSystemExit, CommandUIRender) +from port.api.commands import CommandSystemDonate, CommandUIRender import pandas as pd import zipfile -import json + +ExtractionResult = namedtuple("ExtractionResult", ["id", "title", "data_frame"]) + + +def get_in(dct, *key_path): + for key in key_path: + dct = dct.get(key) + if dct is None: + return + return dct + + +def parse_json_to_dataframe(parsed_dict): + data = [] + for obj in parsed_dict["timelineObjects"]: + if "activitySegment" not in obj: + continue + + segment = obj["activitySegment"] + activity_type = segment["activityType"] + + if activity_type not in {"WALKING", "CYCLING","RUNNING"}: + continue + + start_timestamp_str = segment["duration"]["startTimestamp"] + start_timestamp = datetime.fromisoformat( + start_timestamp_str[:-1] + ) # remove the 'Z' + + if meters := get_in(segment, "waypointPath", "distanceMeters"): + distance_meters = meters + elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): + distance_meters = meters + elif meters := segment.get("distance"): + distance_meters = meters + else: + continue + + data.append([start_timestamp, activity_type, distance_meters]) + + return pd.DataFrame( + data, columns=["startTimestamp", "activityType", "distanceMeters"] + ) + + +def aggregate_distance_by_day_activity(df): + # Format the startTimestamp to "year-month-day" format + df["startTimestamp"] = df["startTimestamp"].dt.strftime("%Y-%m-%d") + + # Group by formatted date and activityType, then aggregate the distance + aggregated_df = ( + df.groupby(["startTimestamp", "activityType"])["distanceMeters"] + .sum() + .reset_index() + ) + + return aggregated_df + + +def extract(df): + aggregated_df = aggregate_distance_by_day_activity(df) + aggregated_df["Afstand in km"] = aggregated_df["distanceMeters"] / 1000 + + results = [] + for activity_type, title in [ + ("WALKING", {"en": "Walking", "nl": "Gewandeld"}), + ("CYCLING", {"en": "Cycling", "nl": "Gefietst"}), + ("RUNNING", {"en": "Running", "nl": "Hardgelopen"}), + ]: + df = aggregated_df.loc[aggregated_df["activityType"] == activity_type] + if len(df) == 0: + continue + + df["Datum"] = df["startTimestamp"] + df = ( + df.drop(columns=["distanceMeters", "activityType", "startTimestamp"]) + .reset_index(drop=True) + .reindex(columns=["Datum", "Afstand in km"]) + ) + results.append( + ExtractionResult( + id=activity_type.lower(), + title=props.Translatable(title), + data_frame=df, + ) + ) + return results def process(sessionId): - key = "zip-contents-example" + yield donate(f"{sessionId}-tracking", '[{ "message": "user entered script" }]') + meta_data = [] - meta_data.append(("debug", f"{key}: start")) + meta_data.append(("debug", f"start")) # STEP 1: select the file data = None while True: - meta_data.append(("debug", f"{key}: prompt file")) - promptFile = prompt_file("application/zip, text/plain") - fileResult = yield render_donation_page(promptFile) - if fileResult.__type__ == 'PayloadString': - meta_data.append(("debug", f"{key}: extracting file")) - extractionResult = doSomethingWithTheFile(fileResult.value) - if extractionResult != 'invalid': - meta_data.append(("debug", f"{key}: extraction successful, go to consent form")) - data = extractionResult - break - else: - meta_data.append(("debug", f"{key}: prompt confirmation to retry file selection")) - retry_result = yield render_donation_page(retry_confirmation()) - if retry_result.__type__ == 'PayloadTrue': - meta_data.append(("debug", f"{key}: skip due to invalid file")) + print("A") + promptFile = prompt_file() + print("B") + fileResult = yield render_donation_page(promptFile, 33) + print("C") + if fileResult.__type__ == "PayloadString": + meta_data.append(("debug", f"extracting file")) + extractionResult = extract_data_from_zip(fileResult.value) + if extractionResult == "invalid": + meta_data.append( + ("debug", f"prompt confirmation to retry file selection") + ) + retry_result = yield render_donation_page(retry_confirmation(), 33) + if retry_result.__type__ == "PayloadTrue": + meta_data.append(("debug", f"skip due to invalid file")) + continue + else: + meta_data.append(("debug", f"retry prompt file")) + break + if extractionResult == 'no-data': + retry_result = yield render_donation_page(retry_no_data_confirmation(), 33) + if retry_result.__type__ == "PayloadTrue": continue else: - meta_data.append(("debug", f"{key}: retry prompt file")) break + else: + meta_data.append( + ("debug", f"extraction successful, go to consent form") + ) + data = extractionResult + break + else: + meta_data.append(("debug", f"skip to next step")) + break # STEP 2: ask for consent - meta_data.append(("debug", f"{key}: prompt consent")) - prompt = prompt_consent(data, meta_data) - consent_result = yield render_donation_page(prompt) - if consent_result.__type__ == "PayloadJSON": - meta_data.append(("debug", f"{key}: donate consent data")) - yield donate(f"{sessionId}-{key}", consent_result.value) - if consent_result.__type__ == "PayloadFalse": - value = json.dumps('{"status" : "donation declined"}') - yield donate(f"{sessionId}-{key}", value) - - -def render_donation_page(body): + if data is not None: + meta_data.append(("debug", f"prompt consent")) + prompt = prompt_consent(data, meta_data) + consent_result = yield render_donation_page(prompt, 67) + if consent_result.__type__ == "PayloadJSON": + meta_data.append(("debug", f"donate consent data")) + yield donate(f"{sessionId}", consent_result.value) + + yield exit(0, "Success") + yield render_end_page() + + +def render_end_page(): + page = props.PropsUIPageEnd() + return CommandUIRender(page) + + +def render_donation_page(body, progress): header = props.PropsUIHeader(props.Translatable({ - "en": "Port flow example", - "nl": "Port voorbeeld flow" + "en": "Google activity", + "nl": "Google activity" })) - page = props.PropsUIPageDonation("Zip", header, body) + footer = props.PropsUIFooter(progress) + page = props.PropsUIPageDonation("google-activity", header, body, footer) return CommandUIRender(page) def retry_confirmation(): - text = props.Translatable({ - "en": "Unfortunately, we cannot process your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", - "nl": "Helaas, kunnen we uw bestand niet verwerken. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen." - }) - ok = props.Translatable({ - "en": "Try again", - "nl": "Probeer opnieuw" - }) - cancel = props.Translatable({ - "en": "Continue", - "nl": "Verder" - }) + text = props.Translatable( + { + "en": f"Unfortunately, we cannot process your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"Helaas, kunnen we uw bestand niet verwerken. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + } + ) + ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) + cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) + return props.PropsUIPromptConfirm(text, ok, cancel) + +def retry_no_data_confirmation(): + text = props.Translatable( + { + "en": f"There does not seem to be location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"Helaas, er lijkt geen lokatie informatie in uw bestand te zitten. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + } + ) + ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) + cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) return props.PropsUIPromptConfirm(text, ok, cancel) -def prompt_file(extensions): + +def prompt_file(): description = props.Translatable({ - "en": "Please select any zip file stored on your device.", - "nl": "Selecteer een willekeurige zip file die u heeft opgeslagen op uw apparaat." + "en": f"Please follow the download instructions and choose the file that you stored on your device. Click 'Skip' at the right bottom, if you do not have a file. ", + "nl": f"Volg de download instructies en kies het bestand dat u opgeslagen heeft op uw apparaat. Als u geen bestand heeft klik dan op 'Overslaan' rechts onder.", }) - return props.PropsUIPromptFileInput(description, extensions) + return props.PropsUIPromptFileInput(description, "application/zip") -def doSomethingWithTheFile(filename): - return extract_zip_contents(filename) +def prompt_consent(tables, meta_data): + log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) + tables = [ + props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) + for table in tables + ] + meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) + meta_table = props.PropsUIPromptConsentFormTable( + "log_messages", log_title, meta_frame + ) + return props.PropsUIPromptConsentForm(tables, [meta_table]) -def extract_zip_contents(filename): - names = [] - try: - file = zipfile.ZipFile(filename) - data = [] - for name in file.namelist(): - names.append(name) - info = file.getinfo(name) - data.append((name, info.compress_size, info.file_size)) - return data - except zipfile.error: - return "invalid" +def filter_json_files(file_list): + pattern = "**/Semantic Location History/*/*_*.json" + return [f for f in file_list if fnmatch.fnmatch(f, pattern)] -def prompt_consent(data, meta_data): - table_title = props.Translatable({ - "en": "Zip file contents", - "nl": "Inhoud zip bestand" - }) +def load_and_process_file(z, file, callback): + with z.open(file) as f: + return callback(json.load(f)) - log_title = props.Translatable({ - "en": "Log messages", - "nl": "Log berichten" - }) - tables=[] - if data is not None: - data_frame = pd.DataFrame(data, columns=["filename", "compressed size", "size"]) - tables = [props.PropsUIPromptConsentFormTable("zip_content", table_title, data_frame)] - - meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) - meta_table = props.PropsUIPromptConsentFormTable("log_messages", log_title, meta_frame) - return props.PropsUIPromptConsentForm(tables, [meta_table]) +def extract_data_from_zip(zip_filepath): + with zipfile.ZipFile(zip_filepath, "r") as z: + files = filter_json_files(z.namelist()) + dfs = [load_and_process_file(z, f, parse_json_to_dataframe) for f in files] + if not dfs: + return "no-data" + df = pd.concat(dfs, ignore_index=True) + return extract(df) def donate(key, json_string): return CommandSystemDonate(key, json_string) -def exit(code, info): - return CommandSystemExit(code, info) +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + print(extract_data_from_zip(sys.argv[1])) + else: + print("please provide a zip file as argument") diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py new file mode 100644 index 00000000..650d846c --- /dev/null +++ b/src/framework/processing/py/tests/script_test.py @@ -0,0 +1,156 @@ +from datetime import datetime +import pytest +import zipfile + + +from port.script import parse_json_to_dataframe +from port.script import aggregate_distance_by_day_activity +from port.script import extract +from port.script import extract_data_from_zip + + +@pytest.fixture +def sample_data(): + return { + "timelineObjects": [ + { + "activitySegment": { + "duration": {"startTimestamp": "2023-04-01T19:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 3600.33}, + } + } + ] + } + + +@pytest.fixture +def sample_data_multiple_activities(): + return { + "timelineObjects": [ + { + "activitySegment": { + "duration": {"startTimestamp": "2023-04-01T19:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 3600.33}, + } + }, + { + "activitySegment": { + "duration": {"startTimestamp": "2023-04-01T20:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 1400.0}, + } + }, + { + "activitySegment": { + "duration": {"startTimestamp": "2023-04-02T08:13:27.023Z"}, + "activityType": "WALKING", + "waypointPath": {"distanceMeters": 800.5}, + } + }, + { + "activitySegment": { + "duration": {"startTimestamp": "2023-04-01T19:13:27.023Z"}, + "activityType": "RUNNING", + "waypointPath": {"distanceMeters": 3600.33}, + } + }, + { + "activitySegment": { + "duration": {"startTimestamp": "2023-04-01T20:13:27.023Z"}, + "activityType": "RUNNING", + "waypointPath": {"distanceMeters": 1400.0}, + } + }, + ] + } + + +def test_parse_json_to_dataframe(sample_data): + df = parse_json_to_dataframe(sample_data) + assert len(df) == 1 + assert df.iloc[0]["activityType"] == "CYCLING" + assert df.iloc[0]["distanceMeters"] == 3600.33 + assert isinstance(df.iloc[0]["startTimestamp"], datetime) + + +def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): + parsed_dict = { + "timelineObjects": [ + { + "activitySegment": { + "activityType": "WALKING", + "duration": {"startTimestamp": "2023-09-17T10:00:00Z"}, + "waypointPath": {"distanceMeters": 1000}, + } + }, + { + "activitySegment": { + "activityType": "CYCLING", + "duration": {"startTimestamp": "2023-09-17T11:00:00Z"}, + "waypointPath": {"distanceMeters": 5000}, + } + }, + { + "activitySegment": { + "activityType": "DRIVING", + "duration": {"startTimestamp": "2023-09-17T12:00:00Z"}, + "waypointPath": {"distanceMeters": 20000}, + } + }, + ] + } + + df = parse_json_to_dataframe(parsed_dict) + assert "DRIVING" not in df.activityType.values + + +def test_aggregate_distance_by_day_activity(sample_data): + df = parse_json_to_dataframe(sample_data) + aggregated_df = aggregate_distance_by_day_activity(df) + + assert len(aggregated_df) == 1 + assert aggregated_df.iloc[0]["startTimestamp"] == "2023-04-01" + assert aggregated_df.iloc[0]["activityType"] == "CYCLING" + assert aggregated_df.iloc[0]["distanceMeters"] == 3600.33 + + +def test_aggregation_over_multiple_activities(sample_data_multiple_activities): + df = parse_json_to_dataframe(sample_data_multiple_activities) + aggregated_df = aggregate_distance_by_day_activity(df) + + # Verify that there are 2 aggregated entries (one for each day) + assert len(aggregated_df) == 3 + + # For 2023-04-01, there were two cycling activities. We sum their distances. + cycling_data = aggregated_df[(aggregated_df["activityType"] == "CYCLING")] + assert len(cycling_data) == 1 + assert cycling_data.iloc[0]["distanceMeters"] == (3600.33 + 1400.0) + + # For 2023-04-02, there was one walking activity. + walking_data = aggregated_df[aggregated_df["activityType"] == "WALKING"] + assert len(walking_data) == 1 + assert walking_data.iloc[0]["distanceMeters"] == 800.5 + + # For 2023-05-02, there was one running activity. + walking_data = aggregated_df[aggregated_df["activityType"] == "RUNNING"] + assert len(walking_data) == 1 + assert walking_data.iloc[0]["distanceMeters"] == (3600.33 + 1400.0) + + +def test_extract_sample_data(sample_data): + results = extract(parse_json_to_dataframe(sample_data)) + # Verify the results + assert len(results) == 1 + assert results[0].id == "cycling" + assert results[0].title.translations["nl"] == "Gefietst" + for result in results: + assert "distanceMeters" not in result.data_frame.columns + assert "Afstand in km" in result.data_frame.columns + +def test_empty_zip(tmp_path): + path = tmp_path.joinpath("test.zip") + z = zipfile.ZipFile(path, "w") + z.close() + assert extract_data_from_zip(path) == "no-data" \ No newline at end of file From 61b08c3fbb8c01e20778d60e183ede990daeac5e Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 08:45:56 +0100 Subject: [PATCH 02/29] Added date filter --- src/framework/processing/py/port/script.py | 4 ++++ src/framework/processing/py/tests/script_test.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 8c132f9c..a9110187 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -10,6 +10,7 @@ import zipfile ExtractionResult = namedtuple("ExtractionResult", ["id", "title", "data_frame"]) +filter_start_date = datetime(2017, 1, 1) def get_in(dct, *key_path): @@ -37,6 +38,9 @@ def parse_json_to_dataframe(parsed_dict): start_timestamp_str[:-1] ) # remove the 'Z' + if start_timestamp < filter_start_date: + continue + if meters := get_in(segment, "waypointPath", "distanceMeters"): distance_meters = meters elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index 650d846c..d236b777 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -106,6 +106,22 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): assert "DRIVING" not in df.activityType.values +def test_parse_json_to_dataframe_skips_entries_before_filter_date(): + parsed_dict= { + "timelineObjects": [ + { + "activitySegment": { + "duration": {"startTimestamp": "2016-12-31T19:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 3600.33}, + } + } + ] + } + df = parse_json_to_dataframe(parsed_dict) + assert len(df) == 0 + + def test_aggregate_distance_by_day_activity(sample_data): df = parse_json_to_dataframe(sample_data) aggregated_df = aggregate_distance_by_day_activity(df) From 61f531c955f919f86215e53991b49960c0b3a6a7 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 17:40:52 +0100 Subject: [PATCH 03/29] Updated texts --- src/framework/processing/py/port/script.py | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index a9110187..69a4ff0f 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -30,7 +30,7 @@ def parse_json_to_dataframe(parsed_dict): segment = obj["activitySegment"] activity_type = segment["activityType"] - if activity_type not in {"WALKING", "CYCLING","RUNNING"}: + if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: continue start_timestamp_str = segment["duration"]["startTimestamp"] @@ -129,8 +129,10 @@ def process(sessionId): else: meta_data.append(("debug", f"retry prompt file")) break - if extractionResult == 'no-data': - retry_result = yield render_donation_page(retry_no_data_confirmation(), 33) + if extractionResult == "no-data": + retry_result = yield render_donation_page( + retry_no_data_confirmation(), 33 + ) if retry_result.__type__ == "PayloadTrue": continue else: @@ -164,13 +166,12 @@ def render_end_page(): def render_donation_page(body, progress): - header = props.PropsUIHeader(props.Translatable({ - "en": "Google activity", - "nl": "Google activity" - })) + header = props.PropsUIHeader( + props.Translatable({"en": "Google location", "nl": "Google locatie"}) + ) footer = props.PropsUIFooter(progress) - page = props.PropsUIPageDonation("google-activity", header, body, footer) + page = props.PropsUIPageDonation("google-location", header, body, footer) return CommandUIRender(page) @@ -185,11 +186,12 @@ def retry_confirmation(): cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) return props.PropsUIPromptConfirm(text, ok, cancel) + def retry_no_data_confirmation(): text = props.Translatable( { - "en": f"There does not seem to be location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", - "nl": f"Helaas, er lijkt geen lokatie informatie in uw bestand te zitten. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + "en": f"Unfortunately we could not detect any location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"We hebben helaas geen locatie informatie in uw bestand gevonden. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", } ) ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) @@ -197,19 +199,19 @@ def retry_no_data_confirmation(): return props.PropsUIPromptConfirm(text, ok, cancel) - def prompt_file(): - description = props.Translatable({ - "en": f"Please follow the download instructions and choose the file that you stored on your device. Click 'Skip' at the right bottom, if you do not have a file. ", - "nl": f"Volg de download instructies en kies het bestand dat u opgeslagen heeft op uw apparaat. Als u geen bestand heeft klik dan op 'Overslaan' rechts onder.", - }) + description = props.Translatable( + { + "en": f"Click 'Choose file' to choose the file that you received from Google. If you click 'Continue', the data that is required for research is extracted from your file.", + "nl": f"Klik op ‘Kies bestand’ om het bestand dat u ontvangen hebt van Google te kiezen. Als u op 'Verder' klikt worden de gegevens die nodig zijn voor het onderzoek uit uw bestand gehaald.", + } + ) return props.PropsUIPromptFileInput(description, "application/zip") def prompt_consent(tables, meta_data): log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) - tables = [ props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) for table in tables From 3db43275425d2bc75ee17b8bf36d2e81b7045242 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 20:59:16 +0100 Subject: [PATCH 04/29] Set locale to Dutch From 2bed54fff90b534140c7cafa35eafa76205eaca5 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 10 Dec 2023 17:45:43 +0100 Subject: [PATCH 05/29] Removed end page for integration --- src/framework/processing/py/port/script.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 69a4ff0f..601bff33 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -156,9 +156,6 @@ def process(sessionId): meta_data.append(("debug", f"donate consent data")) yield donate(f"{sessionId}", consent_result.value) - yield exit(0, "Success") - yield render_end_page() - def render_end_page(): page = props.PropsUIPageEnd() From 47e24d2d0e705502270d482e17a097ecfa1f8a46 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 26 Nov 2023 08:14:34 +0100 Subject: [PATCH 06/29] Added Google location logic --- public/port-0.0.0-py3-none-any.whl | Bin 0 -> 6399 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 0 -> 6399 bytes src/framework/processing/py/port/script.py | 41 ++++++++---------- .../processing/py/tests/script_test.py | 16 ------- 4 files changed, 19 insertions(+), 38 deletions(-) create mode 100644 public/port-0.0.0-py3-none-any.whl create mode 100644 src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..860a84282d2296e1f7bf5b88dbe11bb3e5ad0cc8 GIT binary patch literal 6399 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 M_1BP0{rl1*1YX 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 M_1BP0{rl Date: Wed, 6 Dec 2023 08:45:56 +0100 Subject: [PATCH 07/29] Added date filter --- public/port-0.0.0-py3-none-any.whl | Bin 6399 -> 6427 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 6399 -> 6427 bytes src/framework/processing/py/port/script.py | 4 ++++ .../processing/py/tests/script_test.py | 16 ++++++++++++++++ 4 files changed, 20 insertions(+) diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl index 860a84282d2296e1f7bf5b88dbe11bb3e5ad0cc8..1f60a177c88f4c3a41882173a48786c0c419788f 100644 GIT binary patch delta 3203 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 b#NVfr(HIp0wv(S27?b}P76z6U00000w=NPy diff --git a/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl b/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl index 860a84282d2296e1f7bf5b88dbe11bb3e5ad0cc8..1f60a177c88f4c3a41882173a48786c0c419788f 100644 GIT binary patch delta 3203 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 b#NVfr(HIp0wv(S27?b}P76z6U00000w=NPy diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 8c132f9c..a9110187 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -10,6 +10,7 @@ import zipfile ExtractionResult = namedtuple("ExtractionResult", ["id", "title", "data_frame"]) +filter_start_date = datetime(2017, 1, 1) def get_in(dct, *key_path): @@ -37,6 +38,9 @@ def parse_json_to_dataframe(parsed_dict): start_timestamp_str[:-1] ) # remove the 'Z' + if start_timestamp < filter_start_date: + continue + if meters := get_in(segment, "waypointPath", "distanceMeters"): distance_meters = meters elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index 650d846c..d236b777 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -106,6 +106,22 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): assert "DRIVING" not in df.activityType.values +def test_parse_json_to_dataframe_skips_entries_before_filter_date(): + parsed_dict= { + "timelineObjects": [ + { + "activitySegment": { + "duration": {"startTimestamp": "2016-12-31T19:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 3600.33}, + } + } + ] + } + df = parse_json_to_dataframe(parsed_dict) + assert len(df) == 0 + + def test_aggregate_distance_by_day_activity(sample_data): df = parse_json_to_dataframe(sample_data) aggregated_df = aggregate_distance_by_day_activity(df) From e491c4a2c411761e7a8af38cd528afe1909d098f Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 17:40:52 +0100 Subject: [PATCH 08/29] Updated texts --- src/framework/processing/py/port/script.py | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index a9110187..69a4ff0f 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -30,7 +30,7 @@ def parse_json_to_dataframe(parsed_dict): segment = obj["activitySegment"] activity_type = segment["activityType"] - if activity_type not in {"WALKING", "CYCLING","RUNNING"}: + if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: continue start_timestamp_str = segment["duration"]["startTimestamp"] @@ -129,8 +129,10 @@ def process(sessionId): else: meta_data.append(("debug", f"retry prompt file")) break - if extractionResult == 'no-data': - retry_result = yield render_donation_page(retry_no_data_confirmation(), 33) + if extractionResult == "no-data": + retry_result = yield render_donation_page( + retry_no_data_confirmation(), 33 + ) if retry_result.__type__ == "PayloadTrue": continue else: @@ -164,13 +166,12 @@ def render_end_page(): def render_donation_page(body, progress): - header = props.PropsUIHeader(props.Translatable({ - "en": "Google activity", - "nl": "Google activity" - })) + header = props.PropsUIHeader( + props.Translatable({"en": "Google location", "nl": "Google locatie"}) + ) footer = props.PropsUIFooter(progress) - page = props.PropsUIPageDonation("google-activity", header, body, footer) + page = props.PropsUIPageDonation("google-location", header, body, footer) return CommandUIRender(page) @@ -185,11 +186,12 @@ def retry_confirmation(): cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) return props.PropsUIPromptConfirm(text, ok, cancel) + def retry_no_data_confirmation(): text = props.Translatable( { - "en": f"There does not seem to be location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", - "nl": f"Helaas, er lijkt geen lokatie informatie in uw bestand te zitten. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + "en": f"Unfortunately we could not detect any location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"We hebben helaas geen locatie informatie in uw bestand gevonden. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", } ) ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) @@ -197,19 +199,19 @@ def retry_no_data_confirmation(): return props.PropsUIPromptConfirm(text, ok, cancel) - def prompt_file(): - description = props.Translatable({ - "en": f"Please follow the download instructions and choose the file that you stored on your device. Click 'Skip' at the right bottom, if you do not have a file. ", - "nl": f"Volg de download instructies en kies het bestand dat u opgeslagen heeft op uw apparaat. Als u geen bestand heeft klik dan op 'Overslaan' rechts onder.", - }) + description = props.Translatable( + { + "en": f"Click 'Choose file' to choose the file that you received from Google. If you click 'Continue', the data that is required for research is extracted from your file.", + "nl": f"Klik op ‘Kies bestand’ om het bestand dat u ontvangen hebt van Google te kiezen. Als u op 'Verder' klikt worden de gegevens die nodig zijn voor het onderzoek uit uw bestand gehaald.", + } + ) return props.PropsUIPromptFileInput(description, "application/zip") def prompt_consent(tables, meta_data): log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) - tables = [ props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) for table in tables From 2df900cd672607c55df107221b9579e70e95e932 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 20:59:16 +0100 Subject: [PATCH 09/29] Set locale to Dutch --- public/port-0.0.0-py3-none-any.whl | Bin 6427 -> 6455 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 6427 -> 6455 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl index 1f60a177c88f4c3a41882173a48786c0c419788f..82174be60562898df09a107d782563b24fd9692c 100644 GIT binary patch delta 3313 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 b1{P3D1qJ{B000R92>??9006QU00000kIyo< diff --git a/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl b/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl index 1f60a177c88f4c3a41882173a48786c0c419788f..82174be60562898df09a107d782563b24fd9692c 100644 GIT binary patch delta 3313 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 b1{P3D1qJ{B000R92>??9006QU00000kIyo< From 7a48e88c9a7bb7c5e4f53131940748025dea8584 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 10 Dec 2023 17:45:43 +0100 Subject: [PATCH 10/29] Removed end page for integration --- src/framework/processing/py/port/script.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 69a4ff0f..601bff33 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -156,9 +156,6 @@ def process(sessionId): meta_data.append(("debug", f"donate consent data")) yield donate(f"{sessionId}", consent_result.value) - yield exit(0, "Success") - yield render_end_page() - def render_end_page(): page = props.PropsUIPageEnd() From b4f7ccb17c20fb1dbad65f7dd12f763e7704e3f2 Mon Sep 17 00:00:00 2001 From: emielvdveen Date: Wed, 13 Dec 2023 00:12:17 +0100 Subject: [PATCH 11/29] Fixed use-case: continue with empty/wrong package --- src/framework/processing/py/port/script.py | 50 ++++++++++------------ 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 601bff33..80ae7b17 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -102,27 +102,24 @@ def extract(df): def process(sessionId): - yield donate(f"{sessionId}-tracking", '[{ "message": "user entered script" }]') - meta_data = [] meta_data.append(("debug", f"start")) # STEP 1: select the file data = None while True: - print("A") promptFile = prompt_file() - print("B") - fileResult = yield render_donation_page(promptFile, 33) - print("C") + fileResult = yield render_donation_page(promptFile) if fileResult.__type__ == "PayloadString": meta_data.append(("debug", f"extracting file")) + print("A") extractionResult = extract_data_from_zip(fileResult.value) + print("B") if extractionResult == "invalid": meta_data.append( ("debug", f"prompt confirmation to retry file selection") ) - retry_result = yield render_donation_page(retry_confirmation(), 33) + retry_result = yield render_donation_page(retry_confirmation()) if retry_result.__type__ == "PayloadTrue": meta_data.append(("debug", f"skip due to invalid file")) continue @@ -131,7 +128,7 @@ def process(sessionId): break if extractionResult == "no-data": retry_result = yield render_donation_page( - retry_no_data_confirmation(), 33 + retry_no_data_confirmation() ) if retry_result.__type__ == "PayloadTrue": continue @@ -148,27 +145,20 @@ def process(sessionId): break # STEP 2: ask for consent - if data is not None: - meta_data.append(("debug", f"prompt consent")) - prompt = prompt_consent(data, meta_data) - consent_result = yield render_donation_page(prompt, 67) - if consent_result.__type__ == "PayloadJSON": - meta_data.append(("debug", f"donate consent data")) - yield donate(f"{sessionId}", consent_result.value) - - -def render_end_page(): - page = props.PropsUIPageEnd() - return CommandUIRender(page) + meta_data.append(("debug", f"prompt consent")) + prompt = prompt_consent(data, meta_data) + consent_result = yield render_donation_page(prompt) + if consent_result.__type__ == "PayloadJSON": + meta_data.append(("debug", f"donate consent data")) + yield donate(f"{sessionId}", consent_result.value) -def render_donation_page(body, progress): +def render_donation_page(body): header = props.PropsUIHeader( props.Translatable({"en": "Google location", "nl": "Google locatie"}) ) - footer = props.PropsUIFooter(progress) - page = props.PropsUIPageDonation("google-location", header, body, footer) + page = props.PropsUIPageDonation("google-location", header, body) return CommandUIRender(page) @@ -207,12 +197,16 @@ def prompt_file(): return props.PropsUIPromptFileInput(description, "application/zip") -def prompt_consent(tables, meta_data): +def prompt_consent(data, meta_data): log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) - tables = [ - props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) - for table in tables - ] + + tables = [] + if data is not None: + tables = [ + props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) + for table in data + ] + meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) meta_table = props.PropsUIPromptConsentFormTable( "log_messages", log_title, meta_frame From b9f79903d239683b2bce217381efcdc4b68c9a57 Mon Sep 17 00:00:00 2001 From: emielvdveen Date: Wed, 13 Dec 2023 00:14:59 +0100 Subject: [PATCH 12/29] Removed debug prints --- src/framework/processing/py/port/script.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 80ae7b17..c4c571b0 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -112,9 +112,7 @@ def process(sessionId): fileResult = yield render_donation_page(promptFile) if fileResult.__type__ == "PayloadString": meta_data.append(("debug", f"extracting file")) - print("A") extractionResult = extract_data_from_zip(fileResult.value) - print("B") if extractionResult == "invalid": meta_data.append( ("debug", f"prompt confirmation to retry file selection") From 2322d91c8032228c3db0056a9e190b22d05ee097 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 26 Nov 2023 08:14:34 +0100 Subject: [PATCH 13/29] Added Google location logic --- src/framework/processing/py/port/script.py | 130 ++++++++++++------ .../processing/py/tests/script_test.py | 16 --- 2 files changed, 91 insertions(+), 55 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index c4c571b0..8877884a 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -3,14 +3,19 @@ from datetime import datetime from collections import namedtuple +import fnmatch +import json +from datetime import datetime +from collections import namedtuple + import port.api.props as props from port.api.commands import CommandSystemDonate, CommandUIRender +from port.api.commands import CommandSystemDonate, CommandUIRender import pandas as pd import zipfile ExtractionResult = namedtuple("ExtractionResult", ["id", "title", "data_frame"]) -filter_start_date = datetime(2017, 1, 1) def get_in(dct, *key_path): @@ -30,7 +35,7 @@ def parse_json_to_dataframe(parsed_dict): segment = obj["activitySegment"] activity_type = segment["activityType"] - if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: + if activity_type not in {"WALKING", "CYCLING","RUNNING"}: continue start_timestamp_str = segment["duration"]["startTimestamp"] @@ -38,9 +43,6 @@ def parse_json_to_dataframe(parsed_dict): start_timestamp_str[:-1] ) # remove the 'Z' - if start_timestamp < filter_start_date: - continue - if meters := get_in(segment, "waypointPath", "distanceMeters"): distance_meters = meters elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): @@ -102,14 +104,20 @@ def extract(df): def process(sessionId): + yield donate(f"{sessionId}-tracking", '[{ "message": "user entered script" }]') + meta_data = [] meta_data.append(("debug", f"start")) + meta_data.append(("debug", f"start")) # STEP 1: select the file data = None while True: + print("A") promptFile = prompt_file() - fileResult = yield render_donation_page(promptFile) + print("B") + fileResult = yield render_donation_page(promptFile, 33) + print("C") if fileResult.__type__ == "PayloadString": meta_data.append(("debug", f"extracting file")) extractionResult = extract_data_from_zip(fileResult.value) @@ -117,17 +125,15 @@ def process(sessionId): meta_data.append( ("debug", f"prompt confirmation to retry file selection") ) - retry_result = yield render_donation_page(retry_confirmation()) + retry_result = yield render_donation_page(retry_confirmation(), 33) if retry_result.__type__ == "PayloadTrue": meta_data.append(("debug", f"skip due to invalid file")) continue else: meta_data.append(("debug", f"retry prompt file")) break - if extractionResult == "no-data": - retry_result = yield render_donation_page( - retry_no_data_confirmation() - ) + if extractionResult == 'no-data': + retry_result = yield render_donation_page(retry_no_data_confirmation(), 33) if retry_result.__type__ == "PayloadTrue": continue else: @@ -138,25 +144,46 @@ def process(sessionId): ) data = extractionResult break + else: + meta_data.append(("debug", f"skip to next step")) + break + break + else: + meta_data.append( + ("debug", f"extraction successful, go to consent form") + ) + data = extractionResult + break else: meta_data.append(("debug", f"skip to next step")) break # STEP 2: ask for consent - meta_data.append(("debug", f"prompt consent")) - prompt = prompt_consent(data, meta_data) - consent_result = yield render_donation_page(prompt) - if consent_result.__type__ == "PayloadJSON": - meta_data.append(("debug", f"donate consent data")) - yield donate(f"{sessionId}", consent_result.value) + if data is not None: + meta_data.append(("debug", f"prompt consent")) + prompt = prompt_consent(data, meta_data) + consent_result = yield render_donation_page(prompt, 67) + if consent_result.__type__ == "PayloadJSON": + meta_data.append(("debug", f"donate consent data")) + yield donate(f"{sessionId}", consent_result.value) + yield exit(0, "Success") + yield render_end_page() + + +def render_end_page(): + page = props.PropsUIPageEnd() + return CommandUIRender(page) -def render_donation_page(body): - header = props.PropsUIHeader( - props.Translatable({"en": "Google location", "nl": "Google locatie"}) - ) - page = props.PropsUIPageDonation("google-location", header, body) +def render_donation_page(body, progress): + header = props.PropsUIHeader(props.Translatable({ + "en": "Google activity", + "nl": "Google activity" + })) + + footer = props.PropsUIFooter(progress) + page = props.PropsUIPageDonation("google-activity", header, body, footer) return CommandUIRender(page) @@ -171,12 +198,11 @@ def retry_confirmation(): cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) return props.PropsUIPromptConfirm(text, ok, cancel) - def retry_no_data_confirmation(): text = props.Translatable( { - "en": f"Unfortunately we could not detect any location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", - "nl": f"We hebben helaas geen locatie informatie in uw bestand gevonden. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + "en": f"There does not seem to be location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"Helaas, er lijkt geen lokatie informatie in uw bestand te zitten. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", } ) ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) @@ -184,31 +210,30 @@ def retry_no_data_confirmation(): return props.PropsUIPromptConfirm(text, ok, cancel) + def prompt_file(): - description = props.Translatable( - { - "en": f"Click 'Choose file' to choose the file that you received from Google. If you click 'Continue', the data that is required for research is extracted from your file.", - "nl": f"Klik op ‘Kies bestand’ om het bestand dat u ontvangen hebt van Google te kiezen. Als u op 'Verder' klikt worden de gegevens die nodig zijn voor het onderzoek uit uw bestand gehaald.", - } - ) + description = props.Translatable({ + "en": f"Please follow the download instructions and choose the file that you stored on your device. Click 'Skip' at the right bottom, if you do not have a file. ", + "nl": f"Volg de download instructies en kies het bestand dat u opgeslagen heeft op uw apparaat. Als u geen bestand heeft klik dan op 'Overslaan' rechts onder.", + }) return props.PropsUIPromptFileInput(description, "application/zip") -def prompt_consent(data, meta_data): +def prompt_consent(tables, meta_data): log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) - tables = [] - if data is not None: - tables = [ - props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) - for table in data - ] - + tables = [ + props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) + for table in tables + ] meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) meta_table = props.PropsUIPromptConsentFormTable( "log_messages", log_title, meta_frame ) + meta_table = props.PropsUIPromptConsentFormTable( + "log_messages", log_title, meta_frame + ) return props.PropsUIPromptConsentForm(tables, [meta_table]) @@ -232,6 +257,26 @@ def extract_data_from_zip(zip_filepath): return extract(df) +def filter_json_files(file_list): + pattern = "**/Semantic Location History/*/*_*.json" + return [f for f in file_list if fnmatch.fnmatch(f, pattern)] + + +def load_and_process_file(z, file, callback): + with z.open(file) as f: + return callback(json.load(f)) + + +def extract_data_from_zip(zip_filepath): + with zipfile.ZipFile(zip_filepath, "r") as z: + files = filter_json_files(z.namelist()) + dfs = [load_and_process_file(z, f, parse_json_to_dataframe) for f in files] + if not dfs: + return "no-data" + df = pd.concat(dfs, ignore_index=True) + return extract(df) + + def donate(key, json_string): return CommandSystemDonate(key, json_string) @@ -243,3 +288,10 @@ def donate(key, json_string): print(extract_data_from_zip(sys.argv[1])) else: print("please provide a zip file as argument") +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + print(extract_data_from_zip(sys.argv[1])) + else: + print("please provide a zip file as argument") diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index d236b777..650d846c 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -106,22 +106,6 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): assert "DRIVING" not in df.activityType.values -def test_parse_json_to_dataframe_skips_entries_before_filter_date(): - parsed_dict= { - "timelineObjects": [ - { - "activitySegment": { - "duration": {"startTimestamp": "2016-12-31T19:13:27.023Z"}, - "activityType": "CYCLING", - "waypointPath": {"distanceMeters": 3600.33}, - } - } - ] - } - df = parse_json_to_dataframe(parsed_dict) - assert len(df) == 0 - - def test_aggregate_distance_by_day_activity(sample_data): df = parse_json_to_dataframe(sample_data) aggregated_df = aggregate_distance_by_day_activity(df) From 6fd9936524926fd8cf131ec03f6cc5340fbfe20a Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 08:45:56 +0100 Subject: [PATCH 14/29] Added date filter --- src/framework/processing/py/port/script.py | 4 ++++ src/framework/processing/py/tests/script_test.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 8877884a..1b52ca64 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -16,6 +16,7 @@ import zipfile ExtractionResult = namedtuple("ExtractionResult", ["id", "title", "data_frame"]) +filter_start_date = datetime(2017, 1, 1) def get_in(dct, *key_path): @@ -43,6 +44,9 @@ def parse_json_to_dataframe(parsed_dict): start_timestamp_str[:-1] ) # remove the 'Z' + if start_timestamp < filter_start_date: + continue + if meters := get_in(segment, "waypointPath", "distanceMeters"): distance_meters = meters elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index 650d846c..d236b777 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -106,6 +106,22 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): assert "DRIVING" not in df.activityType.values +def test_parse_json_to_dataframe_skips_entries_before_filter_date(): + parsed_dict= { + "timelineObjects": [ + { + "activitySegment": { + "duration": {"startTimestamp": "2016-12-31T19:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 3600.33}, + } + } + ] + } + df = parse_json_to_dataframe(parsed_dict) + assert len(df) == 0 + + def test_aggregate_distance_by_day_activity(sample_data): df = parse_json_to_dataframe(sample_data) aggregated_df = aggregate_distance_by_day_activity(df) From 219dc5a6d5f3c24cee961c924d1deba64f8924e5 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 17:40:52 +0100 Subject: [PATCH 15/29] Updated texts --- src/framework/processing/py/port/script.py | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 1b52ca64..e7c351ec 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -36,7 +36,7 @@ def parse_json_to_dataframe(parsed_dict): segment = obj["activitySegment"] activity_type = segment["activityType"] - if activity_type not in {"WALKING", "CYCLING","RUNNING"}: + if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: continue start_timestamp_str = segment["duration"]["startTimestamp"] @@ -136,8 +136,10 @@ def process(sessionId): else: meta_data.append(("debug", f"retry prompt file")) break - if extractionResult == 'no-data': - retry_result = yield render_donation_page(retry_no_data_confirmation(), 33) + if extractionResult == "no-data": + retry_result = yield render_donation_page( + retry_no_data_confirmation(), 33 + ) if retry_result.__type__ == "PayloadTrue": continue else: @@ -181,13 +183,12 @@ def render_end_page(): def render_donation_page(body, progress): - header = props.PropsUIHeader(props.Translatable({ - "en": "Google activity", - "nl": "Google activity" - })) + header = props.PropsUIHeader( + props.Translatable({"en": "Google location", "nl": "Google locatie"}) + ) footer = props.PropsUIFooter(progress) - page = props.PropsUIPageDonation("google-activity", header, body, footer) + page = props.PropsUIPageDonation("google-location", header, body, footer) return CommandUIRender(page) @@ -202,11 +203,12 @@ def retry_confirmation(): cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) return props.PropsUIPromptConfirm(text, ok, cancel) + def retry_no_data_confirmation(): text = props.Translatable( { - "en": f"There does not seem to be location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", - "nl": f"Helaas, er lijkt geen lokatie informatie in uw bestand te zitten. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + "en": f"Unfortunately we could not detect any location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"We hebben helaas geen locatie informatie in uw bestand gevonden. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", } ) ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) @@ -214,19 +216,19 @@ def retry_no_data_confirmation(): return props.PropsUIPromptConfirm(text, ok, cancel) - def prompt_file(): - description = props.Translatable({ - "en": f"Please follow the download instructions and choose the file that you stored on your device. Click 'Skip' at the right bottom, if you do not have a file. ", - "nl": f"Volg de download instructies en kies het bestand dat u opgeslagen heeft op uw apparaat. Als u geen bestand heeft klik dan op 'Overslaan' rechts onder.", - }) + description = props.Translatable( + { + "en": f"Click 'Choose file' to choose the file that you received from Google. If you click 'Continue', the data that is required for research is extracted from your file.", + "nl": f"Klik op ‘Kies bestand’ om het bestand dat u ontvangen hebt van Google te kiezen. Als u op 'Verder' klikt worden de gegevens die nodig zijn voor het onderzoek uit uw bestand gehaald.", + } + ) return props.PropsUIPromptFileInput(description, "application/zip") def prompt_consent(tables, meta_data): log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) - tables = [ props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) for table in tables From 582183ce5b6c2584e993c736c2a557e3e5136131 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 20:59:16 +0100 Subject: [PATCH 16/29] Set locale to Dutch From 44557f57d28dd2e9c2cd836cce2f6aefb2c79559 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 10 Dec 2023 17:45:43 +0100 Subject: [PATCH 17/29] Removed end page for integration --- src/framework/processing/py/port/script.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index e7c351ec..34d15f18 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -173,9 +173,6 @@ def process(sessionId): meta_data.append(("debug", f"donate consent data")) yield donate(f"{sessionId}", consent_result.value) - yield exit(0, "Success") - yield render_end_page() - def render_end_page(): page = props.PropsUIPageEnd() From 9bb931f2948a6745c3d90405ed30d68f4d41e2ff Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 26 Nov 2023 08:14:34 +0100 Subject: [PATCH 18/29] Added Google location logic --- public/port-0.0.0-py3-none-any.whl | Bin 6455 -> 5615 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 6455 -> 5615 bytes src/framework/processing/py/port/script.py | 313 +++++------------- .../processing/py/tests/script_test.py | 18 +- 4 files changed, 88 insertions(+), 243 deletions(-) diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl index 82174be60562898df09a107d782563b24fd9692c..5a4fd686fe2b7db6aea431211640778eaba6c7aa 100644 GIT binary patch delta 4237 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 1: - print(extract_data_from_zip(sys.argv[1])) - else: - print("please provide a zip file as argument") -if __name__ == "__main__": - import sys - - if len(sys.argv) > 1: - print(extract_data_from_zip(sys.argv[1])) - else: - print("please provide a zip file as argument") +def exit(code, info): + return CommandSystemExit(code, info) \ No newline at end of file diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index d236b777..6fe8267b 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -106,22 +106,6 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): assert "DRIVING" not in df.activityType.values -def test_parse_json_to_dataframe_skips_entries_before_filter_date(): - parsed_dict= { - "timelineObjects": [ - { - "activitySegment": { - "duration": {"startTimestamp": "2016-12-31T19:13:27.023Z"}, - "activityType": "CYCLING", - "waypointPath": {"distanceMeters": 3600.33}, - } - } - ] - } - df = parse_json_to_dataframe(parsed_dict) - assert len(df) == 0 - - def test_aggregate_distance_by_day_activity(sample_data): df = parse_json_to_dataframe(sample_data) aggregated_df = aggregate_distance_by_day_activity(df) @@ -169,4 +153,4 @@ def test_empty_zip(tmp_path): path = tmp_path.joinpath("test.zip") z = zipfile.ZipFile(path, "w") z.close() - assert extract_data_from_zip(path) == "no-data" \ No newline at end of file + assert extract_data_from_zip(path) == "no-data" From 722005b91a4da0f0495db0cb6380a883bea2cd8e Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 08:45:56 +0100 Subject: [PATCH 19/29] Added date filter --- public/port-0.0.0-py3-none-any.whl | Bin 5615 -> 6455 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 5615 -> 6455 bytes src/framework/processing/py/port/script.py | 91 ++++++++++++++++++ .../processing/py/tests/script_test.py | 16 +++ 4 files changed, 107 insertions(+) diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl index 5a4fd686fe2b7db6aea431211640778eaba6c7aa..8b2afe624ba5be01a86271fcfd0207469e7d79a1 100644 GIT binary patch delta 3211 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 diff --git a/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl b/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl index 5a4fd686fe2b7db6aea431211640778eaba6c7aa..8b2afe624ba5be01a86271fcfd0207469e7d79a1 100644 GIT binary patch delta 3211 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 diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 2e81f971..5d5edcc0 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -4,6 +4,97 @@ import pandas as pd import zipfile +ExtractionResult = namedtuple("ExtractionResult", ["id", "title", "data_frame"]) +filter_start_date = datetime(2017, 1, 1) + + +def get_in(dct, *key_path): + for key in key_path: + dct = dct.get(key) + if dct is None: + return + return dct + + +def parse_json_to_dataframe(parsed_dict): + data = [] + for obj in parsed_dict["timelineObjects"]: + if "activitySegment" not in obj: + continue + + segment = obj["activitySegment"] + activity_type = segment["activityType"] + + if activity_type not in {"WALKING", "CYCLING","RUNNING"}: + continue + + start_timestamp_str = segment["duration"]["startTimestamp"] + start_timestamp = datetime.fromisoformat( + start_timestamp_str[:-1] + ) # remove the 'Z' + + if start_timestamp < filter_start_date: + continue + + if meters := get_in(segment, "waypointPath", "distanceMeters"): + distance_meters = meters + elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): + distance_meters = meters + elif meters := segment.get("distance"): + distance_meters = meters + else: + continue + + data.append([start_timestamp, activity_type, distance_meters]) + + return pd.DataFrame( + data, columns=["startTimestamp", "activityType", "distanceMeters"] + ) + + +def aggregate_distance_by_day_activity(df): + # Format the startTimestamp to "year-month-day" format + df["startTimestamp"] = df["startTimestamp"].dt.strftime("%Y-%m-%d") + + # Group by formatted date and activityType, then aggregate the distance + aggregated_df = ( + df.groupby(["startTimestamp", "activityType"])["distanceMeters"] + .sum() + .reset_index() + ) + + return aggregated_df + + +def extract(df): + aggregated_df = aggregate_distance_by_day_activity(df) + aggregated_df["Afstand in km"] = aggregated_df["distanceMeters"] / 1000 + + results = [] + for activity_type, title in [ + ("WALKING", {"en": "Walking", "nl": "Gewandeld"}), + ("CYCLING", {"en": "Cycling", "nl": "Gefietst"}), + ("RUNNING", {"en": "Running", "nl": "Hardgelopen"}), + ]: + df = aggregated_df.loc[aggregated_df["activityType"] == activity_type] + if len(df) == 0: + continue + + df["Datum"] = df["startTimestamp"] + df = ( + df.drop(columns=["distanceMeters", "activityType", "startTimestamp"]) + .reset_index(drop=True) + .reindex(columns=["Datum", "Afstand in km"]) + ) + results.append( + ExtractionResult( + id=activity_type.lower(), + title=props.Translatable(title), + data_frame=df, + ) + ) + return results + def process(sessionId): yield donate(f"{sessionId}-tracking", '[{ "message": "user entered script" }]') diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index 6fe8267b..b0fa415e 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -106,6 +106,22 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): assert "DRIVING" not in df.activityType.values +def test_parse_json_to_dataframe_skips_entries_before_filter_date(): + parsed_dict= { + "timelineObjects": [ + { + "activitySegment": { + "duration": {"startTimestamp": "2016-12-31T19:13:27.023Z"}, + "activityType": "CYCLING", + "waypointPath": {"distanceMeters": 3600.33}, + } + } + ] + } + df = parse_json_to_dataframe(parsed_dict) + assert len(df) == 0 + + def test_aggregate_distance_by_day_activity(sample_data): df = parse_json_to_dataframe(sample_data) aggregated_df = aggregate_distance_by_day_activity(df) From 0c70473fb79bd9a98f8784772137b7b3e01fa833 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 6 Dec 2023 17:40:52 +0100 Subject: [PATCH 20/29] Updated texts --- public/port-0.0.0-py3-none-any.whl | Bin 6455 -> 6412 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 6455 -> 6412 bytes src/framework/processing/py/port/script.py | 101 ++++++++---------- 3 files changed, 45 insertions(+), 56 deletions(-) diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl index 8b2afe624ba5be01a86271fcfd0207469e7d79a1..ff2f1f86a9602fa052bfc66dadbd715305169834 100644 GIT binary patch delta 3161 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 delta 3198 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 diff --git a/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl b/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl index 8b2afe624ba5be01a86271fcfd0207469e7d79a1..ff2f1f86a9602fa052bfc66dadbd715305169834 100644 GIT binary patch delta 3161 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 delta 3198 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 diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 5d5edcc0..0849b169 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -25,7 +25,7 @@ def parse_json_to_dataframe(parsed_dict): segment = obj["activitySegment"] activity_type = segment["activityType"] - if activity_type not in {"WALKING", "CYCLING","RUNNING"}: + if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: continue start_timestamp_str = segment["duration"]["startTimestamp"] @@ -134,6 +134,12 @@ def process(sessionId): else: meta_data.append(("debug", f"retry prompt file")) break + if extractionResult == "no-data": + retry_result = yield render_donation_page( + retry_no_data_confirmation(), 33 + ) + if retry_result.__type__ == "PayloadTrue": + continue else: meta_data.append(("debug", f"{platform}: prompt confirmation to retry file selection")) retry_result = yield render_donation_page(platform, retry_confirmation(platform), progress) @@ -172,74 +178,57 @@ def render_end_page(): return CommandUIRender(page) -def render_donation_page(platform, body, progress): - header = props.PropsUIHeader(props.Translatable({ - "en": platform, - "nl": platform - })) +def render_donation_page(body, progress): + header = props.PropsUIHeader( + props.Translatable({"en": "Google location", "nl": "Google locatie"}) + ) footer = props.PropsUIFooter(progress) - page = props.PropsUIPageDonation(platform, header, body, footer) + page = props.PropsUIPageDonation("google-location", header, body, footer) return CommandUIRender(page) -def retry_confirmation(platform): - text = props.Translatable({ - "en": f"Unfortunately, we cannot process your {platform} file. Continue, if you are sure that you selected the right file. Try again to select a different file.", - "nl": f"Helaas, kunnen we uw {platform} bestand niet verwerken. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen." - }) - ok = props.Translatable({ - "en": "Try again", - "nl": "Probeer opnieuw" - }) - cancel = props.Translatable({ - "en": "Continue", - "nl": "Verder" - }) +def retry_confirmation(): + text = props.Translatable( + { + "en": f"Unfortunately, we cannot process your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"Helaas, kunnen we uw bestand niet verwerken. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + } + ) + ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) + cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) return props.PropsUIPromptConfirm(text, ok, cancel) -def prompt_file(platform, extensions): - description = props.Translatable({ - "en": f"Please follow the download instructions and choose the file that you stored on your device. Click “Skip” at the right bottom, if you do not have a {platform} file. ", - "nl": f"Volg de download instructies en kies het bestand dat u opgeslagen heeft op uw apparaat. Als u geen {platform} bestand heeft klik dan op “Overslaan” rechts onder." - }) - - return props.PropsUIPromptFileInput(description, extensions) - - -def doSomethingWithTheFile(platform, filename): - return extract_zip_contents(filename) - - -def extract_zip_contents(filename): - names = [] - try: - file = zipfile.ZipFile(filename) - data = [] - for name in file.namelist(): - names.append(name) - info = file.getinfo(name) - data.append((name, info.compress_size, info.file_size)) - return data - except zipfile.error: - return "invalid" +def retry_no_data_confirmation(): + text = props.Translatable( + { + "en": f"Unfortunately we could not detect any location information in your file. Continue, if you are sure that you selected the right file. Try again to select a different file.", + "nl": f"We hebben helaas geen locatie informatie in uw bestand gevonden. Weet u zeker dat u het juiste bestand heeft gekozen? Ga dan verder. Probeer opnieuw als u een ander bestand wilt kiezen.", + } + ) + ok = props.Translatable({"en": "Try again", "nl": "Probeer opnieuw"}) + cancel = props.Translatable({"en": "Continue", "nl": "Verder"}) + return props.PropsUIPromptConfirm(text, ok, cancel) -def prompt_consent(id, data, meta_data): +def prompt_file(): + description = props.Translatable( + { + "en": f"Click 'Choose file' to choose the file that you received from Google. If you click 'Continue', the data that is required for research is extracted from your file.", + "nl": f"Klik op ‘Kies bestand’ om het bestand dat u ontvangen hebt van Google te kiezen. Als u op 'Verder' klikt worden de gegevens die nodig zijn voor het onderzoek uit uw bestand gehaald.", + } + ) - table_title = props.Translatable({ - "en": "Zip file contents", - "nl": "Inhoud zip bestand" - }) + return props.PropsUIPromptFileInput(description, extensions) - log_title = props.Translatable({ - "en": "Log messages", - "nl": "Log berichten" - }) - data_frame = pd.DataFrame(data, columns=["filename", "compressed size", "size"]) - table = props.PropsUIPromptConsentFormTable("zip_content", table_title, data_frame) +def prompt_consent(tables, meta_data): + log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) + tables = [ + props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) + for table in tables + ] meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) meta_table = props.PropsUIPromptConsentFormTable("log_messages", log_title, meta_frame) return props.PropsUIPromptConsentForm([table], [meta_table]) From 72f36f76a5ceceea311f4af9e2004b194790f4f6 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 10 Dec 2023 17:45:43 +0100 Subject: [PATCH 21/29] Removed end page for integration --- src/framework/processing/py/port/script.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 0849b169..b12db0b8 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -169,9 +169,6 @@ def process(sessionId): meta_data.append(("debug", f"{platform}: donate consent data")) yield donate(f"{sessionId}-{platform}", consent_result.value) - yield exit(0, "Success") - yield render_end_page() - def render_end_page(): page = props.PropsUIPageEnd() From 7d2c7c77d0a2708163eb05e0dd336da56ae44279 Mon Sep 17 00:00:00 2001 From: emielvdveen Date: Wed, 13 Dec 2023 00:12:17 +0100 Subject: [PATCH 22/29] Fixed use-case: continue with empty/wrong package --- public/port-0.0.0-py3-none-any.whl | Bin 6412 -> 6195 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 6412 -> 6195 bytes src/framework/processing/py/port/script.py | 67 +++++++----------- 3 files changed, 25 insertions(+), 42 deletions(-) diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl index ff2f1f86a9602fa052bfc66dadbd715305169834..a1ec4a434058e1da500b74dd53b3ad9915708a87 100644 GIT binary patch delta 2963 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 J$`t?r002nJlB56t delta 3161 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 diff --git a/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl b/src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl index ff2f1f86a9602fa052bfc66dadbd715305169834..a1ec4a434058e1da500b74dd53b3ad9915708a87 100644 GIT binary patch delta 2963 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 J$`t?r002nJlB56t delta 3161 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 diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index b12db0b8..6689f5c4 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -97,37 +97,24 @@ def extract(df): def process(sessionId): - yield donate(f"{sessionId}-tracking", '[{ "message": "user entered script" }]') - - platforms = ["Twitter", "Facebook", "Instagram", "Youtube"] - - subflows = len(platforms) - steps = 2 - step_percentage = (100/subflows)/steps - - # progress in % - progress = 0 - - for index, platform in enumerate(platforms): - meta_data = [] - meta_data.append(("debug", f"{platform}: start")) + meta_data = [] + meta_data.append(("debug", f"start")) # STEP 1: select the file data = None while True: - print("A") promptFile = prompt_file() - print("B") - fileResult = yield render_donation_page(promptFile, 33) - print("C") + fileResult = yield render_donation_page(promptFile) if fileResult.__type__ == "PayloadString": meta_data.append(("debug", f"extracting file")) + print("A") extractionResult = extract_data_from_zip(fileResult.value) + print("B") if extractionResult == "invalid": meta_data.append( ("debug", f"prompt confirmation to retry file selection") ) - retry_result = yield render_donation_page(retry_confirmation(), 33) + retry_result = yield render_donation_page(retry_confirmation()) if retry_result.__type__ == "PayloadTrue": meta_data.append(("debug", f"skip due to invalid file")) continue @@ -136,7 +123,7 @@ def process(sessionId): break if extractionResult == "no-data": retry_result = yield render_donation_page( - retry_no_data_confirmation(), 33 + retry_no_data_confirmation() ) if retry_result.__type__ == "PayloadTrue": continue @@ -159,29 +146,21 @@ def process(sessionId): meta_data.append(("debug", f"skip to next step")) break - # STEP 2: ask for consent - progress += step_percentage - if data is not None: - meta_data.append(("debug", f"{platform}: prompt consent")) - prompt = prompt_consent(platform, data, meta_data) - consent_result = yield render_donation_page(platform, prompt, progress) - if consent_result.__type__ == "PayloadJSON": - meta_data.append(("debug", f"{platform}: donate consent data")) - yield donate(f"{sessionId}-{platform}", consent_result.value) + # STEP 2: ask for consent + meta_data.append(("debug", f"prompt consent")) + prompt = prompt_consent(data, meta_data) + consent_result = yield render_donation_page(prompt) + if consent_result.__type__ == "PayloadJSON": + meta_data.append(("debug", f"donate consent data")) + yield donate(f"{sessionId}", consent_result.value) -def render_end_page(): - page = props.PropsUIPageEnd() - return CommandUIRender(page) - - -def render_donation_page(body, progress): +def render_donation_page(body): header = props.PropsUIHeader( props.Translatable({"en": "Google location", "nl": "Google locatie"}) ) - footer = props.PropsUIFooter(progress) - page = props.PropsUIPageDonation("google-location", header, body, footer) + page = props.PropsUIPageDonation("google-location", header, body) return CommandUIRender(page) @@ -220,12 +199,16 @@ def prompt_file(): return props.PropsUIPromptFileInput(description, extensions) -def prompt_consent(tables, meta_data): +def prompt_consent(data, meta_data): log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) - tables = [ - props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) - for table in tables - ] + + tables = [] + if data is not None: + tables = [ + props.PropsUIPromptConsentFormTable(table.id, table.title, table.data_frame) + for table in data + ] + meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) meta_table = props.PropsUIPromptConsentFormTable("log_messages", log_title, meta_frame) return props.PropsUIPromptConsentForm([table], [meta_table]) From 2b0453cc6d1976ce8beeeca7a61add1eb97fc843 Mon Sep 17 00:00:00 2001 From: emielvdveen Date: Wed, 13 Dec 2023 00:14:59 +0100 Subject: [PATCH 23/29] Removed debug prints --- src/framework/processing/py/port/script.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 6689f5c4..48501bee 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -107,9 +107,7 @@ def process(sessionId): fileResult = yield render_donation_page(promptFile) if fileResult.__type__ == "PayloadString": meta_data.append(("debug", f"extracting file")) - print("A") extractionResult = extract_data_from_zip(fileResult.value) - print("B") if extractionResult == "invalid": meta_data.append( ("debug", f"prompt confirmation to retry file selection") From 35941232a160fd3e912ab06de9ed6958ccec5265 Mon Sep 17 00:00:00 2001 From: emielvdveen Date: Fri, 15 Dec 2023 16:32:37 +0100 Subject: [PATCH 24/29] Fixed donation declined use case --- public/port-0.0.0-py3-none-any.whl | Bin 6195 -> 0 bytes .../py/dist/port-0.0.0-py3-none-any.whl | Bin 6195 -> 0 bytes src/framework/processing/py/port/script.py | 4 ++++ 3 files changed, 4 insertions(+) delete mode 100644 public/port-0.0.0-py3-none-any.whl delete mode 100644 src/framework/processing/py/dist/port-0.0.0-py3-none-any.whl diff --git a/public/port-0.0.0-py3-none-any.whl b/public/port-0.0.0-py3-none-any.whl deleted file mode 100644 index a1ec4a434058e1da500b74dd53b3ad9915708a87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6195 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 Date: Wed, 20 Dec 2023 20:01:41 +0100 Subject: [PATCH 25/29] Changed km to m based on feedback --- src/framework/processing/py/poetry.lock | 67 +++++++++++-------- src/framework/processing/py/port/script.py | 16 +++-- src/framework/processing/py/pyproject.toml | 1 + .../processing/py/tests/script_test.py | 5 +- 4 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/framework/processing/py/poetry.lock b/src/framework/processing/py/poetry.lock index c36c2cd5..e98eb84c 100644 --- a/src/framework/processing/py/poetry.lock +++ b/src/framework/processing/py/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "colorama" @@ -24,36 +24,47 @@ files = [ [[package]] name = "numpy" -version = "1.25.2" +version = "1.26.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, - {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, - {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, - {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, - {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, - {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, - {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, - {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, - {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, - {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, - {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, - {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, ] [[package]] @@ -185,4 +196,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "190f3d847d562a2464c2f57cde19a966813b9aba5b64c3157a5a738ecc6d359c" +content-hash = "23793ef4bb1af938b822543ffd05c5c75074e04effbe8771d33f0af34c839257" diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 06fc5256..9d527fbb 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -1,3 +1,9 @@ +import fnmatch +import json +import numpy as np +from datetime import datetime +from collections import namedtuple + import port.api.props as props from port.api.commands import (CommandSystemDonate, CommandSystemExit, CommandUIRender) @@ -69,7 +75,7 @@ def aggregate_distance_by_day_activity(df): def extract(df): aggregated_df = aggregate_distance_by_day_activity(df) - aggregated_df["Afstand in km"] = aggregated_df["distanceMeters"] / 1000 + aggregated_df["Afstand in m"] = aggregated_df["distanceMeters"].apply(np.ceil) results = [] for activity_type, title in [ @@ -85,7 +91,7 @@ def extract(df): df = ( df.drop(columns=["distanceMeters", "activityType", "startTimestamp"]) .reset_index(drop=True) - .reindex(columns=["Datum", "Afstand in km"]) + .reindex(columns=["Datum", "Afstand in m"]) ) results.append( ExtractionResult( @@ -121,9 +127,7 @@ def process(sessionId): meta_data.append(("debug", f"retry prompt file")) break if extractionResult == "no-data": - retry_result = yield render_donation_page( - retry_no_data_confirmation() - ) + retry_result = yield render_donation_page(retry_no_data_confirmation()) if retry_result.__type__ == "PayloadTrue": continue else: @@ -152,7 +156,7 @@ def process(sessionId): if consent_result.__type__ == "PayloadJSON": meta_data.append(("debug", f"donate consent data")) yield donate(f"{sessionId}", consent_result.value) - if consent_result.__type__ == "PayloadFalse": + if consent_result.__type__ == "PayloadFalse": value = json.dumps('{"status" : "donation declined"}') yield donate(f"{sessionId}", value) diff --git a/src/framework/processing/py/pyproject.toml b/src/framework/processing/py/pyproject.toml index 6a48c421..a0a6ebfe 100644 --- a/src/framework/processing/py/pyproject.toml +++ b/src/framework/processing/py/pyproject.toml @@ -7,6 +7,7 @@ authors = ["Emiel van der Veen "] [tool.poetry.dependencies] python = "^3.11" pandas = "^1.5" +numpy = "^1.26.2" [tool.poetry.group.test.dependencies] pytest = "^7.4.2" diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index b0fa415e..654cfb8b 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -107,7 +107,7 @@ def test_parse_json_to_dataframe_skips_non_walking_or_cycling(): def test_parse_json_to_dataframe_skips_entries_before_filter_date(): - parsed_dict= { + parsed_dict = { "timelineObjects": [ { "activitySegment": { @@ -163,7 +163,8 @@ def test_extract_sample_data(sample_data): assert results[0].title.translations["nl"] == "Gefietst" for result in results: assert "distanceMeters" not in result.data_frame.columns - assert "Afstand in km" in result.data_frame.columns + assert "Afstand in meter" in result.data_frame.columns + def test_empty_zip(tmp_path): path = tmp_path.joinpath("test.zip") From b333db7b4a8b0dd19325f607e0562c29b0d81be5 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 20 Dec 2023 21:33:16 +0100 Subject: [PATCH 26/29] Added error reporting screen --- src/framework/processing/py/port/script.py | 98 ++++++++++++++++++---- 1 file changed, 81 insertions(+), 17 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 9d527fbb..e1503180 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -3,9 +3,9 @@ import numpy as np from datetime import datetime from collections import namedtuple - +import os.path import port.api.props as props -from port.api.commands import (CommandSystemDonate, CommandSystemExit, CommandUIRender) +from port.api.commands import CommandSystemDonate, CommandSystemExit, CommandUIRender import pandas as pd import zipfile @@ -121,24 +121,19 @@ def process(sessionId): ) retry_result = yield render_donation_page(retry_confirmation()) if retry_result.__type__ == "PayloadTrue": - meta_data.append(("debug", f"skip due to invalid file")) + meta_data.append(("debug", f"retry prompt file")) continue else: - meta_data.append(("debug", f"retry prompt file")) + meta_data.append(("debug", f"skip due to invalid file")) + data = ("aborted", fileResult.value) break if extractionResult == "no-data": retry_result = yield render_donation_page(retry_no_data_confirmation()) if retry_result.__type__ == "PayloadTrue": continue else: - meta_data.append(("debug", f"{platform}: prompt confirmation to retry file selection")) - retry_result = yield render_donation_page(platform, retry_confirmation(platform), progress) - if retry_result.__type__ == 'PayloadTrue': - meta_data.append(("debug", f"{platform}: skip due to invalid file")) - continue - else: - meta_data.append(("debug", f"{platform}: retry prompt file")) - break + data = ("aborted", fileResult.value) + break else: meta_data.append( ("debug", f"extraction successful, go to consent form") @@ -151,7 +146,10 @@ def process(sessionId): # STEP 2: ask for consent meta_data.append(("debug", f"prompt consent")) - prompt = prompt_consent(data, meta_data) + if isinstance(data, tuple): + prompt = prompt_report_consent(os.path.basename(data[1]), meta_data) + else: + prompt = prompt_consent(data, meta_data) consent_result = yield render_donation_page(prompt) if consent_result.__type__ == "PayloadJSON": meta_data.append(("debug", f"donate consent data")) @@ -202,7 +200,7 @@ def prompt_file(): } ) - return props.PropsUIPromptFileInput(description, extensions) + return props.PropsUIPromptFileInput(description, "application/zip") def prompt_consent(data, meta_data): @@ -216,12 +214,78 @@ def prompt_consent(data, meta_data): ] meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) - meta_table = props.PropsUIPromptConsentFormTable("log_messages", log_title, meta_frame) - return props.PropsUIPromptConsentForm([table], [meta_table]) + meta_table = props.PropsUIPromptConsentFormTable( + "log_messages", log_title, meta_frame + ) + return props.PropsUIPromptConsentForm(tables, [meta_table]) + + +def prompt_report_consent(filename, meta_data): + log_title = props.Translatable({"en": "Log messages", "nl": "Log berichten"}) + + tables = [ + props.PropsUIPromptConsentFormTable( + "filename", + props.Translatable({"nl": "Bestandsnaam", "en": "Filename"}), + pd.DataFrame({"Bestandsnaam": [filename]}), + ) + ] + + meta_frame = pd.DataFrame(meta_data, columns=["type", "message"]) + meta_table = props.PropsUIPromptConsentFormTable( + "log_messages", log_title, meta_frame + ) + return props.PropsUIPromptConsentForm( + tables, + [meta_table], + description=props.Translatable( + { + "nl": "Helaas konden we geen gegevens uit uw gegevenspakket halen. Wilt u de onderzoekers van het LISS panel hiervan op de hoogte stellen?", + "en": "Unfortunately we could not extract any data from your package. Would you like to report this to the researchers of the LISS panel?", + } + ), + donate_question=props.Translatable( + { + "en": "Do you want to report the above data?", + "nl": "Wilt u de bovenstaande gegevens rapporteren?", + } + ), + donate_button=props.Translatable({"nl": "Ja, rapporteer", "en": "Yes, report"}), + ) + + +def filter_json_files(file_list): + pattern = "**/Semantic Location History/*/*_*.json" + return [f for f in file_list if fnmatch.fnmatch(f, pattern)] + + +def load_and_process_file(z, file, callback): + with z.open(file) as f: + return callback(json.load(f)) + + +def extract_data_from_zip(zip_filepath): + with zipfile.ZipFile(zip_filepath, "r") as z: + files = filter_json_files(z.namelist()) + dfs = [load_and_process_file(z, f, parse_json_to_dataframe) for f in files] + if not dfs: + return "no-data" + df = pd.concat(dfs, ignore_index=True) + return extract(df) def donate(key, json_string): return CommandSystemDonate(key, json_string) + def exit(code, info): - return CommandSystemExit(code, info) \ No newline at end of file + return CommandSystemExit(code, info) + + +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + print(extract_data_from_zip(sys.argv[1])) + else: + print("please provide a zip file as argument") From fb22d830c8fb8cbb168bf020e6e4467a02b158d8 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 20 Dec 2023 21:52:02 +0100 Subject: [PATCH 27/29] Fixed test --- src/framework/processing/py/tests/script_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework/processing/py/tests/script_test.py b/src/framework/processing/py/tests/script_test.py index 654cfb8b..13fc4b8c 100644 --- a/src/framework/processing/py/tests/script_test.py +++ b/src/framework/processing/py/tests/script_test.py @@ -163,7 +163,7 @@ def test_extract_sample_data(sample_data): assert results[0].title.translations["nl"] == "Gefietst" for result in results: assert "distanceMeters" not in result.data_frame.columns - assert "Afstand in meter" in result.data_frame.columns + assert "Afstand in m" in result.data_frame.columns def test_empty_zip(tmp_path): From bdf579426eb2442229ac8c47e6af69c52c7a3c39 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Thu, 21 Dec 2023 20:25:09 +0100 Subject: [PATCH 28/29] Always donate error status --- src/framework/processing/py/port/script.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index e1503180..41e05344 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -146,17 +146,20 @@ def process(sessionId): # STEP 2: ask for consent meta_data.append(("debug", f"prompt consent")) - if isinstance(data, tuple): + error_detected = isinstance(data, tuple) + if error_detected: prompt = prompt_report_consent(os.path.basename(data[1]), meta_data) else: prompt = prompt_consent(data, meta_data) consent_result = yield render_donation_page(prompt) if consent_result.__type__ == "PayloadJSON": meta_data.append(("debug", f"donate consent data")) - yield donate(f"{sessionId}", consent_result.value) - if consent_result.__type__ == "PayloadFalse": - value = json.dumps('{"status" : "donation declined"}') - yield donate(f"{sessionId}", value) + donation_data = json.loads(consent_result.value) + elif consent_result.__type__ == "PayloadFalse": + donation_data = {"status": "donation declined"} + if error_detected: + donation_data["error"] = "Unable to extract data from package" + yield donate(f"{sessionId}", json.dumps(donation_data)) def render_donation_page(body): From 20caa6def79d3358d9d86ed1f33fac47be2ae493 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Tue, 6 Feb 2024 19:26:34 +0100 Subject: [PATCH 29/29] Use year filter first to avoid errors in old data --- src/framework/processing/py/port/script.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/framework/processing/py/port/script.py b/src/framework/processing/py/port/script.py index 41e05344..4f193c3d 100644 --- a/src/framework/processing/py/port/script.py +++ b/src/framework/processing/py/port/script.py @@ -30,11 +30,6 @@ def parse_json_to_dataframe(parsed_dict): continue segment = obj["activitySegment"] - activity_type = segment["activityType"] - - if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: - continue - start_timestamp_str = segment["duration"]["startTimestamp"] start_timestamp = datetime.fromisoformat( start_timestamp_str[:-1] @@ -43,6 +38,11 @@ def parse_json_to_dataframe(parsed_dict): if start_timestamp < filter_start_date: continue + activity_type = segment["activityType"] + + if activity_type not in {"WALKING", "CYCLING", "RUNNING"}: + continue + if meters := get_in(segment, "waypointPath", "distanceMeters"): distance_meters = meters elif meters := get_in(segment, "simplifiedRawPath", "distanceMeters"): @@ -74,6 +74,8 @@ def aggregate_distance_by_day_activity(df): def extract(df): + if df.empty: + return [] aggregated_df = aggregate_distance_by_day_activity(df) aggregated_df["Afstand in m"] = aggregated_df["distanceMeters"].apply(np.ceil)