user.py 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. # -*- coding: utf-8 -*-
  2. import transaction
  3. from sqlalchemy.exc import IntegrityError
  4. from tracim import CFG
  5. from tracim.command import AppContextCommand
  6. from tracim.command import Extender
  7. #from tracim.lib.auth.ldap import LDAPAuth
  8. #from tracim.lib.daemons import DaemonsManager
  9. #from tracim.lib.daemons import RadicaleDaemon
  10. #from tracim.lib.email import get_email_manager
  11. from tracim.exceptions import AlreadyExistError
  12. from tracim.exceptions import CommandAbortedError
  13. from tracim.lib.core.group import GroupApi
  14. from tracim.lib.core.user import UserApi
  15. from tracim.models import User
  16. class UserCommand(AppContextCommand):
  17. ACTION_CREATE = 'create'
  18. ACTION_UPDATE = 'update'
  19. action = NotImplemented
  20. def get_description(self):
  21. return '''Create or update user.'''
  22. def get_parser(self, prog_name):
  23. parser = super().get_parser(prog_name)
  24. parser.add_argument(
  25. "-l",
  26. "--login",
  27. help='User login (email)',
  28. dest='login',
  29. required=True
  30. )
  31. parser.add_argument(
  32. "-p",
  33. "--password",
  34. help='User password',
  35. dest='password',
  36. required=False,
  37. default=None
  38. )
  39. parser.add_argument(
  40. "-g",
  41. "--add-to-group",
  42. help='Add user to group',
  43. dest='add_to_group',
  44. nargs='*',
  45. action=Extender,
  46. default=[],
  47. )
  48. parser.add_argument(
  49. "-rmg",
  50. "--remove-from-group",
  51. help='Remove user from group',
  52. dest='remove_from_group',
  53. nargs='*',
  54. action=Extender,
  55. default=[],
  56. )
  57. parser.add_argument(
  58. "--send-email",
  59. help='Send mail to user',
  60. dest='send_email',
  61. required=False,
  62. action='store_true',
  63. default=False,
  64. )
  65. return parser
  66. def _user_exist(self, login):
  67. return self._user_api.user_with_email_exists(login)
  68. def _get_group(self, name):
  69. return self._group_api.get_one_with_name(name)
  70. def _add_user_to_named_group(self, user, group_name):
  71. group = self._get_group(group_name)
  72. if user not in group.users:
  73. group.users.append(user)
  74. self._session.flush()
  75. def _remove_user_from_named_group(self, user, group_name):
  76. group = self._get_group(group_name)
  77. if user in group.users:
  78. group.users.remove(user)
  79. self._session.flush()
  80. def _create_user(self, login, password, **kwargs):
  81. if not password:
  82. if self._password_required():
  83. raise CommandAbortedError("You must provide -p/--password parameter")
  84. password = ''
  85. try:
  86. user =self._user_api.create_user(email=login)
  87. user.password = password
  88. self._user_api.save(user)
  89. # TODO - G.M - 04-04-2018 - [Caldav] Check this code
  90. # # We need to enable radicale if it not already done
  91. # daemons = DaemonsManager()
  92. # daemons.run('radicale', RadicaleDaemon)
  93. self._user_api.execute_created_user_actions(user)
  94. except IntegrityError:
  95. self._session.rollback()
  96. raise AlreadyExistError()
  97. return user
  98. def _update_password_for_login(self, login, password):
  99. user = self._user_api.get_one_by_email(login)
  100. user.password = password
  101. self._session.flush()
  102. transaction.commit()
  103. def take_app_action(self, parsed_args, app_context):
  104. # TODO - G.M - 05-04-2018 -Refactor this in order
  105. # to not setup object var outside of __init__ .
  106. self._session = app_context['request'].dbsession
  107. self._app_config = app_context['registry'].settings['CFG']
  108. self._user_api = UserApi(
  109. current_user=None,
  110. session=self._session,
  111. config=self._app_config,
  112. )
  113. self._group_api = GroupApi(
  114. current_user=None,
  115. session=self._session,
  116. )
  117. user = self._proceed_user(parsed_args)
  118. self._proceed_groups(user, parsed_args)
  119. print("User created/updated")
  120. def _proceed_user(self, parsed_args):
  121. self._check_context(parsed_args)
  122. if self.action == self.ACTION_CREATE:
  123. try:
  124. user = self._create_user(
  125. login=parsed_args.login,
  126. password=parsed_args.password
  127. )
  128. except AlreadyExistError:
  129. raise CommandAbortedError("Error: User already exist (use `user update` command instead)")
  130. # TODO - G.M - 04-04-2018 - [Email] Check this code
  131. # if parsed_args.send_email:
  132. # email_manager = get_email_manager()
  133. # email_manager.notify_created_account(
  134. # user=user,
  135. # password=parsed_args.password,
  136. # )
  137. else:
  138. if parsed_args.password:
  139. self._update_password_for_login(
  140. login=parsed_args.login,
  141. password=parsed_args.password
  142. )
  143. user = self._user_api.get_one_by_email(parsed_args.login)
  144. return user
  145. def _proceed_groups(self, user, parsed_args):
  146. # User always in "users" group
  147. self._add_user_to_named_group(user, 'users')
  148. for group_name in parsed_args.add_to_group:
  149. self._add_user_to_named_group(user, group_name)
  150. for group_name in parsed_args.remove_from_group:
  151. self._remove_user_from_named_group(user, group_name)
  152. def _password_required(self):
  153. # TODO - G.M - 04-04-2018 - [LDAP] Check this code
  154. # if config.get('auth_type') == LDAPAuth.name:
  155. # return False
  156. return True
  157. def _check_context(self, parsed_args):
  158. # TODO - G.M - 04-04-2018 - [LDAP] Check this code
  159. # if config.get('auth_type') == LDAPAuth.name:
  160. # auth_instance = config.get('auth_instance')
  161. # if not auth_instance.ldap_auth.user_exist(parsed_args.login):
  162. # raise LDAPUserUnknown(
  163. # "LDAP is enabled and user with login/email \"%s\" not found in LDAP" % parsed_args.login
  164. # )
  165. pass
  166. class CreateUserCommand(UserCommand):
  167. action = UserCommand.ACTION_CREATE
  168. class UpdateUserCommand(UserCommand):
  169. action = UserCommand.ACTION_UPDATE
  170. class LDAPUserUnknown(CommandAbortedError):
  171. pass