form.html 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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 thin">
  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_recaptcha %}
  43. <div class="form-group {% if form.recaptcha.errors %}has-error{% endif %}">
  44. <label class="control-label {{ label_class }}" for="{{ form.recaptcha.auto_id }}">{{ form.recaptcha.label }}:</label>
  45. <div class="{{ field_class }}">
  46. {{ form.recaptcha_html|safe }}
  47. {% if form.recaptcha.errors %}
  48. <div class="control-errors">
  49. {% for error in form.recaptcha.errors %}
  50. <p class="help-block">
  51. <strong>{{ error }}</strong>
  52. </p>
  53. {% endfor %}
  54. </div>
  55. {% endif %}
  56. {% if form.recaptcha.help_text %}
  57. <p class="help-block">{{ form.recaptcha.help_text }}</p>
  58. {% endif %}
  59. </div>
  60. </div>
  61. {% elif form.passed_recaptcha %}
  62. <div class="form-group has-success">
  63. <label class="control-label {{ label_class }}">{{ form.recaptcha.label }}:</label>
  64. <div class="{{ field_class }} form-control-static text-success">
  65. <p>
  66. <span class="fa fa-check"></span>
  67. <strong>{% trans "Ok!" %}</strong>
  68. {% trans "Text from image was correct!" %}
  69. </p>
  70. </div>
  71. </div>
  72. {% endif %}
  73. {% if form.has_qa_captcha %}
  74. <div class="form-group has-feedback {% if form.qa_answer.errors %}has-error{% endif %}">
  75. <label class="control-label {{ label_class }}" for="{{ form.qa_answer.auto_id }}">{{ form.qa_answer.label }}:</label>
  76. <div class="{{ field_class }}">
  77. {% form_input form.qa_answer %}
  78. <span class="fa fa-{% if form.qa_answer.errors %}times{% else%}asterisk{% endif %} form-control-feedback"></span>
  79. {% if form.qa_answer.errors %}
  80. <div class="control-errors">
  81. {% for error in form.qa_answer.errors %}
  82. <p class="help-block">
  83. <strong>{{ error }}</strong>
  84. </p>
  85. {% endfor %}
  86. </div>
  87. {% endif %}
  88. {% if form.qa_answer.help_text %}
  89. <p class="help-block">{{ form.qa_answer.help_text }}</p>
  90. {% endif %}
  91. </div>
  92. </div>
  93. {% elif form.passed_qa_captcha %}
  94. <div class="form-group has-success">
  95. <label class="control-label {{ label_class }}">{{ form.qa_answer.label }}:</label>
  96. <div class="{{ field_class }} form-control-static text-success">
  97. <p>
  98. <span class="fa fa-check"></span>
  99. <strong>{% trans "Ok!" %}</strong>
  100. {% trans "Your answer was correct!" %}
  101. </p>
  102. </div>
  103. </div>
  104. {% endif %}
  105. {% endwith %}
  106. </div>
  107. <div class="form-footer">
  108. <div class="row">
  109. <div class="col-md-9 col-md-offset-3">
  110. <button class="btn btn-primary">{% trans "Register account" %}</button>
  111. {% if misago_settings.terms_of_service or misago_settings.terms_of_service_link %}
  112. <div class="extra">
  113. {% capture trimmed as tos_link %}
  114. <a href="{% url 'misago:terms_of_service' %}" target="_blank">{% trans 'our terms of service' %}</a>
  115. {% endcapture %}
  116. <p>
  117. <strong>
  118. <span class="fa fa-exclamation-circle"></span>
  119. {% trans "Notice:" %}
  120. </strong>
  121. {% blocktrans trimmed with tos=tos_link|safe %}
  122. By clicking the button above you accept {{ tos }}.
  123. {% endblocktrans %}
  124. </p>
  125. </div>
  126. {% endif %}
  127. </div>
  128. </div>
  129. </div>
  130. </form>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. {% endblock content %}
  136. {% block javascripts %}
  137. {{ block.super }}
  138. <script type="text/javascript">
  139. // Password strength
  140. var zxcvbn_src = "{% static "misago/js/zxcvbn.js" %}";
  141. var labels = ["{% trans "Very weak" %}", "{% trans "Weak" %}", "{% trans "Medium" %}", "{% trans "Good" %}", "{% trans "Strong" %}"];
  142. var label_styles = ["text-danger", "text-warning", "text-warning", "text-info", "text-success"];
  143. var bar_styles = ["progress-bar-danger", "progress-bar-warning", "progress-bar-warning", "progress-bar-info", "progress-bar-success"];
  144. function zxcvbn_load_hook() {
  145. $(function() {
  146. var $bar = $('#password-bar');
  147. var $label = $('#password-strength');
  148. function gradePassStrength() {
  149. var username = $('#id_username').val();
  150. var email = $('#id_email').val();
  151. var password = $('#id_password').val();
  152. var power = zxcvbn(password, [username, email]).score;
  153. $label.text(labels[power]);
  154. $label.attr('class', label_styles[power]);
  155. $bar.css('width', ((power + 1) * 20) + '%');
  156. $bar.attr('class', "progress-bar " + bar_styles[power]);
  157. }
  158. gradePassStrength();
  159. $('#id_password').keyup(gradePassStrength);
  160. });
  161. }
  162. $(function () {
  163. // API-based validation
  164. var csrf_token = $('input[name="csrfmiddlewaretoken"]').val()
  165. $('.has-api-validation').each(function() {
  166. var $control = $(this);
  167. var $input = $control.find('input');
  168. var $icon = $(this).find('.fa');
  169. var $control_message = $(this).find('.control-message');
  170. var api_url = $(this).data('validation-api');
  171. var api_value = $(this).data('validation-value');
  172. function validate() {
  173. var data = {csrfmiddlewaretoken: csrf_token};
  174. data[api_value] = $.trim($input.val());
  175. $.post(api_url, data, function(data, textStatus, jqXHR) {
  176. $control_message.find('strong').text(data.message);
  177. if (data.has_error) {
  178. $control.attr('class', 'form-group has-api-validation has-feedback has-error');
  179. $icon.attr('class', 'fa fa-times form-control-feedback');
  180. $control_message.attr('class', 'control-errors fade in')
  181. } else {
  182. $control.attr('class', 'form-group has-api-validation has-feedback has-success');
  183. $icon.attr('class', 'fa fa-check form-control-feedback');
  184. $control_message.attr('class', 'control-success fade in')
  185. }
  186. });
  187. }
  188. {% if form.is_bound %}
  189. validate();
  190. {% endif %}
  191. $input.keyup(validate);
  192. });
  193. });
  194. </script>
  195. <script type="text/javascript" src="{% static "misago/js/zxcvbn-async.js" %}"></script>
  196. {% endblock javascripts %}