api.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from django.conf import settings
  2. from django.contrib.auth import get_user_model
  3. from django.core.exceptions import ValidationError
  4. from django.core.urlresolvers import reverse
  5. from django.http import JsonResponse
  6. from django.shortcuts import get_object_or_404
  7. from django.utils.translation import ugettext as _
  8. from django.views.decorators.debug import sensitive_post_parameters
  9. from misago.core.decorators import ajax_only, require_POST
  10. from misago.users import validators
  11. from misago.users.decorators import deny_guests
  12. def api(f):
  13. @sensitive_post_parameters("email", "password")
  14. @ajax_only
  15. @require_POST
  16. def decorator(request, *args, **kwargs):
  17. if kwargs.get('user_id'):
  18. User = get_user_model()
  19. kwargs['user'] = get_object_or_404(User, pk=kwargs.pop('user_id'))
  20. try:
  21. return JsonResponse({
  22. 'has_error': 0,
  23. 'message': f(request, *args, **kwargs),
  24. })
  25. except ValidationError as e:
  26. return JsonResponse({
  27. 'has_error': 1,
  28. 'message': unicode(e.message)
  29. })
  30. return decorator
  31. @api
  32. def validate_username(request, user=None):
  33. try:
  34. validators.validate_username(request.POST['username'],
  35. exclude=user)
  36. return _("Entered username is valid.")
  37. except KeyError:
  38. raise ValidationError(_('Enter username.'))
  39. @api
  40. def validate_email(request, user=None):
  41. try:
  42. validators.validate_email(request.POST['email'],
  43. exclude=user)
  44. return _("Entered e-mail is valid.")
  45. except KeyError:
  46. raise ValidationError(_('Enter e-mail address.'))
  47. @api
  48. def validate_password(request):
  49. try:
  50. validators.validate_password(request.POST['password'])
  51. return _("Entered password is valid.")
  52. except KeyError:
  53. raise ValidationError(_('Enter password.'))
  54. @ajax_only
  55. @require_POST
  56. @deny_guests
  57. def suggestion_engine(request):
  58. suggestions = []
  59. username = request.POST.get('username', '').lower()
  60. if len(username) > 1:
  61. User = get_user_model()
  62. queryset = User.objects.filter(slug__startswith=username)
  63. for user in queryset.order_by('slug')[:5]:
  64. avatars = {}
  65. for size in settings.MISAGO_AVATARS_SIZES:
  66. avatars[size] = reverse('misago:user_avatar', kwargs={
  67. 'size': size, 'user_id': user.pk
  68. })
  69. suggestions.append({
  70. 'avatar': avatars,
  71. 'username': user.username,
  72. 'url': user.get_absolute_url()
  73. })
  74. return JsonResponse({
  75. 'profiles': suggestions
  76. })