API Reference¶
Props¶
Page footer.
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIHeader(title: Translatable)¶
Page header.
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPageDonation(platform: str, header: PropsUIHeader, body: PropsUIPromptRadioInput | PropsUIPromptConsentForm | PropsUIPromptFileInput | PropsUIPromptFileInputMultiple | PropsUIPromptConfirm | PropsUIPromptQuestionnaire, footer: PropsUIFooter | None = None)¶
A multi-purpose page that gets shown to the user.
- platform¶
The platform name the user is currently in the process of donating data from.
- Type:
str
- header¶
Page header.
- Type:
- body (PropsUIPromptRadioInput | PropsUIPromptConsentForm |
PropsUIPromptFileInput | PropsUIPromptFileInputMultiple | PropsUIPromptConfirm | PropsUIPromptQuestionnaire): Main body of the page.
Optional page footer.
- Type:
Optional[PropsUIFooter]
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPageEnd¶
An ending page to show the user they are done.
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptConfirm(text: Translatable, ok: Translatable, cancel: Translatable)¶
Retry submitting a file page.
Prompt the user if they want to submit a new file. This can be used in case a file could not be processed.
- text¶
Message to display.
- Type:
- ok¶
Message to display if the user wants to try again.
- Type:
- cancel¶
Message to display if the user wants to continue regardless.
- Type:
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptConsentForm(id: str, tables: list[PropsUIPromptConsentFormTable], meta_tables: list[PropsUIPromptConsentFormTable], description: Translatable | None = None, donate_question: Translatable | None = None, donate_button: Translatable | None = None)¶
Tables to be shown to the participant prior to donation.
- id¶
will be used as part of the filename when the data is stored
- Type:
str
- tables¶
A list of tables.
- Type:
- meta_tables¶
A list of optional tables, for example for logging data.
- Type:
- description¶
Optional description of the consent form.
- Type:
Optional[Translatable]
- donate_question¶
Optional donation question.
- Type:
Optional[Translatable]
- donate_button¶
Optional text for the donate button.
- Type:
Optional[Translatable]
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- translate_meta_tables()¶
Translate the meta tables to a list of dictionaries.
- Returns:
A list of dictionaries representing the meta tables.
- Return type:
list
- translate_tables()¶
Translate the tables to a list of dictionaries.
- Returns:
A list of dictionaries representing the tables.
- Return type:
list
- class port.api.props.PropsUIPromptConsentFormTable(id: str, title: Translatable, data_frame: pandas.DataFrame | Dict[str, Dict[str, Any]], description: Translatable | None = None, visualizations: list | None = None, folded: bool | None = False, delete_option: bool | None = True)¶
Table to be shown to the participant prior to donation.
- id¶
A unique string to identify the table after donation.
- Type:
str
- title¶
Title of the table.
- Type:
- data_frame¶
Table to be shown can be a pandas DataFrame or a dictionary.
- Type:
pd.DataFrame | Dict[str, Dict[str, Any]]
- description¶
Optional description of the table.
- Type:
Optional[Translatable]
- visualizations¶
Optional visualizations to be shown.
- Type:
Optional[list]
- folded¶
Whether the table should be initially folded.
- Type:
Optional[bool]
- delete_option¶
Whether to show a delete option for the table.
- Type:
Optional[bool]
Examples:
data_frame_df = pd.DataFrame([ {"column1": 1, "column2": 4}, {"column1": 2, "column2": 5}, {"column1": 3, "column2": 6}, ]) example1 = PropsUIPromptConsentFormTable( id="example1", title=Translatable("Table as DataFrame"), data_frame=data_frame_df, ) data_frame_dict = { "column1": {"0": 1, "1": 4}, "column2": {"0": 2, "1": 5}, "column3": {"0": 3, "1": 6}, } example2 = PropsUIPromptConsentFormTable( id="example2", title=Translatable("Table as Dictionary"), data_frame=data_frame_dict, )
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptFileInput(description: Translatable, extensions: str)¶
Prompt the user to submit a file.
- description¶
Text with an explanation.
- Type:
- extensions¶
Accepted mime types, example: “application/zip, text/plain”.
- Type:
str
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptFileInputMultiple(description: Translatable, extensions: str)¶
Prompt the user to submit multiple files.
- description¶
Text with an explanation.
- Type:
- extensions¶
Accepted mime types, example: “application/zip, text/plain”.
- Type:
str
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptProgress(description: Translatable, message: str, percentage: int | None = None)¶
Prompt the user information during the extraction.
- description¶
Text with an explanation.
- Type:
- message¶
Can be used to show extraction progress.
- Type:
str
- percentage¶
Optional percentage of progress.
- Type:
Optional[int]
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptQuestionnaire(description: Translatable, questions: list[PropsUIQuestionMultipleChoice | PropsUIQuestionMultipleChoiceCheckbox | PropsUIQuestionOpen])¶
Questionnaire containing multiple questions.
- description¶
Description of the questionnaire.
- Type:
- questions¶
List of questions in the questionnaire.
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIPromptRadioInput(title: Translatable, description: Translatable, items: list[RadioItem])¶
Radio group.
This radio group can be used to get a multiple choice answer from a user.
- title¶
Title of the radio group.
- Type:
- description¶
Short description of the radio group.
- Type:
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIQuestionMultipleChoice(id: int, question: Translatable, choices: list[Translatable])¶
Multiple choice question with radio buttons.
- id¶
Question ID.
- Type:
int
- question¶
The question text.
- Type:
- choices¶
List of choices.
- Type:
list[Translatable]
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIQuestionMultipleChoiceCheckbox(id: int, question: Translatable, choices: list[Translatable])¶
Multiple choice question with checkboxes.
- id¶
Question ID.
- Type:
int
- question¶
The question text.
- Type:
- choices¶
List of choices.
- Type:
list[Translatable]
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.PropsUIQuestionOpen(id: int, question: Translatable)¶
Open-ended question.
- id¶
Question ID.
- Type:
int
- question¶
The question text.
- Type:
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.RadioItem¶
Radio button.
- id¶
ID of radio button.
- Type:
int
- value¶
Text to be displayed.
- Type:
str
- class port.api.props.Translatable(translations: Translations)¶
Wrapper class for Translations.
- toDict()¶
Convert the object to a dictionary.
- Returns:
A dictionary representation of the object.
- Return type:
dict
- class port.api.props.Translations¶
Typed dict containing text that is displayed in a specific language.
Extraction helpers¶
This module contains helper functions that can be used during the data extraction process
- exception port.helpers.extraction_helpers.FileNotFoundInZipError¶
The File you are looking for is not present in a zipfile
- port.helpers.extraction_helpers.dict_denester(inp: dict[Any, Any] | list[Any], new: dict[Any, Any] | None = None, name: str = '', run_first: bool = True) dict[Any, Any] ¶
Denests a dictionary or list, returning a new flattened dictionary.
- Parameters:
inp (dict[Any, Any] | list[Any]) – The input dictionary or list to be denested.
new (dict[Any, Any] | None, optional) – The dictionary to store denested key-value pairs. Defaults to None.
name (str, optional) – The current key name in the denesting process. Defaults to “”.
run_first (bool, optional) – Flag to indicate if this is the first run of the function. Defaults to True.
- Returns:
A new denested dictionary.
- Return type:
dict[Any, Any]
Examples:
>>> nested_dict = {"a": {"b": {"c": 1}}, "d": [2, 3]} >>> dict_denester(nested_dict) {"a-b-c": 1, "d-0": 2, "d-1": 3}
- port.helpers.extraction_helpers.epoch_to_iso(epoch_timestamp: str | int | float) str ¶
Convert epoch timestamp to an ISO 8601 string, assuming UTC.
- Parameters:
epoch_timestamp (str | int) – The epoch timestamp to convert.
- Returns:
The ISO 8601 formatted string, or the original input if conversion fails.
- Return type:
str
- Raises:
Exception – Logs an error message if conversion fails.
Examples:
>>> epoch_to_iso(1632139200) "2021-09-20T12:00:00+00:00"
- port.helpers.extraction_helpers.extract_file_from_zip(zfile: str, file_to_extract: str) BytesIO ¶
Extracts a specific file from a zipfile and returns it as a BytesIO buffer.
- Parameters:
zfile (str) – Path to the zip file.
file_to_extract (str) – Name or path of the file to extract from the zip.
- Returns:
- A BytesIO buffer containing the extracted file’s content of the first file found.
Returns an empty BytesIO if the file is not found or an error occurs.
- Return type:
io.BytesIO
- Raises:
FileNotFoundInZipError – Logs an error if the specified file is not found in the zip.
zipfile.BadZipFile – Logs an error if the zip file is invalid.
Exception – Logs any other unexpected errors.
Examples:
>>> extracted_file = extract_file_from_zip("archive.zip", "data.txt") >>> content = extracted_file.getvalue().decode('utf-8')
- port.helpers.extraction_helpers.find_item(d: dict[Any, Any], key_to_match: str) str ¶
Finds the least nested value in a denested dictionary whose key contains the given key_to_match.
- Parameters:
d (dict[Any, Any]) – A denested dictionary to search in.
key_to_match (str) – The substring to match in the keys.
- Returns:
- The value of the least nested key containing key_to_match.
Returns an empty string if no match is found.
- Return type:
str
- Raises:
Exception – Logs an error message if an exception occurs during the search.
Examples:
>>> d = {"asd-asd-asd": 1, "asd-asd": 2, "qwe": 3} >>> find_item(d, "asd") "2"
- port.helpers.extraction_helpers.find_items(d: dict[Any, Any], key_to_match: str) list ¶
Finds all values in a denested dictionary whose keys contain the given key_to_match.
- Parameters:
d (dict[Any, Any]) – A denested dictionary to search in.
key_to_match (str) – The substring to match in the keys.
- Returns:
A list of all values whose keys contain key_to_match.
- Return type:
list
- Raises:
Exception – Logs an error message if an exception occurs during the search.
Examples:
>>> d = {"asd-1": "a", "asd-2": "b", "qwe": "c"} >>> find_items(d, "asd") ["a", "b"]
- port.helpers.extraction_helpers.fix_ascii_string(input: str) str ¶
Fixes the string encoding by removing non-ASCII characters.
- Parameters:
input (str) – The input string that needs to be fixed.
- Returns:
The fixed string with only ASCII characters, or the original string if an exception occurs.
- Return type:
str
Examples:
>>> fix_ascii_string("Hello, 世界!") "Hello, !"
- port.helpers.extraction_helpers.fix_latin1_string(input: str) str ¶
Fixes the string encoding by attempting to encode it using the ‘latin1’ encoding and then decoding it.
- Parameters:
input (str) – The input string that needs to be fixed.
- Returns:
The fixed string after encoding and decoding, or the original string if an exception occurs.
- Return type:
str
Examples:
>>> fix_latin1_string("café") "café"
- port.helpers.extraction_helpers.json_dumper(zfile: str) pandas.DataFrame ¶
Reads all JSON files in a zip file, flattens them, and combines them into a single DataFrame.
- Parameters:
zfile (str) – Path to the zip file containing JSON files.
- Returns:
A DataFrame containing flattened data from all JSON files in the zip.
- Return type:
pd.DataFrame
- Raises:
Exception – Logs an error message if an exception occurs during the process.
Examples:
>>> df = json_dumper("data.zip") >>> print(df.head())
- port.helpers.extraction_helpers.read_csv_from_bytes(json_bytes: BytesIO) list[dict[Any, Any]] ¶
Reads CSV data from a BytesIO buffer and returns it as a list of dictionaries.
- Parameters:
json_bytes (io.BytesIO) – A BytesIO buffer containing CSV data.
- Returns:
- A list of dictionaries, where each dictionary represents a row in the CSV.
Returns an empty list if parsing fails.
- Return type:
list[dict[Any, Any]]
Examples
>>> buffer = io.BytesIO(b'name,age\nAlice,30\nBob,25') >>> data = read_csv_from_bytes(buffer) >>> print(data) [{'name': 'Alice', 'age': '30'}, {'name': 'Bob', 'age': '25'}]
- port.helpers.extraction_helpers.read_csv_from_bytes_to_df(json_bytes: BytesIO) pandas.DataFrame ¶
Reads CSV data from a BytesIO buffer and returns it as a pandas DataFrame.
- Parameters:
json_bytes (io.BytesIO) – A BytesIO buffer containing CSV data.
- Returns:
A pandas DataFrame containing the CSV data.
- Return type:
pd.DataFrame
Examples
>>> buffer = io.BytesIO(b'name,age\nAlice,30\nBob,25') >>> df = read_csv_from_bytes_to_df(buffer) >>> print(df) name age 0 Alice 30 1 Bob 25
- port.helpers.extraction_helpers.read_json_from_bytes(json_bytes: BytesIO) dict[Any, Any] | list[Any] ¶
Reads JSON data from a BytesIO buffer.
- Parameters:
json_bytes (io.BytesIO) – A BytesIO buffer containing JSON data.
- Returns:
- The parsed JSON data as a dictionary or list.
Returns an empty dictionary if parsing fails.
- Return type:
dict[Any, Any] | list[Any]
Examples:
>>> buffer = io.BytesIO(b'{"key": "value"}') >>> data = read_json_from_bytes(buffer) >>> print(data) {'key': 'value'}
- port.helpers.extraction_helpers.read_json_from_file(json_file: str) dict[Any, Any] | list[Any] ¶
Reads JSON data from a file.
- Parameters:
json_file (str) – Path to the JSON file.
- Returns:
- The parsed JSON data as a dictionary or list.
Returns an empty dictionary if parsing fails.
- Return type:
dict[Any, Any] | list[Any]
Examples:
>>> data = read_json_from_file("data.json") >>> print(data) {'key': 'value'}
- port.helpers.extraction_helpers.replace_months(input_string: str) str ¶
Replaces Dutch month abbreviations with English equivalents in the input string.
- Parameters:
input_string (str) – The input string containing potential Dutch month abbreviations.
- Returns:
The input string with Dutch month abbreviations replaced by English equivalents.
- Return type:
str
Examples:
>>> replace_months("15 mei 2023") "15 may 2023"
- port.helpers.extraction_helpers.sort_isotimestamp_empty_timestamp_last(timestamp_series: pandas.Series) pandas.Series ¶
Creates a key for sorting a pandas Series of ISO timestamps, placing empty timestamps last.
- Parameters:
timestamp_series (pd.Series) – A pandas Series containing ISO formatted timestamps.
- Returns:
A Series of sorting keys, with -timestamp for valid dates and infinity for invalid/empty dates.
- Return type:
pd.Series
Examples:
>>> df = df.sort_values(by="Date", key=sort_isotimestamp_empty_timestamp_last)
Port helpers¶
- port.helpers.port_helpers.donate(key: str, json_string: str) CommandSystemDonate ¶
Initiates a donation process using the provided key and data.
This function triggers the donation process by passing a key and a JSON-formatted string that contains donation information.
- Parameters:
key (str) – The key associated with the donation process. The key will be used in the file name.
json_string (str) – A JSON-formatted string containing the donated data.
- Returns:
A system command that initiates the donation process. Must be yielded.
- Return type:
CommandSystemDonate
- port.helpers.port_helpers.exit(code: int, info: str) CommandSystemExit ¶
Exits Next with the provided exit code and additional information. This if the code reaches this function, it will return to the task list in Next.
- Parameters:
code (int) – The exit code representing the type or status of the exit.
info (str) – A string containing additional information about the exit.
- Returns:
A system command that initiates the exit process in Next.
- Return type:
CommandSystemExit
Examples:
yield exit(0, "Success")
- port.helpers.port_helpers.generate_file_prompt(extensions: str) PropsUIPromptFileInput ¶
Generates a file input prompt for selecting a file for a platform.
This function creates a bilingual (English and Dutch) file input prompt that instructs the user to select a file they’ve received from a platform and stored on their device.
- Parameters:
extensions (str) – A collection of allowed MIME types.
example (For) – “application/zip, text/plain, application/json”
- Returns:
A file input prompt object containing the description text and allowed file extensions.
- Return type:
- port.helpers.port_helpers.generate_retry_prompt(platform_name: str) PropsUIPromptConfirm ¶
Generates a confirmation prompt for retrying file processing.
This function creates a bilingual (English and Dutch) confirmation prompt when a file from a specific platform cannot be processed. It allows the user to either try again with a different file or continue with the current file.
- Parameters:
platform_name (str) – The name of the platform associated with the file that couldn’t be processed. This is inserted into the prompt text.
- Returns:
A confirmation prompt object containing the message, and labels for the “OK” (try again) and “Cancel” (continue) buttons.
- Return type:
- port.helpers.port_helpers.generate_review_data_prompt(id: str, description: Translatable, table_list: list[PropsUIPromptConsentFormTable]) PropsUIPromptConsentForm ¶
Generates a data review form with a list of tables and a description, including default donate question and button. The participant can review these tables before they will be send to the researcher. If the participant consents to sharing the data the data will be stored at the configured storage location.
- Parameters:
id (str) – will be used as part of the filename when the data is stored
table_list (list[props.PropsUIPromptConsentFormTable]) – A list of consent form tables to be included in the prompt.
description (props.Translatable) – A translatable description text for the consent prompt.
- Returns:
A structured consent form object containing the provided table list, description, and default values for donate question and button.
- Return type:
- port.helpers.port_helpers.render_end_page()¶
Renders a thank you page, must be yielded.
- port.helpers.port_helpers.render_page(header_text: Translatable, body: PropsUIPromptRadioInput | PropsUIPromptConsentForm | PropsUIPromptFileInput | PropsUIPromptFileInputMultiple | PropsUIPromptConfirm | PropsUIPromptQuestionnaire) CommandUIRender ¶
Renders the UI components for a donation page.
This function assembles various UI components including a header, body, and footer to create a complete donation page. It uses the provided header text and body content to customize the page.
- Parameters:
header_text (props.Translatable) – The text to be displayed in the header. This should be a translatable object to support multiple languages.
( (body) – props.PropsUIPromptRadioInput | props.PropsUIPromptConsentForm | props.PropsUIPromptFileInput | props.PropsUIPromptFileInputMultiple | props.PropsUIPromptConfirm | props.PropsUIPromptQuestionnaire
) – The main content of the page. It must be compatible with props.PropsUIPageDonation.
- Returns:
A render command object containing the fully assembled page. Must be yielded.
- Return type:
CommandUIRender
Validation¶
Contains classes to deal with input validation of DDPs
The idea of this module is to provide a uniform way to assign a validation status to a DDP validation Which can be used and acted upon
- class port.helpers.validate.DDPCategory(id: str, ddp_filetype: DDPFiletype, language: Language, known_files: list[str])¶
Represents characteristics that define a DDP (Data Delivery Package) category.
- Parameters:
id (str) – Unique identifier for the DDP category.
ddp_filetype (DDPFiletype) – The file type of the DDP.
language (Language) – The language of the DDP.
known_files (List[str]) – A list of known files associated with this DDP category.
Examples
>>> category = DDPCategory("cat1", DDPFiletype.JSON, Language.EN, ["file1.json", "file2.json"]) >>> print(category.id) cat1 >>> print(category.language) <Language.EN: 1>
- class port.helpers.validate.DDPFiletype(value)¶
Enumeration of supported DDP file types.
- class port.helpers.validate.Language(value)¶
Enumeration of supported languages.
- class port.helpers.validate.StatusCode(id: int, description: str)¶
Represents a status code that can be used to set a DDP status.
- Parameters:
id (int) – The numeric identifier of the status code.
description (str) – A brief description of what the status code represents.
Examples
>>> status = StatusCode(0, "Success") >>> print(status.id) 0 >>> print(status.description) Success
- class port.helpers.validate.ValidateInput(all_status_codes: list[StatusCode], all_ddp_categories: list[DDPCategory], current_status_code: StatusCode | None = None, current_ddp_category: DDPCategory | None = None)¶
A class for validating input data against predefined categories and status codes.
- Parameters:
all_status_codes (List[StatusCode]) – A list of valid status codes.
all_ddp_categories (List[DDPCategory]) – A list of valid DDP categories.
current_status_code (Optional[StatusCode]) – The current status code. Defaults to None.
current_ddp_category (Optional[DDPCategory]) – The current DDP category. Defaults to None.
- ddp_categories_lookup¶
A lookup dictionary for DDP categories.
- Type:
Dict[str, DDPCategory]
- status_codes_lookup¶
A lookup dictionary for status codes.
- Type:
Dict[int, StatusCode]
Examples
>>> status_codes = [StatusCode(id=0, description="Success"), StatusCode(id=1, description="Error")] >>> ddp_categories = [DDPCategory(id="cat1", ddp_filetype=DDPFiletype.JSON, language=Language.EN, known_files=["file1.txt", "file2.txt"])] >>> validator = ValidateInput(all_status_codes=status_codes, all_ddp_categories=ddp_categories)
- get_status_code_id() int ¶
Return the current assigned status code ID. Note: zero is always used for OK. Non-zero otherwise.
- Returns:
The ID of the current status code, or 1 if no status code is set.
- Return type:
int
Examples
>>> validator.get_status_code_id()
- infer_ddp_category(file_list_input: list[str]) bool ¶
Compares a list of files to a list of known files and infers the DDPCategory.
- Parameters:
file_list_input (List[str]) – A list of input files to compare against known files.
- Returns:
True if a valid DDP category is inferred, False otherwise. It sets the current_status_code and current_ddp_category to either the DDP catogory match, or to an unknown category.
- Return type:
bool
Examples
>>> validator.infer_ddp_category(["file1.txt", "file2.txt"])
- set_current_status_code_by_id(id: int) None ¶
Set the status code based on the provided ID.
- Parameters:
id (int) – The ID of the status code to set.
Examples
>>> validator.set_current_status_code_by_id(0)
- port.helpers.validate.validate_zip(ddp_categories: list[DDPCategory], path_to_zip: str) ValidateInput ¶
Validates a DDP zip file against a list of DDP categories.
This function attempts to open and read the contents of a zip file, then uses the ValidateInput class to infer the DDP category based on the files in the zip. If the zip file is invalid or cannot be read, it sets an error status code (an integer greather than 0).
- Parameters:
ddp_categories (List[DDPCategory]) – A list of valid DDP categories to compare against.
path_to_zip (str) – The file path to the zip file to be validated.
- Returns:
An instance of ValidateInput containing the validation results.
- Return type:
- Raises:
zipfile.BadZipFile – This exception is caught internally and results in an error status code.
Examples
>>> categories = [DDPCategory(id="cat1", ddp_filetype=DDPFiletype.JSON, language=Language.EN, known_files=["file1.txt", "file2.txt"])] >>> result = validate_zip(categories, "path/to/valid.zip") >>> result.get_status_code_id() 0
>>> result = validate_zip(categories, "path/to/invalid.zip") >>> result.get_status_code_id() 1