Skip to main content

Pydmart

This is a Python Dmart client (v1.3.x) used to interact with a Dmart instance

Installation

Pydmart is distributed via PyPI:

pip install pydmart

Example

The DmartService class provides methods to interact with a Dmart instance. Below is a detailed explanation of each method available in the class.

  • Initialize the service by providing the base URL of the Dmart instance:
service = DmartService("http://localhost:8282")
  • Perform a login action using the provided shortname and password:
login = await service.login("dmart", "Test1234")
  • Fetch the profile of the current user:
me = await service.get_profile()
  • Create a new space:
action_request_record = ActionRequestRecord(
    resource_type=ResourceType.space,
    shortname="myspace_test",
    subpath="/",
    attributes={
        "is_active": True
    }
)
action_request = ActionRequest(
    space_name="myspace_test",
    request_type=RequestType.create,
    records=[action_request_record]
)
space = await service.space(action_request)
  • Remove a space:
action_request_record = ActionRequestRecord(
    resource_type=ResourceType.space,
    shortname="myspace_test",
    subpath="/",
    attributes={}
)
action_request = ActionRequest(
    space_name="myspace_test",
    request_type=RequestType.delete,
    records=[action_request_record]
)
space = await service.space(action_request)
  • Query the spaces:
query_request = QueryRequest(
    type=QueryType.spaces,
    space_name="management",
    subpath="/",
    search=""
)
query = await service.query(query_request)
  • Query with a join (attach related entries from another subpath):
from pydmart import JoinQuery, JoinType

orders = QueryRequest(
    type=QueryType.subpath,
    space_name="shop",
    subpath="orders",
    search="",
    retrieve_json_payload=True,
    join=[
        JoinQuery(
            # left path is read from each order, right path from the joined records
            join_on="payload.body.customer:shortname",
            alias="customer",            # results land under record.attributes["join"]["customer"]
            type=JoinType.left,          # left (default) | right | inner | outer
            query=QueryRequest(          # the right side: which entries to join against
                type=QueryType.subpath,
                space_name="shop",
                subpath="customers",
                search="",
                retrieve_json_payload=True,
            ),
        ),
    ],
)
response = await service.query(orders)
for record in response.records:
    matched = record.attributes.get("join", {}).get("customer", [])
    # `matched` is the list of joined customer records for this order

APIs

  • login(shortname: str, password: str) -> ApiResponse Performs a login action using the provided shortname and password.

  • login_by(credentials: dict, password: str) -> ApiResponse Performs a login action using custom credentials and password.

  • logout() -> ApiResponse Performs a logout action.

  • create_user(request: dict) -> ActionResponse Creates a new user with the provided request data.

  • update_user(request: dict) -> ActionResponse Updates an existing user with the provided request data. No longer accepts contact-change fields (email, new_email, email_otp, msisdn, new_msisdn, msisdn_otp) — use otp_request with purpose="verify-contact" followed by confirm_otp instead.

  • check_existing(prop: str, value: str) -> ResponseEntry Checks if a user exists based on the provided property and value.

  • otp_request(self, purpose: OtpPurpose, msisdn: Optional[str] = None, email: Optional[str] = None, shortname: Optional[str] = None, accept_language: Optional[str] = None) Requests an OTP (One Time Password) for the provided MSISDN, email, or shortname. purpose is required and must be one of login, reset, register, verify-contact (see OtpPurpose). Use purpose="login" in place of the old otp_request_login, and purpose="reset" in place of the old password_reset_request.

  • confirm_otp(self, otp: str, msisdn: Optional[str] = None, email: Optional[str] = None) Verifies a contact's OTP code (sent via otp_request) using the given MSISDN or email.

  • user_reset(self, shortname: str) Performs a user reset action for the specified shortname.

  • validate_password(self, password: str) Validates the provided password against the Dmart password policy.

  • get_profile() -> ProfileResponse Gets the profile of the current user. Its permission map is deprecated by dmart in favour of get_permissions().

  • get_permissions() -> Dict[str, Any] Gets the current user's permission map from GET /user/permissions, keyed "space:subpath:resource_type", and caches it in current_user_permissions. A server without that route is answered from the profile.

  • query(query: QueryRequest, scope: str = "managed") -> ApiResponse Performs a query action with the provided query request and scope.

  • csv(query: QueryRequest) -> ApiResponse Queries the entries as a CSV file with the provided query request.

  • space(action: ActionRequest) -> ActionResponse Performs actions on spaces with the provided action request.

  • request(action: ActionRequest) -> ActionResponse Performs a request action with the provided action request.

  • retrieve_entry(resource_type: ResourceType, space_name: str, subpath: str, shortname: str, retrieve_json_payload: bool = False, retrieve_attachments: bool = False, validate_schema: bool = True, scope: str = "managed") -> ResponseEntry Retrieves an entry based on the provided parameters.

  • upload_with_payload(space_name: str, subpath: str, shortname: str, resource_type: ResourceType, payload_file: Any, content_type: Optional[ContentType] = None, schema_shortname: Optional[str] = None) -> ApiResponse Uploads a file with payload to the specified space.

  • fetch_data_asset(resource_type: str, data_asset_type: str, space_name: str, subpath: str, shortname: str, query_string: str = "SELECT * FROM file", filter_data_assets: Optional[List[str]] = None, branch_name: Optional[str] = None) -> Dict[str, Any] Fetches a data asset based on the provided parameters.

  • get_spaces() -> ApiResponse Gets the list of spaces.

  • get_children(space_name: str, subpath: str, limit: int = 20, offset: int = 0, restrict_types: Optional[List[ResourceType]] = None) -> ApiResponse Gets the children of a specified space.

  • get_attachment_url(resource_type: ResourceType, space_name: str, subpath: str, parent_shortname: str, shortname: str, ext: Optional[str] = None, scope: str = "managed") -> str Gets the URL of an attachment.

  • get_space_health(space_name: str) -> Dict[str, Any] Gets the health status of a specified space.

  • get_attachment_content(resource_type: str, space_name: str, subpath: str, shortname: str, scope: str = "managed") -> Dict[str, Any] Gets the content of an attachment.

  • get_payload(resource_type: str, space_name: str, subpath: str, shortname: str, ext: str = ".json", scope: str = "managed") -> Dict[str, Any] Gets the payload of a specified resource.

  • get_payload_content(resource_type: str, space_name: str, subpath: str, shortname: str, ext: str = ".json", scope: str = "managed") -> Dict[str, Any] Gets the content of a payload.

  • progress_ticket(space_name: str, subpath: str, shortname: str, action: str, resolution: Optional[str] = None, comment: Optional[str] = None) -> Dict[str, Any] Progresses a ticket with the provided parameters.

  • submit(space_name: str, schema_shortname: str, subpath: str, record: Dict[str, Any]) -> Dict[str, Any] Submits a record to the specified space and schema.

  • get_manifest() -> Dict[str, Any] Gets the manifest information.

  • get_settings() -> Dict[str, Any] Gets the settings information.

Metadata

Release files for pydmart 2.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pydmart 2.6.0
File Size Uploaded Provenance Actions
pydmart-2.6.0.tar.gz 26.2 kB Without provenance Details for pydmart-2.6.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pydmart 2.6.0
File Interpreter ABI Platform Actions
pydmart-2.6.0-py3-none-any.whl Python 3 none any Details for pydmart-2.6.0-py3-none-any.whl

Total release size: 41.7 kB

Release files / pydmart-2.6.0.tar.gz

Download URL pydmart-2.6.0.tar.gz
Size 26.2 kB
Tags Source
SHA-256 checksum
How to use checksums
722729c33207f7b88eb81f856afb4439b111a5e92d8fbc30d5321f9cc3abbde7
BLAKE2b-256 checksum
How to use checksums
d8c5cfe28ba33c65d16f8f4b1a776ba316aab01c4c0584b8368742f588053d5e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"45","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pydmart-2.6.0-py3-none-any.whl

Download URL pydmart-2.6.0-py3-none-any.whl
Size 15.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
62148e4bb7ca288aa19d9cc0369c376f8a993e45f4de42ab843d447176a38986
BLAKE2b-256 checksum
How to use checksums
6c8642e51db6ec5d3eabd21c587824dd04e5383836a4ea5c7f822b129e9c5826
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"45","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for pydmart 2.6.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page