memoQSecurity.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. from suds.client import Client
  2. import hashlib
  3. import json
  4. class Group(object):
  5. """Wrapper for group."""
  6. def __init__(self, group_info=None):
  7. self.info = group_info
  8. def __repr__(self):
  9. if self.info != None:
  10. return "{} - {}".format(self.info.GroupName, self.info.GroupGuid)
  11. else:
  12. return "No group!"
  13. class User(object):
  14. """Wrapper for user."""
  15. def __init__(self, user_info=None):
  16. self.info = user_info
  17. def valid_user_info(self):
  18. """ Returns true if given user_info has all required attributes."""
  19. required_attributes = ["EmailAddress", "FullName",
  20. "Password", "UserName", "PackageWorkflowType", "UserGuid"]
  21. for attribute in required_attributes:
  22. if not hasattr(self.info, attribute):
  23. return False
  24. return True
  25. def __repr__(self):
  26. if self.info != None:
  27. return "{} - {}".format(self.info.FullName, self.info.UserGuid)
  28. else:
  29. return "No user!"
  30. class MemoQSecurity(object):
  31. """Client for memoQ Security API."""
  32. def __init__(self):
  33. with open("config.json") as json_file:
  34. self.config = json.load(json_file)
  35. if self.config["api_base_url"] != "":
  36. api_url = self.config["api_base_url"] + \
  37. "/memoqservices/security?wsdl"
  38. self.client = Client(api_url)
  39. self.user = User()
  40. self.users = []
  41. self.groups = None
  42. self.subvendors = None
  43. def __repr__(self):
  44. return "{}".format(self.user)
  45. def set_active_user(self, guid):
  46. """Sets user of given guid as active."""
  47. self.user = User(self.client.service.GetUser(guid))
  48. def get_users(self):
  49. """Gets list of users from the server into users field."""
  50. self.users = [User(x) for x in self.client.service.ListUsers()[0]]
  51. def user_by_name(self, username):
  52. """ Returns list of users of given fullname (can be partial) from users field."""
  53. if not len(self.users):
  54. self.get_users()
  55. return [x for x in self.users if username in x.info.FullName]
  56. def not_empty_user_info(self):
  57. """Validates user info of active user. Returns true on success."""
  58. if self.user.valid_user_info():
  59. if self.user.info.EmailAddress != None \
  60. and self.user.info.FullName != None \
  61. and self.user.info.Password != None \
  62. and self.user.info.UserName != None \
  63. and self.user.info.PackageWorkflowType != None:
  64. return True
  65. return False
  66. def set_password(self, password):
  67. """Hashes and sets password for active user."""
  68. if self.user.info != None and password != "":
  69. salt = 'fgad s d f sgds g sdg gfdg'
  70. to_hash = (password + salt).encode('utf-8')
  71. self.user.info.Password = str(
  72. hashlib.sha1(to_hash).hexdigest()).upper()
  73. def new_user(self):
  74. """ Sets empty user info as active user (package workflow = online).
  75. For further user creation."""
  76. self.user = User(self.client.factory.create(
  77. '{http://kilgray.com/memoqservices/2007}UserInfo'))
  78. package_workflow = self.client.factory.create(
  79. '{http://schemas.datacontract.org/2004/07/MemoQServices}UserPackageWorkflowType')
  80. self.user.info.PackageWorkflowType.value = package_workflow.Online
  81. def create_user(self):
  82. """ Creates new user on server from active user. Returns guid."""
  83. if self.not_empty_user_info():
  84. guid = self.client.service.CreateUser(self.user.info)
  85. if guid != None:
  86. self.set_active_user(guid)
  87. return guid
  88. def update_user(self):
  89. """ Updates user info on server. Returns true on success."""
  90. if self.not_empty_user_info():
  91. self.client.service.UpdateUser(self.user.info)
  92. return True
  93. return False
  94. def delete_user(self):
  95. """ Deletes active user. Dangerous! Returns true on success."""
  96. if self.user != None and self.user.valid_user_info() and self.user.info.UserGuid != None:
  97. self.client.service.DeleteUser(self.user.info.UserGuid)
  98. return True
  99. return False
  100. def get_groups(self):
  101. """ Gets list of groups from the server into groups field."""
  102. self.groups = [Group(x) for x in self.client.service.ListGroups()[0]]
  103. def group_by_name(self, groupname):
  104. """ Returns list of groups of given group name (can be partial) from groups field."""
  105. if self.groups == None:
  106. self.get_groups()
  107. return [x for x in self.groups if groupname in x.info.GroupName]
  108. def get_subvendors(self):
  109. """ Gets list of subvendor groups from the server into subvendors field."""
  110. self.subvendors = [
  111. Group(x) for x in self.client.service.ListSubvendorGroups()[0]]
  112. def subvendor_by_name(self, groupname):
  113. """ Returns list of subvendor groups of given group name (can be partial) from subvendors field."""
  114. if self.subvendors == None:
  115. self.get_subvendors()
  116. return [x for x in self.subvendors if groupname in x.info.GroupName]
  117. def users_of_group(self, guid):
  118. """Returns list of users of group of given guid."""
  119. if guid == None:
  120. return []
  121. try:
  122. users = [User(x)
  123. for x in self.client.service.ListUsersOfGroup(guid)[0]]
  124. return users
  125. except:
  126. return []
  127. def add_current_user_to_group(self, group_guid):
  128. """Adds current user to group of given guid. Returns true on success."""
  129. if self.user != None and self.user.valid_user_info() and group_guid != None:
  130. group_users = self.users_of_group(group_guid)
  131. if len(group_users):
  132. new_users_guids = self.client.factory.create(
  133. '{http://kilgray.com/memoqservices/2007}userGuids')
  134. new_users_guids.guid = [
  135. user.info.UserGuid for user in group_users]
  136. new_users_guids.guid.append(self.user.info.UserGuid)
  137. if len(new_users_guids):
  138. try:
  139. self.client.service.SetUsersOfGroup(
  140. group_guid, new_users_guids)
  141. return True
  142. except:
  143. return False
  144. return False
  145. def remove_current_user_from_group(self, group_guid):
  146. """Removes current user from group of given guid. Returns true on success."""
  147. if self.user != None and self.user.valid_user_info() and group_guid != None:
  148. group_users = self.users_of_group(group_guid)
  149. if len(group_users) and len([x for x in group_users if x.info.UserGuid == self.user.info.UserGuid]):
  150. new_users_guids = self.client.factory.create(
  151. '{http://kilgray.com/memoqservices/2007}userGuids')
  152. new_users_guids.guid = [
  153. user.info.UserGuid for user in group_users if user.info.UserGuid != self.user.info.UserGuid]
  154. if len(new_users_guids):
  155. try:
  156. self.client.service.SetUsersOfGroup(
  157. group_guid, new_users_guids)
  158. return True
  159. except:
  160. return False
  161. return False