views.py 3.8 KB

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