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
23 changes: 21 additions & 2 deletions membersuite_api_client/exceptions.py
Original file line number Diff line number Diff line change
@@ -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"
23 changes: 23 additions & 0 deletions membersuite_api_client/models.py
Original file line number Diff line number Diff line change
@@ -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 ("<MemberSuiteObject: ID: {id}>".format(id=self.id))
72 changes: 46 additions & 26 deletions membersuite_api_client/security/models.py
Original file line number Diff line number Diff line change
@@ -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 ("<PortalUser: ID: {id}, email_address: {email_address}, "
"first_name: {first_name}, last_name: {last_name}, "
"owner: {owner}, session_id: {session_id}>".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)
Expand All @@ -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 ("<Individual: ID: {id}, email_address: {email_address}, "
"first_name: {first_name}, last_name: {last_name}>".format(
id=self.id,
email_address=self.email_address,
first_name=self.first_name,
last_name=self.last_name))
2 changes: 1 addition & 1 deletion membersuite_api_client/security/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
16 changes: 16 additions & 0 deletions membersuite_api_client/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
future==0.16.0
lxml==3.7.0
zeep==0.23.0
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down