views.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from datetime import timedelta
  2. from django.core.urlresolvers import reverse
  3. from django.db.models import F
  4. from django.shortcuts import redirect
  5. from django.utils import timezone
  6. from django.utils.translation import ugettext as _
  7. from misago.alerts.models import Alert
  8. from misago.authn.decorators import block_guest
  9. from misago.forms import FormLayout
  10. from misago.messages import Message
  11. from misago.users.models import User
  12. from misago.usercp.template import RequestContext
  13. from misago.usercp.models import UsernameChange
  14. from misago.usercp.username.forms import UsernameChangeForm
  15. from misago.views import error404
  16. from misago.utils import ugettext_lazy
  17. @block_guest
  18. def username(request):
  19. if not request.acl.usercp.show_username_change():
  20. return error404(request)
  21. changes_left = request.acl.usercp.changes_left(request.user)
  22. next_change = None
  23. if request.acl.usercp.changes_expire() and not changes_left:
  24. next_change = request.user.namechanges.filter(
  25. date__gte=timezone.now() - timedelta(days=request.acl.usercp.acl['changes_expire']),
  26. ).order_by('-date')[0]
  27. next_change = next_change.date + timedelta(days=request.acl.usercp.acl['changes_expire'])
  28. message = request.messages.get_message('usercp_username')
  29. if request.method == 'POST':
  30. if changes_left:
  31. message = Message(_("You have exceeded the maximum number of name changes."), 'error')
  32. form = UsernameChangeForm(request=request)
  33. else:
  34. org_username = request.user.username
  35. form = UsernameChangeForm(request.POST, request=request)
  36. if form.is_valid():
  37. request.user.set_username(form.cleaned_data['username'])
  38. request.user.save(force_update=True)
  39. request.user.namechanges.create(date=timezone.now(), old_username=org_username)
  40. request.messages.set_flash(Message(_("Your username has been changed.")), 'success', 'usercp_username')
  41. # Alert followers of namechange
  42. alert_time = timezone.now()
  43. bulk_alerts = []
  44. alerted_users = []
  45. for follower in request.user.follows_set.iterator():
  46. alerted_users.append(follower.pk)
  47. alert = Alert(user=follower, message=ugettext_lazy("User that you are following, %(username)s, has changed his name to %(newname)s").message, date=alert_time)
  48. alert.strong('username', org_username)
  49. alert.profile('newname', request.user)
  50. alert.hydrate()
  51. bulk_alerts.append(alert)
  52. if bulk_alerts:
  53. Alert.objects.bulk_create(bulk_alerts)
  54. User.objects.filter(id__in=alerted_users).update(alerts=F('alerts') + 1)
  55. # Hop back
  56. return redirect(reverse('usercp_username'))
  57. message = Message(form.non_field_errors()[0], 'error')
  58. else:
  59. form = UsernameChangeForm(request=request)
  60. return request.theme.render_to_response('usercp/username.html',
  61. context_instance=RequestContext(request, {
  62. 'message': message,
  63. 'changes_left': changes_left,
  64. 'form': FormLayout(form),
  65. 'next_change': next_change,
  66. 'changes_history': request.user.namechanges.order_by('-date')[:10],
  67. 'tab': 'username',
  68. }));