Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Change Log

## 24.3.1

* Fixed: added `ProjectAuthMethodId.PASSKEY`, so `project.updateAuthMethod` can enable passkeys
* Fixed: added `ProjectPolicyId.PASSKEY` and the `PolicyPasskey` model, so `getPolicy` and `listPolicies` return the passkey policy

## 24.3.0

* Added: `account` passkey methods `listPasskeys`, `createPasskey`, `getPasskey`, `updatePasskey`, `deletePasskey` and `updatePasskeyVerification`
Expand Down
4 changes: 2 additions & 2 deletions appwrite/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ def __init__(self):
self._endpoint = 'https://cloud.appwrite.io/v1'
self._global_headers = {
'content-type': '',
'user-agent': f'AppwritePythonSDK/24.3.0 ({platform.uname().system}; {platform.uname().version}; {platform.uname().machine})',
'user-agent': f'AppwritePythonSDK/24.3.1 ({platform.uname().system}; {platform.uname().version}; {platform.uname().machine})',
'x-sdk-name': 'Python',
'x-sdk-platform': 'server',
'x-sdk-language': 'python',
'x-sdk-version': '24.3.0',
'x-sdk-version': '24.3.1',
'X-Appwrite-Response-Format': '2.0.0',
}
self._config = {}
Expand Down
1 change: 1 addition & 0 deletions appwrite/enums/project_auth_method_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ class ProjectAuthMethodId(Enum):
INVITES = "invites"
JWT = "jwt"
PHONE = "phone"
PASSKEY = "passkey"
1 change: 1 addition & 0 deletions appwrite/enums/project_policy_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ class ProjectPolicyId(Enum):
DENY_DISPOSABLE_EMAIL = "deny-disposable-email"
DENY_FREE_EMAIL = "deny-free-email"
DENY_CORPORATE_EMAIL = "deny-corporate-email"
PASSKEY = "passkey"
2 changes: 2 additions & 0 deletions appwrite/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@
from .policy_user_limit import PolicyUserLimit
from .policy_membership_privacy import PolicyMembershipPrivacy
from .policy_mfa_factors import PolicyMfaFactors
from .policy_passkey import PolicyPasskey
from .platform_web import PlatformWeb
from .platform_apple import PlatformApple
from .platform_android import PlatformAndroid
Expand Down Expand Up @@ -497,6 +498,7 @@
'PolicyUserLimit',
'PolicyMembershipPrivacy',
'PolicyMfaFactors',
'PolicyPasskey',
'PlatformWeb',
'PlatformApple',
'PlatformAndroid',
Expand Down
4 changes: 3 additions & 1 deletion appwrite/models/policy_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from .policy_deny_disposable_email import PolicyDenyDisposableEmail
from .policy_deny_free_email import PolicyDenyFreeEmail
from .policy_deny_corporate_email import PolicyDenyCorporateEmail
from .policy_passkey import PolicyPasskey


class PolicyList(AppwriteModel):
Expand All @@ -27,7 +28,7 @@ class PolicyList(AppwriteModel):
----------
total : float
Total number of policies in the given project.
policies : List[Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail]]
policies : List[Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, PolicyPasskey]]
List of policies.
"""

Expand All @@ -49,5 +50,6 @@ class PolicyList(AppwriteModel):
PolicyDenyDisposableEmail,
PolicyDenyFreeEmail,
PolicyDenyCorporateEmail,
PolicyPasskey,
]
] = Field(..., alias='policies')
23 changes: 23 additions & 0 deletions appwrite/models/policy_passkey.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from typing import Any, Dict, List, Optional, Union, cast
from pydantic import Field, PrivateAttr

from .base_model import AppwriteModel


class PolicyPasskey(AppwriteModel):
"""
Policy Passkey

Attributes
----------
id : str
Policy ID.
rpid : str
Relying party ID passkeys are bound to. Empty until configured.
origins : List[Any]
Web origins passkeys work on, from the project's platforms on the relying party ID and a localhost web platform. Read-only.
"""

id: str = Field(..., alias='$id')
rpid: str = Field(..., alias='rpId')
origins: List[Any] = Field(..., alias='origins')
7 changes: 6 additions & 1 deletion appwrite/services/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
from ..models.policy_deny_disposable_email import PolicyDenyDisposableEmail
from ..models.policy_deny_free_email import PolicyDenyFreeEmail
from ..models.policy_deny_corporate_email import PolicyDenyCorporateEmail
from ..models.policy_passkey import PolicyPasskey
from ..enums.project_protocol_id import ProjectProtocolId
from ..enums.project_service_id import ProjectServiceId
from ..enums.project_smtp_secure import ProjectSMTPSecure
Expand Down Expand Up @@ -4913,6 +4914,7 @@ def get_policy(
PolicyDenyDisposableEmail,
PolicyDenyFreeEmail,
PolicyDenyCorporateEmail,
PolicyPasskey,
]:
"""
Get a policy by its unique ID. This endpoint returns the current configuration for the requested project policy.
Expand All @@ -4923,7 +4925,7 @@ def get_policy(
Policy ID. Can be one of: password-dictionary, password-history, password-strength, password-personal-data, session-alert, session-duration, session-invalidation, session-limit, user-limit, membership-privacy, mfa-factors, deny-aliased-email, deny-disposable-email, deny-free-email, deny-corporate-email.
Returns
-------
Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail]
Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, PolicyPasskey]
API response as one of the typed response models

Raises
Expand Down Expand Up @@ -4995,6 +4997,9 @@ def get_policy(
if response.get('$id') == 'deny-corporate-email':
return self._parse_response(response, model=PolicyDenyCorporateEmail)

if response.get('$id') == 'passkey':
return self._parse_response(response, model=PolicyPasskey)

raise AppwriteException('Unable to match response to any known model')

def update_protocol(
Expand Down
3 changes: 2 additions & 1 deletion docs/examples/project/get-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ from appwrite.models import PolicyDenyAliasedEmail
from appwrite.models import PolicyDenyDisposableEmail
from appwrite.models import PolicyDenyFreeEmail
from appwrite.models import PolicyDenyCorporateEmail
from appwrite.models import PolicyPasskey
from typing import Union
from appwrite.enums import ProjectPolicyId

Expand All @@ -26,7 +27,7 @@ client.set_key('<YOUR_API_KEY>') # Your secret API key

project = Project(client)

result: Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail] = project.get_policy(
result: Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, PolicyPasskey] = project.get_policy(
policy_id = ProjectPolicyId.PASSWORD_DICTIONARY
)

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "appwrite"
version = "24.3.0"
version = "24.3.1"
description = "Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API"
readme = "README.md"
requires-python = ">=3.9"
Expand Down
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
setuptools.setup(
name='appwrite',
packages=setuptools.find_packages(),
version='24.3.0',
version='24.3.1',
license='BSD-3-Clause',
description='Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API',
long_description=long_description,
Expand All @@ -18,7 +18,7 @@
maintainer='Appwrite Team',
maintainer_email='team@appwrite.io',
url='https://appwrite.io/support',
download_url='https://github.com/appwrite/sdk-for-python/archive/24.3.0.tar.gz',
download_url='https://github.com/appwrite/sdk-for-python/archive/24.3.1.tar.gz',
install_requires=[
'requests',
'pydantic>=2,<3',
Expand Down
Loading