/askbot/middleware/anon_user.py

https://github.com/goswami/askbot-devel
Python | 75 lines | 58 code | 1 blank | 16 comment | 5 complexity | 6e6842dbd92f134186deccc97506dbbc MD5 | raw file
  1. """middleware that allows anonymous users
  2. receive messages using the now deprecated `message_set()`
  3. interface of the user objects.
  4. To allow anonymous users accept messages, a special
  5. message manager is defined here, and :meth:`__deepcopy__()` method
  6. added to the :class:`AnonymousUser` so that user could be pickled.
  7. Secondly, it sends greeting message to anonymous users.
  8. """
  9. from askbot.user_messages import create_message, get_and_delete_messages
  10. from askbot.conf import settings as askbot_settings
  11. class AnonymousMessageManager(object):
  12. """message manager for the anonymous user"""
  13. def __init__(self, request):
  14. self.request = request
  15. def create(self, message=''):
  16. """send message to anonymous user"""
  17. create_message(self.request, message)
  18. def get_and_delete(self):
  19. """returns messages sent to the anonymous user
  20. via session, and removes messages from the session"""
  21. messages = get_and_delete_messages(self.request)
  22. return messages
  23. def dummy_deepcopy(*arg):
  24. """this is necessary to prevent deepcopy() on anonymous user object
  25. that now contains reference to request, which cannot be deepcopied
  26. """
  27. return None
  28. class ConnectToSessionMessagesMiddleware(object):
  29. """Middleware that attaches messages to anonymous users, and
  30. makes sure that anonymous user greeting is shown just once.
  31. Middleware does not do anything if the anonymous user greeting
  32. is disabled.
  33. """
  34. def process_request(self, request):
  35. """Enables anonymous users to receive messages
  36. the same way as authenticated users, and sets
  37. the anonymous user greeting, if it should be shown"""
  38. if request.user.is_anonymous():
  39. #1) Attach the ability to receive messages
  40. #plug on deepcopy which may be called by django db "driver"
  41. request.user.__deepcopy__ = dummy_deepcopy
  42. #here request is linked to anon user
  43. request.user.message_set = AnonymousMessageManager(request)
  44. request.user.get_and_delete_messages = \
  45. request.user.message_set.get_and_delete
  46. #2) set the first greeting one time per session only
  47. if 'greeting_set' not in request.session and \
  48. 'askbot_visitor' not in request.COOKIES and \
  49. askbot_settings.ENABLE_GREETING_FOR_ANON_USER:
  50. request.session['greeting_set'] = True
  51. msg = askbot_settings.GREETING_FOR_ANONYMOUS_USER
  52. request.user.message_set.create(message=msg)
  53. def process_response(self, request, response):
  54. """Adds the ``'askbot_visitor'``key to cookie if user ever
  55. authenticates so that the anonymous user message won't
  56. be shown after the user logs out"""
  57. if request.user.is_authenticated() and \
  58. 'askbot_visitor' not in request.COOKIES :
  59. #import datetime
  60. #max_age = 365*24*60*60
  61. #expires = datetime.datetime.strftime\
  62. # (datetime.datetime.utcnow() +
  63. # datetime.timedelta(seconds=max_age),\
  64. # "%a, %d-%b-%Y %H:%M:%S GMT")
  65. response.set_cookie('askbot_visitor', False)
  66. return response