form.html 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. {% extends "misago/base.html" %}
  2. {% load i18n misago_capture misago_forms staticfiles %}
  3. {% block title %}
  4. {% trans "Register" %} | {{ block.super }}
  5. {% endblock title %}
  6. {% block content %}
  7. <div class="container">
  8. <div class="row">
  9. <div class="col-md-8 col-md-offset-2">
  10. <div class="form-panel">
  11. <form method="POST" role="form" class="form-horizontal">
  12. {% csrf_token %}
  13. <div class="form-header">
  14. <h1>{% trans "Register new account" %}</h1>
  15. </div>
  16. {% include "misago/form_errors.html" %}
  17. <div class="form-body no-fieldsets">
  18. {% with label_class="col-md-3" field_class="col-md-9" %}
  19. {% for field, api_link in form.api_fields %}
  20. <div class="form-group has-api-validation has-feedback" data-validation-api="{% url api_link %}" data-validation-value="{{ field.name }}">
  21. <label class="control-label {{ label_class }}" for="{{ field.auto_id }}">{{ field.label }}:</label>
  22. <div class="{{ field_class }}">
  23. {% form_input field %}
  24. <span class="fa fa-asterisk form-control-feedback"></span>
  25. <div class="control-message hide fade">
  26. <p class="help-block">
  27. <strong></strong>
  28. </p>
  29. </div>
  30. </div>
  31. </div>
  32. {% endfor %}
  33. <div class="form-group">
  34. <label class="control-label {{ label_class }}" >{% trans "Password strength" %}:</label>
  35. <div class="col-md-5 form-control-static">
  36. <p class="password-strength"><strong id="password-strength"></strong></p>
  37. <div class="progress">
  38. <div id="password-bar" class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div>
  39. </div>
  40. </div>
  41. </div>
  42. {% if form.has_qa_captcha %}
  43. <div class="form-group has-feedback {% if form.qa_answer.errors %}has-error{% endif %}">
  44. <label class="control-label {{ label_class }}" for="{{ form.qa_answer.auto_id }}">{{ form.qa_answer.label }}:</label>
  45. <div class="{{ field_class }}">
  46. {% form_input form.qa_answer %}
  47. <span class="fa fa-{% if form.qa_answer.errors %}times{% else%}asterisk{% endif %} form-control-feedback"></span>
  48. {% if form.qa_answer.errors %}
  49. <div class="control-errors">
  50. {% for error in form.qa_answer.errors %}
  51. <p class="help-block">
  52. <strong>{{ error }}</strong>
  53. </p>
  54. {% endfor %}
  55. </div>
  56. {% endif %}
  57. {% if form.qa_answer.help_text %}
  58. <p class="help-block">{{ form.qa_answer.help_text }}</p>
  59. {% endif %}
  60. </div>
  61. </div>
  62. {% endif %}
  63. {% endwith %}
  64. </div>
  65. <div class="form-footer">
  66. <div class="row">
  67. <div class="col-md-9 col-md-offset-3">
  68. <button class="btn btn-primary">{% trans "Register account" %}</button>
  69. {% if misago_settings.terms_of_service or misago_settings.terms_of_service_link %}
  70. <div class="extra">
  71. {% capture trimmed as tos_link %}
  72. <a href="{% url 'misago:terms_of_service' %}" target="_blank">{% trans 'our terms of service' %}</a>
  73. {% endcapture %}
  74. <p>
  75. <strong>
  76. <span class="fa fa-exclamation-circle"></span>
  77. {% trans "Notice:" %}
  78. </strong>
  79. {% blocktrans trimmed with tos=tos_link|safe %}
  80. By clicking the button above you accept {{ tos }}.
  81. {% endblocktrans %}
  82. </p>
  83. </div>
  84. {% endif %}
  85. </div>
  86. </div>
  87. </div>
  88. </form>
  89. </div>
  90. </div>
  91. </div>
  92. </div>
  93. {% endblock content %}
  94. {% block javascripts %}
  95. {{ block.super }}
  96. <script type="text/javascript">
  97. // API-based validation
  98. var csrf_token = $('input[name="csrfmiddlewaretoken"]').val()
  99. $('.has-api-validation').each(function() {
  100. var $control = $(this);
  101. var $input = $control.find('input');
  102. var $icon = $(this).find('.fa');
  103. var $control_message = $(this).find('.control-message');
  104. var api_url = $(this).data('validation-api');
  105. var api_value = $(this).data('validation-value');
  106. function validate() {
  107. var data = {csrfmiddlewaretoken: csrf_token};
  108. data[api_value] = $.trim($input.val());
  109. $.post(api_url, data, function(data, textStatus, jqXHR) {
  110. $control_message.find('strong').text(data.message);
  111. if (data.has_error) {
  112. $control.attr('class', 'form-group has-api-validation has-feedback has-error');
  113. $icon.attr('class', 'fa fa-times form-control-feedback');
  114. $control_message.attr('class', 'control-errors fade in')
  115. } else {
  116. $control.attr('class', 'form-group has-api-validation has-feedback has-success');
  117. $icon.attr('class', 'fa fa-check form-control-feedback');
  118. $control_message.attr('class', 'control-success fade in')
  119. }
  120. });
  121. }
  122. {% if form.is_bound %}
  123. validate();
  124. {% endif %}
  125. $input.keyup(validate);
  126. });
  127. // Password strength
  128. var zxcvbn_src = "{% static "misago/js/zxcvbn.js" %}";
  129. var labels = ["{% trans "Very weak" %}", "{% trans "Weak" %}", "{% trans "Medium" %}", "{% trans "Good" %}", "{% trans "Strong" %}"];
  130. var label_styles = ["text-danger", "text-warning", "text-warning", "text-info", "text-success"];
  131. var bar_styles = ["", "progress-bar-warning", "progress-bar-warning", "progress-bar-info", "progress-bar-success"];
  132. function zxcvbn_load_hook() {
  133. $(function() {
  134. var $bar = $('#password-bar');
  135. var $label = $('#password-strength');
  136. function gradePassStrength() {
  137. var username = $('#id_username').val();
  138. var email = $('#id_email').val();
  139. var password = $('#id_password').val();
  140. var power = zxcvbn(password, [username, email]).score;
  141. $label.text(labels[power]);
  142. $label.attr('class', label_styles[power]);
  143. $bar.css('width', ((power + 1) * 20) + '%');
  144. $bar.attr('class', "progress-bar " + bar_styles[power]);
  145. }
  146. gradePassStrength();
  147. $('#id_password').keyup(gradePassStrength);
  148. });
  149. }
  150. </script>
  151. <script type="text/javascript" src="{% static "misago/js/zxcvbn-async.js" %}"></script>
  152. {% endblock javascripts %}