imednet.form_designer package

class imednet.form_designer.FormBuilder[source]

Bases: object

Builder class to construct iMedNet Form Designer payloads programmatically.

Manages ID generation and hierarchical structure.

__init__()[source]
Return type:

None

add_field(type, label, question_name, required=False, choices=None, max_length=None, is_float=False)[source]

Add a standard field (Label + Control).

Parameters:
  • type (Literal['text', 'number', 'radio', 'dropdown', 'datetime', 'upload', 'checkbox', 'memo']) – Field type.

  • label (str) – Display label (HTML allowed).

  • question_name (str) – Variable OID.

  • required (bool) – If True, sets bl_req=’hard’.

  • choices (Optional[List[tuple[str, str]]]) – List of (text, code) for radios/dropdowns.

  • max_length (Optional[int]) – Max chars (text/memo) or digits (number).

  • is_float (bool) – For numbers, allow decimals.

Return type:

None

add_group_header(label)[source]

Add a group header (Label-only row).

Return type:

None

Parameters:

label (str) –

add_page()[source]

Add a new page to the form.

Return type:

None

add_section_header(label)[source]

Add a separator/section header.

Return type:

None

Parameters:

label (str) –

build()[source]

Return the final layout.

Return type:

ProtocolDeviationFormPayload

property current_page: Page
class imednet.form_designer.FormDesignerClient[source]

Bases: object

Client for the iMedNet Form Designer endpoint.

Handles the specific authentication and payload requirements of the legacy formdez_save.php endpoint.

__init__(base_url, phpsessid, timeout=30.0)[source]

Initialize the client.

Parameters:
  • base_url (str) – The base URL of the iMedNet instance (e.g., https://xyz.imednet.com).

  • phpsessid (str) – The active PHP session ID from the browser.

  • timeout (float) – Request timeout in seconds.

save_form(csrf_key, form_id, community_id, revision, layout)[source]

Submit the form layout to the server.

Parameters:
  • csrf_key (str) – The CSRF token (scraped from page).

  • form_id (int) – The ID of the form being edited.

  • community_id (int) – The study ID.

  • revision (int) – The NEXT revision number.

  • layout (ProtocolDeviationFormPayload) – The Form Layout object.

Return type:

str

Returns:

The raw response text from the server.

Raises:
  • httpx.HTTPStatusError – If the server returns a non-2xx status code.

  • ClientError – If validation fails for the provided arguments.

  • ApiError – If the server returns an error.

imednet.form_designer.Layout

alias of ProtocolDeviationFormPayload

Submodules

imednet.form_designer.builder module

class imednet.form_designer.builder.FormBuilder[source]

Bases: object

Builder class to construct iMedNet Form Designer payloads programmatically.

Manages ID generation and hierarchical structure.

__init__()[source]
Return type:

None

add_field(type, label, question_name, required=False, choices=None, max_length=None, is_float=False)[source]

Add a standard field (Label + Control).

Parameters:
  • type (Literal['text', 'number', 'radio', 'dropdown', 'datetime', 'upload', 'checkbox', 'memo']) – Field type.

  • label (str) – Display label (HTML allowed).

  • question_name (str) – Variable OID.

  • required (bool) – If True, sets bl_req=’hard’.

  • choices (Optional[List[tuple[str, str]]]) – List of (text, code) for radios/dropdowns.

  • max_length (Optional[int]) – Max chars (text/memo) or digits (number).

  • is_float (bool) – For numbers, allow decimals.

Return type:

None

add_group_header(label)[source]

Add a group header (Label-only row).

Return type:

None

Parameters:

label (str) –

add_page()[source]

Add a new page to the form.

Return type:

None

add_section_header(label)[source]

Add a separator/section header.

Return type:

None

Parameters:

label (str) –

build()[source]

Return the final layout.

Return type:

ProtocolDeviationFormPayload

property current_page: Page

imednet.form_designer.client module

class imednet.form_designer.client.FormDesignerClient[source]

Bases: object

Client for the iMedNet Form Designer endpoint.

Handles the specific authentication and payload requirements of the legacy formdez_save.php endpoint.

__init__(base_url, phpsessid, timeout=30.0)[source]

Initialize the client.

Parameters:
  • base_url (str) – The base URL of the iMedNet instance (e.g., https://xyz.imednet.com).

  • phpsessid (str) – The active PHP session ID from the browser.

  • timeout (float) – Request timeout in seconds.

save_form(csrf_key, form_id, community_id, revision, layout)[source]

Submit the form layout to the server.

Parameters:
  • csrf_key (str) – The CSRF token (scraped from page).

  • form_id (int) – The ID of the form being edited.

  • community_id (int) – The study ID.

  • revision (int) – The NEXT revision number.

  • layout (ProtocolDeviationFormPayload) – The Form Layout object.

Return type:

str

Returns:

The raw response text from the server.

Raises:
  • httpx.HTTPStatusError – If the server returns a non-2xx status code.

  • ClientError – If validation fails for the provided arguments.

  • ApiError – If the server returns an error.

imednet.form_designer.models module

class imednet.form_designer.models.BaseFieldProps[source]

Bases: BaseModel

Shared properties for all data capture fields.

bl_future_date: Optional[int]
bl_future_date_id: Optional[Union[int, str]]
bl_inherit_date: Optional[int]
bl_inherit_date_id: Optional[Union[int, str]]
bl_req: Optional[Literal['optional', 'hard', 'soft', 'autoquery', 'confirm']]
bl_req_id: Optional[Union[int, str]]
blinded_roles: Optional[List[str]]
catalog: Optional[str]
comments: Optional[str]
fld_id: Optional[Union[int, str]]
is_blinded: Optional[int]
label: Optional[str]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

mv: Optional[int]
new_fld_id: Optional[Union[int, str]]
nodelete: Optional[int]
page_no: Optional[str]
question_id: Optional[Union[int, str]]
question_name: Optional[str]
sas_label: Optional[str]
sdv_req: Optional[Literal['yes', 'no']]
sequence: Optional[str]
class imednet.form_designer.models.CheckboxFieldProps[source]

Bases: BaseFieldProps

choices: Optional[List[Choice]]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Literal['checkbox']
class imednet.form_designer.models.Choice[source]

Bases: BaseModel

A choice for radio or dropdown fields.

choice_id: Union[int, str]
code: str
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

text: str
class imednet.form_designer.models.Col[source]

Bases: BaseModel

A column in a layout table row.

entities: Optional[List[Entity]]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class imednet.form_designer.models.DateTimeFieldProps[source]

Bases: BaseFieldProps

allow_no_day: Optional[int]
allow_no_month: Optional[int]
allow_no_year: Optional[int]
date_ctrl: Optional[int]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

record_comp_date: Optional[int]
record_key_date: Optional[int]
time_ctrl: Optional[int]
type: Literal['datetime']
use_seconds: Optional[int]
class imednet.form_designer.models.DropdownFieldProps[source]

Bases: BaseFieldProps

choices: List[Choice]
lab_condition: Optional[str]
lab_default_form: Optional[str]
lab_default_form_type: Optional[str]
lab_default_question: Optional[str]
lab_normal: Optional[str]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Literal['dropdown']
class imednet.form_designer.models.Entity[source]

Bases: BaseModel

The ‘Component’ in the Composite Pattern.

id: str
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

props: EntityProps
rows: Optional[List[Row]]
class imednet.form_designer.models.ExtQuestionProps[source]

Bases: BaseModel

ext_source: Literal['interval', 'form']
field: Optional[int]
form: Optional[int]
interval_source: Optional[str]
label: str
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

source: Optional[int]
type: Literal['ext_question']
class imednet.form_designer.models.FileUploadProps[source]

Bases: BaseFieldProps

max_files: Union[str, int]
mfs: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Literal['upload']
class imednet.form_designer.models.LabelProps[source]

Bases: BaseModel

fld_id: Optional[Union[int, str]]
label: str
label_id: Optional[str]
label_name: Optional[str]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

new_fld_id: Optional[Union[int, str]]
type: Literal['label']
imednet.form_designer.models.Layout

alias of ProtocolDeviationFormPayload

class imednet.form_designer.models.MemoFieldProps[source]

Bases: BaseFieldProps

columns: Union[str, int]
length: Union[str, int]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

rows: Union[str, int]
type: Literal['memo']
class imednet.form_designer.models.NumberFieldProps[source]

Bases: BaseFieldProps

columns: Optional[Union[str, int]]
length: Union[str, int]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

real: Optional[int]
suffix: Optional[str]
type: Literal['number']
class imednet.form_designer.models.Page[source]

Bases: BaseModel

Represents a single page within the electronic Case Report Form (CRF).

entities: List[Entity]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class imednet.form_designer.models.PrecisionDateFieldProps[source]

Bases: BaseFieldProps

allow_no_day: Optional[int]
allow_no_month: Optional[int]
allow_no_time: Optional[int]
allow_no_year: Optional[int]
display_text_day: Optional[str]
display_text_month: Optional[str]
display_text_time: Optional[str]
display_text_year: Optional[str]
impute_day: Optional[str]
impute_month: Optional[int]
impute_time: Optional[str]
impute_year: Optional[int]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

precision_secs: Optional[int]
precision_time: Optional[int]
record_comp_date: Optional[int]
record_key_date: Optional[int]
type: Literal['precisiondate']
class imednet.form_designer.models.ProtocolDeviationFormPayload[source]

Bases: BaseModel

Root object representing the entire form definition payload.

model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

pages: List[Page]
class imednet.form_designer.models.RadioFieldProps[source]

Bases: BaseFieldProps

choices: List[Choice]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

radio: Optional[int]
type: Literal['radio']
class imednet.form_designer.models.Row[source]

Bases: BaseModel

A row in a layout table.

cols: List[Col]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class imednet.form_designer.models.SeparatorProps[source]

Bases: BaseModel

label: Optional[str]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

septype: int
type: Literal['sep']
class imednet.form_designer.models.TableProps[source]

Bases: BaseModel

columns: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Literal['table']
class imednet.form_designer.models.TextFieldProps[source]

Bases: BaseFieldProps

columns: Optional[Union[str, int]]
length: Union[str, int]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Literal['text']

imednet.form_designer.presets module

imednet.form_designer.presets.build_cv_pathology(builder)[source]

A CV Pathology sample form.

Return type:

None

Parameters:

builder (FormBuilder) –

imednet.form_designer.presets.build_demo_form(builder)[source]

A demo form with various field types.

Return type:

None

Parameters:

builder (FormBuilder) –