user.py 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # -*- coding: utf-8 -*-
  2. import threading
  3. import transaction
  4. import typing as typing
  5. from tracim.models.auth import User
  6. # TODO - G.M -28-03-2018 - [CurrentUser][auth]
  7. # Check if "current user" stuff is always needed for tracimv2
  8. # CURRENT_USER_WEB = 'WEB'
  9. # CURRENT_USER_WSGIDAV = 'WSGIDAV'
  10. class UserApi(object):
  11. def __init__(self, current_user: typing.Optional[User], session, config):
  12. self._session = session
  13. self._user = current_user
  14. self._config = config
  15. def get_all(self):
  16. return self._session.query(User).order_by(User.display_name).all()
  17. def _base_query(self):
  18. return self._session.query(User)
  19. def get_one(self, user_id: int):
  20. return self._base_query().filter(User.user_id==user_id).one()
  21. def get_one_by_email(self, email: str):
  22. return self._base_query().filter(User.email==email).one()
  23. def get_one_by_id(self, id: int) -> User:
  24. return self._base_query().filter(User.user_id==id).one()
  25. def update(
  26. self,
  27. user: User,
  28. name: str=None,
  29. email: str=None,
  30. do_save=True,
  31. timezone: str='',
  32. ):
  33. if name is not None:
  34. user.display_name = name
  35. if email is not None:
  36. user.email = email
  37. user.timezone = timezone
  38. if do_save:
  39. self.save(user)
  40. if email and self._user and user.user_id==self._user.user_id:
  41. pass
  42. # this is required for the _session to keep on being up-to-date
  43. # TODO - G.M - 28-03-2018 -
  44. # [CurrentUser] Check for pyramid equivalent
  45. # tg.request.identity['repoze.who.userid'] = email
  46. # tg.auth_force_login(email)
  47. def user_with_email_exists(self, email: str):
  48. try:
  49. self.get_one_by_email(email)
  50. return True
  51. except:
  52. return False
  53. def create_user(self, email=None, groups=[], save_now=False) -> User:
  54. user = User()
  55. if email:
  56. user.email = email
  57. for group in groups:
  58. user.groups.append(group)
  59. self._session.add(user)
  60. if save_now:
  61. self._session.flush()
  62. return user
  63. def save(self, user: User):
  64. self._session.flush()
  65. def execute_created_user_actions(self, created_user: User) -> None:
  66. """
  67. Execute actions when user just been created
  68. :return:
  69. """
  70. # NOTE: Cyclic import
  71. # TODO - G.M - 28-03-2018 - [Calendar] Reenable Calendar stuff
  72. #from tracim.lib.calendar import CalendarManager
  73. #from tracim.model.organisational import UserCalendar
  74. # TODO - G.M - 04-04-2018 - [auth]
  75. # Check if this is already needed with
  76. # new auth system
  77. created_user.ensure_auth_token(
  78. session=self._session,
  79. validity_seconds=self._config.USER_AUTH_TOKEN_VALIDITY
  80. )
  81. # Ensure database is up-to-date
  82. self._session.flush()
  83. transaction.commit()
  84. # TODO - G.M - 28-03-2018 - [Calendar] Reenable Calendar stuff
  85. # calendar_manager = CalendarManager(created_user)
  86. # calendar_manager.create_then_remove_fake_event(
  87. # calendar_class=UserCalendar,
  88. # related_object_id=created_user.user_id,
  89. # )
  90. # TODO - G.M - 28-03-2018 - [CurrentUser][auth] Check for pyramid equivalent
  91. # class CurrentUserGetterInterface(object):
  92. # def get_current_user(self) -> typing.Union[None, User]:
  93. # raise NotImplementedError()
  94. #
  95. #
  96. # class BaseCurrentUserGetter(CurrentUserGetterInterface):
  97. # def __init__(self) -> None:
  98. # self.api = UserApi(None)
  99. # class WebCurrentUserGetter(BaseCurrentUserGetter):
  100. # def get_current_user(self) -> typing.Union[None, User]:
  101. # # HACK - D.A. - 2015-09-02
  102. # # In tests, the tg.request.identity may not be set
  103. # # (this is a buggy case, but for now this is how the software is;)
  104. # if tg.request is not None:
  105. # if hasattr(tg.request, 'identity'):
  106. # if tg.request.identity is not None:
  107. # return self.api.get_one_by_email(
  108. # tg.request.identity['repoze.who.userid'],
  109. # )
  110. #
  111. # return None
  112. # TODO - G.M - 28-03-2018 - [Webdav] Reenable Webdav stuff
  113. # class WsgidavCurrentUserGetter(BaseCurrentUserGetter):
  114. # def get_current_user(self) -> typing.Union[None, User]:
  115. # if hasattr(cherrypy.request, 'current_user_email'):
  116. # return self.api.get_one_by_email(
  117. # cherrypy.request.current_user_email,
  118. # )
  119. #
  120. # return None
  121. # class CurrentUserGetterApi(object):
  122. # thread_local = threading.local()
  123. # matches = {
  124. # CURRENT_USER_WEB: WebCurrentUserGetter,
  125. # CURRENT_USER_WSGIDAV: WsgidavCurrentUserGetter,
  126. # }
  127. # default = CURRENT_USER_WEB
  128. #
  129. # @classmethod
  130. # def get_current_user(cls) -> User:
  131. # try:
  132. # return cls.thread_local.getter.get_current_user()
  133. # except AttributeError:
  134. # return cls.factory(cls.default).get_current_user()
  135. #
  136. # @classmethod
  137. # def set_thread_local_getter(cls, name) -> None:
  138. # if not hasattr(cls.thread_local, 'getter'):
  139. # cls.thread_local.getter = cls.factory(name)
  140. #
  141. # @classmethod
  142. # def factory(cls, name: str) -> CurrentUserGetterInterface:
  143. # return cls.matches[name]()