PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/account/util.py

https://bitbucket.org/lorien/django-account/
Python | 113 lines | 89 code | 9 blank | 15 comment | 5 complexity | ac4b75eb4a5975b0e0d253574b44cbc1 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. # -*- coding: utf-8
  2. """
  3. Useful utilities for account application.
  4. """
  5. import re
  6. import os.path
  7. from datetime import datetime
  8. import logging
  9. from django.conf import settings
  10. from django.template.loader import get_template
  11. from django.template import Context, RequestContext
  12. from django.shortcuts import render_to_response
  13. from django.core.mail import send_mail
  14. from django.conf import settings
  15. from django.contrib.sites.models import Site
  16. from django.template import TemplateDoesNotExist
  17. from django.core.mail import EmailMultiAlternatives
  18. def build_redirect_url(request, default_url):
  19. """
  20. Retrieve redirect url from session.
  21. Use default if retrieved one is broken or not safe.
  22. """
  23. url = request.session.get('login_redirect_url')
  24. if not url or '//' in url or ' ' in url:
  25. url = default_url
  26. try:
  27. del request.session['login_redirect_url']
  28. except KeyError:
  29. pass
  30. return url
  31. def parse_template(template_path, **kwargs):
  32. """
  33. Load and render template.
  34. First line of template should contain the subject of email.
  35. Return tuple with subject and content.
  36. """
  37. template = get_template(template_path)
  38. context = Context(kwargs)
  39. re_empty_lines = re.compile(r'^(\r?\n)+|(\r?\n)+$')
  40. data = template.render(context)
  41. return re_empty_lines.sub('', data)
  42. def email_template(rcpt, template_path, **kwargs):
  43. """
  44. Load, render and email template.
  45. Template_path should not contain .txt or .html suffixes - they
  46. will be appended automatically.
  47. **kwargs may contain variables for template rendering.
  48. """
  49. from_email = settings.DEFAULT_FROM_EMAIL
  50. subject = parse_template('%s_subject.txt' % template_path, **kwargs)
  51. text_content = parse_template('%s_body.txt' % template_path, **kwargs)
  52. try:
  53. html_content = parse_template('%s_body.html' % template_path, **kwargs)
  54. except TemplateDoesNotExist:
  55. html_content = None
  56. # TODO remove after debugging
  57. # print text_content
  58. msg = EmailMultiAlternatives(subject, text_content, from_email, [rcpt])
  59. if html_content:
  60. msg.attach_alternative(html_content, "text/html")
  61. return bool(msg.send(fail_silently=True))
  62. def render_to(template_path):
  63. """
  64. Decorate the django view.
  65. Wrap view that return dict of variables, that should be used for
  66. rendering the template.
  67. """
  68. def decorator(func):
  69. def wrapper(request, *args, **kwargs):
  70. output = func(request, *args, **kwargs)
  71. if not isinstance(output, dict):
  72. return output
  73. ctx = RequestContext(request)
  74. return render_to_response(template_path, output,
  75. context_instance=ctx)
  76. return wrapper
  77. return decorator
  78. def load_class(path):
  79. from django.db.models.loading import get_app
  80. module_path, class_name = path.rsplit('.', 1)
  81. mod = __import__(module_path, globals(), locals(), ['foobar'])
  82. return getattr(mod, class_name)
  83. def build_absolute_url(url):
  84. return 'http://%s%s' % (Site.objects.get_current().domain, url)