Module exchangelib.indexed_properties

Expand source code
import logging

from .fields import Choice, EmailSubField, LabelField, NamedSubField, SubField
from .properties import EWSElement, EWSMeta

log = logging.getLogger(__name__)


class IndexedElement(EWSElement, metaclass=EWSMeta):
    """Base class for all classes that implement an indexed element."""

    LABEL_CHOICES = ()


class SingleFieldIndexedElement(IndexedElement, metaclass=EWSMeta):
    """Base class for all classes that implement an indexed element with a single field."""

    @classmethod
    def value_field(cls, version):
        fields = cls.supported_fields(version=version)
        if len(fields) != 1:
            raise ValueError(f"Class {cls} must have only one value field (found {tuple(f.name for f in fields)})")
        return fields[0]


class EmailAddress(SingleFieldIndexedElement):
    """MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-emailaddress"""

    ELEMENT_NAME = "Entry"
    LABEL_CHOICES = ("EmailAddress1", "EmailAddress2", "EmailAddress3")

    label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
    email = EmailSubField(is_required=True)


class PhoneNumber(SingleFieldIndexedElement):
    """MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-phonenumber"""

    ELEMENT_NAME = "Entry"
    LABEL_CHOICES = (
        "AssistantPhone",
        "BusinessFax",
        "BusinessPhone",
        "BusinessPhone2",
        "Callback",
        "CarPhone",
        "CompanyMainPhone",
        "HomeFax",
        "HomePhone",
        "HomePhone2",
        "Isdn",
        "MobilePhone",
        "OtherFax",
        "OtherTelephone",
        "Pager",
        "PrimaryPhone",
        "RadioPhone",
        "Telex",
        "TtyTddPhone",
    )

    label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default="PrimaryPhone")
    phone_number = SubField(is_required=True)


class MultiFieldIndexedElement(IndexedElement, metaclass=EWSMeta):
    """Base class for all classes that implement an indexed element with multiple fields."""


class PhysicalAddress(MultiFieldIndexedElement):
    """MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-physicaladdress"""

    ELEMENT_NAME = "Entry"
    LABEL_CHOICES = ("Business", "Home", "Other")

    label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
    street = NamedSubField(field_uri="Street")  # Street, house number, etc.
    city = NamedSubField(field_uri="City")
    state = NamedSubField(field_uri="State")
    country = NamedSubField(field_uri="CountryOrRegion")
    zipcode = NamedSubField(field_uri="PostalCode")

    def clean(self, version=None):
        if isinstance(self.zipcode, int):
            self.zipcode = str(self.zipcode)
        super().clean(version=version)

Classes

class EmailAddress (**kwargs)
Expand source code
class EmailAddress(SingleFieldIndexedElement):
    """MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-emailaddress"""

    ELEMENT_NAME = "Entry"
    LABEL_CHOICES = ("EmailAddress1", "EmailAddress2", "EmailAddress3")

    label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
    email = EmailSubField(is_required=True)

Ancestors

Class variables

var ELEMENT_NAME
var FIELDS
var LABEL_CHOICES

Instance variables

var email
var label

Inherited members

class IndexedElement (**kwargs)

Base class for all classes that implement an indexed element.

Expand source code
class IndexedElement(EWSElement, metaclass=EWSMeta):
    """Base class for all classes that implement an indexed element."""

    LABEL_CHOICES = ()

Ancestors

Subclasses

Class variables

var LABEL_CHOICES

Inherited members

class MultiFieldIndexedElement (**kwargs)

Base class for all classes that implement an indexed element with multiple fields.

Expand source code
class MultiFieldIndexedElement(IndexedElement, metaclass=EWSMeta):
    """Base class for all classes that implement an indexed element with multiple fields."""

Ancestors

Subclasses

Inherited members

class PhoneNumber (**kwargs)
Expand source code
class PhoneNumber(SingleFieldIndexedElement):
    """MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-phonenumber"""

    ELEMENT_NAME = "Entry"
    LABEL_CHOICES = (
        "AssistantPhone",
        "BusinessFax",
        "BusinessPhone",
        "BusinessPhone2",
        "Callback",
        "CarPhone",
        "CompanyMainPhone",
        "HomeFax",
        "HomePhone",
        "HomePhone2",
        "Isdn",
        "MobilePhone",
        "OtherFax",
        "OtherTelephone",
        "Pager",
        "PrimaryPhone",
        "RadioPhone",
        "Telex",
        "TtyTddPhone",
    )

    label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default="PrimaryPhone")
    phone_number = SubField(is_required=True)

Ancestors

Class variables

var ELEMENT_NAME
var FIELDS
var LABEL_CHOICES

Instance variables

var label
var phone_number

Inherited members

class PhysicalAddress (**kwargs)
Expand source code
class PhysicalAddress(MultiFieldIndexedElement):
    """MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-physicaladdress"""

    ELEMENT_NAME = "Entry"
    LABEL_CHOICES = ("Business", "Home", "Other")

    label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
    street = NamedSubField(field_uri="Street")  # Street, house number, etc.
    city = NamedSubField(field_uri="City")
    state = NamedSubField(field_uri="State")
    country = NamedSubField(field_uri="CountryOrRegion")
    zipcode = NamedSubField(field_uri="PostalCode")

    def clean(self, version=None):
        if isinstance(self.zipcode, int):
            self.zipcode = str(self.zipcode)
        super().clean(version=version)

Ancestors

Class variables

var ELEMENT_NAME
var FIELDS
var LABEL_CHOICES

Instance variables

var city
var country
var label
var state
var street
var zipcode

Methods

def clean(self, version=None)
Expand source code
def clean(self, version=None):
    if isinstance(self.zipcode, int):
        self.zipcode = str(self.zipcode)
    super().clean(version=version)

Inherited members

class SingleFieldIndexedElement (**kwargs)

Base class for all classes that implement an indexed element with a single field.

Expand source code
class SingleFieldIndexedElement(IndexedElement, metaclass=EWSMeta):
    """Base class for all classes that implement an indexed element with a single field."""

    @classmethod
    def value_field(cls, version):
        fields = cls.supported_fields(version=version)
        if len(fields) != 1:
            raise ValueError(f"Class {cls} must have only one value field (found {tuple(f.name for f in fields)})")
        return fields[0]

Ancestors

Subclasses

Static methods

def value_field(version)
Expand source code
@classmethod
def value_field(cls, version):
    fields = cls.supported_fields(version=version)
    if len(fields) != 1:
        raise ValueError(f"Class {cls} must have only one value field (found {tuple(f.name for f in fields)})")
    return fields[0]

Inherited members