diff --git a/membersuite_api_client/exceptions.py b/membersuite_api_client/exceptions.py index 3983e21..e8aa1a4 100644 --- a/membersuite_api_client/exceptions.py +++ b/membersuite_api_client/exceptions.py @@ -1,11 +1,30 @@ +from __future__ import (absolute_import, division, print_function, + unicode_literals) +from future.utils import python_2_unicode_compatible + + +@python_2_unicode_compatible class MemberSuiteAPIError(Exception): + def __init__(self, result): self.result = result + def __str__(self): + concierge_error = self.get_concierge_error() + return "<{classname} ConciergeError: {concierge_error}>".format( + classname=self.__class__.__name__, + concierge_error=concierge_error) + + def get_concierge_error(self): + return (self.result["body"][self.result_type] + ["Errors"]["ConciergeError"]) + class LoginToPortalError(MemberSuiteAPIError): - pass + + result_type = "LoginToPortalResult" class ExecuteMSQLError(MemberSuiteAPIError): - pass + + result_type = "ExecuteMSQLResult" diff --git a/membersuite_api_client/models.py b/membersuite_api_client/models.py new file mode 100644 index 0000000..3b67238 --- /dev/null +++ b/membersuite_api_client/models.py @@ -0,0 +1,23 @@ +from __future__ import (absolute_import, division, print_function, + unicode_literals) +from future.utils import python_2_unicode_compatible + +from .utils import convert_ms_object + + +@python_2_unicode_compatible +class MemberSuiteObject(object): + + def __init__(self, membersuite_object_data): + """Takes the Zeep'ed XML Representation of a MemberSuiteObject as + input. + + """ + self.fields = convert_ms_object( + membersuite_object_data["Fields"]["KeyValueOfstringanyType"]) + + self.id = self.fields["ID"] + self.extra_data = membersuite_object_data + + def __str__(self): + return ("".format(id=self.id)) diff --git a/membersuite_api_client/security/models.py b/membersuite_api_client/security/models.py index fdf1628..f99603e 100644 --- a/membersuite_api_client/security/models.py +++ b/membersuite_api_client/security/models.py @@ -1,27 +1,39 @@ -from membersuite_api_client.utils import convert_ms_object -from membersuite_api_client.exceptions import ExecuteMSQLError +from __future__ import (absolute_import, division, print_function, + unicode_literals) +from future.utils import python_2_unicode_compatible +from ..exceptions import ExecuteMSQLError +from ..models import MemberSuiteObject +from ..utils import convert_ms_object -class PortalUser(object): - def __init__(self, portal_user, session_id=None): +@python_2_unicode_compatible +class PortalUser(MemberSuiteObject): + + def __init__(self, membersuite_object_data, session_id=None): """Create a PortalUser object from a the Zeep'ed XML representation of a Membersuite PortalUser. """ - fields = convert_ms_object(portal_user["Fields"] - ["KeyValueOfstringanyType"]) - - self.id = fields["ID"] - self.email_address = fields["EmailAddress"] - self.first_name = fields["FirstName"] - self.last_name = fields["LastName"] - - self.owner = fields["Owner"] + super(PortalUser, self).__init__( + membersuite_object_data=membersuite_object_data) + self.email_address = self.fields["EmailAddress"] + self.first_name = self.fields["FirstName"] + self.last_name = self.fields["LastName"] + self.owner = self.fields["Owner"] self.session_id = session_id - self.extra_data = portal_user + def __str__(self): + return ("".format( + id=self.id, + email_address=self.email_address, + first_name=self.first_name, + last_name=self.last_name, + owner=self.owner, + session_id=self.session_id)) def get_username(self): return "_membersuite_id_{}".format(self.id) @@ -41,27 +53,35 @@ def get_individual(self, client): msql_result = result["body"]["ExecuteMSQLResult"] if msql_result["Success"]: - individual = msql_result["ResultValue"]["SingleObject"] - return Individual(individual=individual, portal_user=self) + membersuite_object_data = (msql_result["ResultValue"] + ["SingleObject"]) + return Individual(membersuite_object_data=membersuite_object_data, + portal_user=self) else: raise ExecuteMSQLError(result=result) -class Individual(object): +@python_2_unicode_compatible +class Individual(MemberSuiteObject): - def __init__(self, individual, portal_user=None): + def __init__(self, membersuite_object_data, portal_user=None): """Create an Individual object from the Zeep'ed XML representation of a MemberSuite Individual. """ - fields = convert_ms_object(individual["Fields"] - ["KeyValueOfstringanyType"]) + super(Individual, self).__init__( + membersuite_object_data=membersuite_object_data) - self.id = fields["ID"] - self.email_address = fields["EmailAddress"] - self.first_name = fields["FirstName"] - self.last_name = fields["LastName"] - - self.extra_data = individual + self.email_address = self.fields["EmailAddress"] + self.first_name = self.fields["FirstName"] + self.last_name = self.fields["LastName"] self.portal_user = portal_user + + def __str__(self): + return ("".format( + id=self.id, + email_address=self.email_address, + first_name=self.first_name, + last_name=self.last_name)) diff --git a/membersuite_api_client/security/services.py b/membersuite_api_client/security/services.py index 5ccc14c..b048ea4 100644 --- a/membersuite_api_client/security/services.py +++ b/membersuite_api_client/security/services.py @@ -29,7 +29,7 @@ def login_to_portal(username, password, client): session_id = get_session_id(result=result) - return PortalUser(portal_user=portal_user, + return PortalUser(membersuite_object_data=portal_user, session_id=session_id) else: raise LoginToPortalError(result=result) diff --git a/membersuite_api_client/utils.py b/membersuite_api_client/utils.py index a0c74b5..590a1fd 100644 --- a/membersuite_api_client/utils.py +++ b/membersuite_api_client/utils.py @@ -18,3 +18,19 @@ def get_session_id(result): return result["header"]["header"]["SessionId"] except TypeError: return None + + +def membersuite_object_factory(membersuite_object_data): + from .models import MemberSuiteObject + import membersuite_api_client.security.models as security_models + + klasses = {"Individual": security_models.Individual, + "PortalUser": security_models.PortalUser} + + try: + klass = klasses[membersuite_object_data["ClassType"]] + except KeyError: + return MemberSuiteObject( + membersuite_object_data=membersuite_object_data) + else: + return klass(membersuite_object_data=membersuite_object_data) diff --git a/requirements.txt b/requirements.txt index 3b1cdb5..81275a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ +future==0.16.0 lxml==3.7.0 zeep==0.23.0 diff --git a/setup.py b/setup.py index eb20a01..d25bd63 100644 --- a/setup.py +++ b/setup.py @@ -7,6 +7,7 @@ def read(fname): return open(os.path.join(os.path.dirname(__file__), fname)).read() + setup(name='membersuite_api_client', version='0.1.3', description='MemberSuite API Client',