Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1516041/?format=api
{ "id": 1516041, "url": "http://patchwork.ozlabs.org/api/patches/1516041/?format=api", "web_url": "http://patchwork.ozlabs.org/project/patchwork/patch/20210811213705.36293-10-stephen@that.guru/", "project": { "id": 16, "url": "http://patchwork.ozlabs.org/api/projects/16/?format=api", "name": "Patchwork", "link_name": "patchwork", "list_id": "patchwork.lists.ozlabs.org", "list_email": "patchwork@lists.ozlabs.org", "web_url": "http://jk.ozlabs.org/projects/patchwork/", "scm_url": "git://github.com/getpatchwork/patchwork", "webscm_url": "https://github.com/getpatchwork/patchwork", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20210811213705.36293-10-stephen@that.guru>", "list_archive_url": null, "date": "2021-08-11T21:36:55", "name": "[RFC,09/19] templates: Convert login, password reset views", "commit_ref": null, "pull_url": null, "state": "rfc", "archived": false, "hash": "f585a9d6628ae9d4e2e0bef8cac26ea04d3f86a5", "submitter": { "id": 69991, "url": "http://patchwork.ozlabs.org/api/people/69991/?format=api", "name": "Stephen Finucane", "email": "stephen@that.guru" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/patchwork/patch/20210811213705.36293-10-stephen@that.guru/mbox/", "series": [ { "id": 257699, "url": "http://patchwork.ozlabs.org/api/series/257699/?format=api", "web_url": "http://patchwork.ozlabs.org/project/patchwork/list/?series=257699", "date": "2021-08-11T21:36:49", "name": "Integrate Bulma", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/257699/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/1516041/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/1516041/checks/", "tags": {}, "related": [ { "id": 1523328, "url": "http://patchwork.ozlabs.org/api/patches/1523328/?format=api", "web_url": "http://patchwork.ozlabs.org/project/patchwork/patch/20210901165756.181192-10-stephen@that.guru/", "msgid": "<20210901165756.181192-10-stephen@that.guru>", "list_archive_url": null, "date": "2021-09-01T16:57:46", "name": "[RFC,v2,09/19] templates: Convert login, password reset views", "mbox": "http://patchwork.ozlabs.org/project/patchwork/patch/20210901165756.181192-10-stephen@that.guru/mbox/" } ], "headers": { "Return-Path": "\n <patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "patchwork@lists.ozlabs.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "patchwork@lists.ozlabs.org" ], "Authentication-Results": [ "ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=112.213.38.117; helo=lists.ozlabs.org;\n envelope-from=patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=<UNKNOWN>)", "ozlabs.org;\n\tdkim=fail reason=\"key not found in DNS\" header.d=that.guru\n header.i=@that.guru header.a=rsa-sha256 header.s=x header.b=OoWVqtqS;\n\tdkim-atps=neutral", "lists.ozlabs.org;\n\tdkim=fail reason=\"key not found in DNS\" header.d=that.guru\n header.i=@that.guru header.a=rsa-sha256 header.s=x header.b=OoWVqtqS;\n\tdkim-atps=neutral", "lists.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=that.guru\n (client-ip=136.175.108.75; helo=mail-108-mta75.mxroute.com;\n envelope-from=stephen@that.guru; receiver=<UNKNOWN>)", "lists.ozlabs.org;\n dkim=fail reason=\"key not found in DNS\" header.d=that.guru\n header.i=@that.guru\n header.a=rsa-sha256 header.s=x header.b=OoWVqtqS;\n dkim-atps=neutral" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange X25519 server-signature RSA-PSS (4096 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 4GlNV84WQyz9sXN\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 12 Aug 2021 07:38:24 +1000 (AEST)", "from boromir.ozlabs.org (localhost [IPv6:::1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4GlNV83FsPz3cJW\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 12 Aug 2021 07:38:24 +1000 (AEST)", "from mail-108-mta75.mxroute.com (mail-108-mta75.mxroute.com\n [136.175.108.75])\n (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n (No client certificate requested)\n by lists.ozlabs.org (Postfix) with ESMTPS id 4GlNTg6KGFz3cHG\n for <patchwork@lists.ozlabs.org>; Thu, 12 Aug 2021 07:37:58 +1000 (AEST)", "from filter004.mxroute.com ([149.28.56.236] filter004.mxroute.com)\n (Authenticated sender: mN4UYu2MZsgR)\n by mail-108-mta75.mxroute.com (ZoneMTA) with ESMTPSA id\n 17b372672c400074ba.002\n for <patchwork@lists.ozlabs.org>\n (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256);\n Wed, 11 Aug 2021 21:37:51 +0000" ], "X-Zone-Loop": "7d3cab3a985871e844cc920152e220fd33fd6906c7d8", "X-Originating-IP": "[149.28.56.236]", "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=that.guru;\n s=x;\n h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:\n In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID:\n Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n List-Post:List-Owner:List-Archive;\n bh=GB1CSTse1llMo7PKKjaFpLa8mUca+2OBHA6FQV1djAY=; b=OoWVqtqSe/+eBuKJzzaUazIQxZ\n +zUU3f5OxsOz5e4mcv7TN62dX+1CytC1BkE5i/9EHzp0ozoXeByUI91y/oKMBB6JvWM4i8vBjleMa\n CjG454vyRMTr5za2ls9Z21dMv4RJF19sKb5g8+CWFwCNoldrdXehypNL/Tv5sP3wrX1jd8TGSrDxv\n 1Tnp8Ifc8yF3DZLGdVW5dCuDJkHtOFDXP7SLznL6aFXrn/kSjc6+fB5n5qkp3Uk2LG7CEvXTS4Bun\n F0qa8UhJUmEWjunMRZz2jpFcmGFTyFrqTN2uKRh8hBffT8YTR5OFQ2Cg0hidT+BaDZvMuxJvXL0cu\n +qyewWTQ==;", "From": "Stephen Finucane <stephen@that.guru>", "To": "patchwork@lists.ozlabs.org", "Subject": "[RFC PATCH 09/19] templates: Convert login, password reset views", "Date": "Wed, 11 Aug 2021 22:36:55 +0100", "Message-Id": "<20210811213705.36293-10-stephen@that.guru>", "X-Mailer": "git-send-email 2.31.1", "In-Reply-To": "<20210811213705.36293-1-stephen@that.guru>", "References": "<20210811213705.36293-1-stephen@that.guru>", "MIME-Version": "1.0", "X-AuthUser": "stephen@that.guru", "X-Zone-Spam-Resolution": "no action", "X-Zone-Spam-Status": "No, score=0.9, required=15, tests=[ARC_NA=0,\n MID_CONTAINS_FROM=1, FROM_HAS_DN=0, RCPT_COUNT_THREE=0, TO_DN_SOME=0,\n MIME_GOOD=-0.1, FROM_EQ_ENVFROM=0, MIME_TRACE=0, RCVD_COUNT_ZERO=0,\n NEURAL_SPAM=0]", "X-BeenThere": "patchwork@lists.ozlabs.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "Patchwork development <patchwork.lists.ozlabs.org>", "List-Unsubscribe": "<https://lists.ozlabs.org/options/patchwork>,\n <mailto:patchwork-request@lists.ozlabs.org?subject=unsubscribe>", "List-Archive": "<http://lists.ozlabs.org/pipermail/patchwork/>", "List-Post": "<mailto:patchwork@lists.ozlabs.org>", "List-Help": "<mailto:patchwork-request@lists.ozlabs.org?subject=help>", "List-Subscribe": "<https://lists.ozlabs.org/listinfo/patchwork>,\n <mailto:patchwork-request@lists.ozlabs.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org", "Sender": "\"Patchwork\"\n <patchwork-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>" }, "content": "The only things off note here are that we're removing the\n'password_reset_complete.html' template in favour of redirecting to the\nlogin page, and that we're opting to generate the forms ourselves rather\nthan relying on forms generated by Django which are too difficult to\nstyle. This might actually help us in the future if/when we move to a\nAJAX-driven UI.\n\nSigned-off-by: Stephen Finucane <stephen@that.guru>\n---\n patchwork/templates/patchwork/login.html | 96 +++++++++++-----\n patchwork/urls.py | 4 +-\n templates/base2.html | 15 +++\n .../registration/password_reset_complete.html | 8 --\n .../registration/password_reset_confirm.html | 104 +++++++++++-------\n .../registration/password_reset_done.html | 35 ++++--\n .../registration/password_reset_form.html | 75 +++++++------\n 7 files changed, 218 insertions(+), 119 deletions(-)\n create mode 100644 templates/base2.html\n delete mode 100644 templates/registration/password_reset_complete.html", "diff": "diff --git patchwork/templates/patchwork/login.html patchwork/templates/patchwork/login.html\nindex 86111342..ef609f1f 100644\n--- patchwork/templates/patchwork/login.html\n+++ patchwork/templates/patchwork/login.html\n@@ -1,37 +1,77 @@\n-{% extends \"base.html\" %}\n+{% extends \"base2.html\" %}\n \n {% block title %}Sign in to Patchwork{% endblock %}\n-{% block heading %}Sign in to Patchwork{% endblock %}\n \n {% block headers %}\n- <script>\n- $(function() {\n- $('#id_username').focus()\n- });\n- </script>\n {% endblock %}\n \n {% block body %}\n-<form method=\"post\">\n-{% csrf_token %}\n- <table class=\"form loginform\">\n- <tr>\n- <th colspan=\"2\" class=\"headerrow\">login</th>\n- </tr>\n-{% if error %}\n- <tr>\n- <td colspan=\"2\">{{ error }}</td>\n- </tr>\n+<section class=\"hero is-primary is-fullheight\">\n+ <div class=\"hero-body\">\n+ <div class=\"container\">\n+ <div class=\"columns is-centered\">\n+ <div class=\"column is-5-tablet is-4-desktop is-3-widescreen\">\n+ <div class=\"block has-text-centered\">\n+ <h1 class=\"title is-3\">Sign in to Patchwork</h1>\n+ </div>\n+{% if form.non_field_errors %}\n+ <div class=\"notification is-danger is-light\">\n+ <button class=\"delete\"></button>\n+ {{ form.non_field_errors }}\n+ </div>\n {% endif %}\n-{{ form }}\n- <tr>\n- <td class=\"submitrow\">\n- <input type=\"submit\" value=\"Login\"/>\n- </td>\n- <td class=\"submitrow\">\n- <a href=\"{% url 'password_reset' %}\">Forgot password?</a>\n- </td>\n- </tr>\n- </table>\n-</form>\n+ <form method=\"post\" class=\"box\">\n+ {% csrf_token %}\n+ <div class=\"field\">\n+ <label for=\"id_username\" class=\"label has-text-weight-normal\">Username</label>\n+ <div class=\"control has-icons-left\">\n+ <input id=\"id_username\" type=\"text\" name=\"username\" placeholder=\"e.g. bobsmith\" class=\"input\" autocomplete=\"username\" autofocus required>\n+ <span class=\"icon is-small is-left\">\n+ <i class=\"fa fa-user\"></i>\n+ </span>\n+ </div>\n+{% for error in form.username.errors %}\n+ <p class=\"help is-danger\">{{ error }}</p>\n+{% endfor %}\n+ </div>\n+ <div class=\"field\">\n+ <label for=\"id_password\" class=\"label has-text-weight-normal\">Password</label>\n+ <div class=\"control has-icons-left\">\n+ <input id=\"id_password\" type=\"password\" name=\"password\" placeholder=\"*******\" class=\"input\" autocomplete=\"current-password\" required>\n+ <span class=\"icon is-small is-left\">\n+ <i class=\"fa fa-lock\"></i>\n+ </span>\n+ </div>\n+{% for error in form.password.errors %}\n+ <p class=\"help is-danger\">{{ error }}</p>\n+{% endfor %}\n+ </div>\n+ <div class=\"field\">\n+ <button class=\"button is-success is-fullwidth\">\n+ Login\n+ </button>\n+ </div>\n+ </form>\n+ <div class=\"box has-text-centered\">\n+ <a href=\"{% url 'user-register' %}\">Sign Up</a>\n+ • \n+ <a href=\"{% url 'password_reset' %}\">Forgot Password</a>\n+ </div>\n+ </div>\n+ </div>\n+ </div>\n+ </div>\n+</section>\n+\n+<script>\n+var btns = document.getElementsByClassName('delete')\n+\n+for (var i = 0; i < btns.length; i++) {\n+ console.log('got button');\n+ btns[i].addEventListener('click', function(e) {\n+ console.log('hello');\n+ this.parentNode.remove(); //this refers to the current target element\n+ }, false);\n+}\n+</script>\n {% endblock %}\ndiff --git patchwork/urls.py patchwork/urls.py\nindex 6ac9b81a..0c557f78 100644\n--- patchwork/urls.py\n+++ patchwork/urls.py\n@@ -153,7 +153,9 @@ urlpatterns = [\n ),\n path(\n 'user/password-reset/<uidb64>/<token>/',\n- auth_views.PasswordResetConfirmView.as_view(),\n+ auth_views.PasswordResetConfirmView.as_view(\n+ success_url=reverse_lazy('auth_login'),\n+ ),\n name='password_reset_confirm',\n ),\n path(\ndiff --git templates/base2.html templates/base2.html\nnew file mode 100644\nindex 00000000..ac6b43bc\n--- /dev/null\n+++ templates/base2.html\n@@ -0,0 +1,15 @@\n+{% load static %}\n+<!DOCTYPE html>\n+<html>\n+ <head>\n+ <meta charset=\"utf-8\">\n+ <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n+ <title>{% block title %}Patchwork{% endblock %} - Patchwork</title>\n+ <link rel=\"stylesheet\" href=\"{% static \"css/bulma.min.css\" %}\"/>\n+ <link rel=\"stylesheet\" href=\"{% static \"css/fontawesome.min.css\" %}\">\n+{% block headers %}{% endblock %}\n+ </head>\n+ <body>\n+{% block body %}{% endblock %}\n+ </body>\n+</html>\ndiff --git templates/registration/password_reset_complete.html templates/registration/password_reset_complete.html\ndeleted file mode 100644\nindex 8678ee89..00000000\n--- templates/registration/password_reset_complete.html\n+++ /dev/null\n@@ -1,8 +0,0 @@\n-{% extends \"base.html\" %}\n-\n-{% block title %}Password reset completed{% endblock %}\n-{% block heading %}Password reset completed{% endblock %}\n-\n-{% block body %}\n-<p>Your password has been set. You may go ahead and log in now.</p>\n-{% endblock %}\ndiff --git templates/registration/password_reset_confirm.html templates/registration/password_reset_confirm.html\nindex 4ab2357f..1c91eb1b 100644\n--- templates/registration/password_reset_confirm.html\n+++ templates/registration/password_reset_confirm.html\n@@ -1,49 +1,77 @@\n-{% extends \"base.html\" %}\n+{% extends \"base2.html\" %}\n \n {% block title %}Password reset confirmation{% endblock %}\n {% block heading %}Password reset confirmation{% endblock %}\n \n {% block body %}\n+<section class=\"hero is-primary is-fullheight\">\n+ <div class=\"hero-body\">\n+ <div class=\"container\">\n+ <div class=\"columns is-centered\">\n+ <div class=\"column is-5-tablet is-4-desktop is-3-widescreen\">\n {% if validlink %}\n-<p>\n- Your username, in case you've forgotten: {{ form.user.get_username }}\n-</p>\n-<p>\n- Please enter your new password twice so we can verify you typed it in\n- correctly.\n-</p>\n-\n-<form method=\"post\">\n- {% csrf_token %}\n- <table class=\"form passwordform\">\n-{% if form.errors %}\n- <tr>\n- <td colspan=\"2\" class=\"error\">Please correct the errors below.</p>\n- </tr>\n-{% endif %}\n-{% for field in form %}\n- <tr>\n- <td>{{ field.label_tag }}</td>\n- <td>\n- {{ field.errors }}\n- {{ field }}\n-{% if field.help_text %}\n- <div class=\"help_text\"/>{{ field.help_text }}</div>\n+ <div class=\"block has-text-centered\">\n+ <h1 class=\"title is-3\">Change password for @{{ form.user.get_username }}</h1>\n+ </div>\n+{% if form.non_field_errors %}\n+ <div class=\"notification is-danger is-light\">\n+ <button class=\"delete\"></button>\n+ {{ form.non_field_errors }}\n+ </div>\n {% endif %}\n- </td>\n- </tr>\n+ <form method=\"post\" class=\"box\">\n+ {% csrf_token %}\n+ <div class=\"field\">\n+ <label for=\"id_new_password1\" class=\"label has-text-weight-normal\">\n+ New password\n+ </label>\n+ <div class=\"control has-icons-left\">\n+ <input id=\"id_new_password1\" type=\"password\" name=\"new_password1\" placeholder=\"*******\" class=\"input\" autocomplete=\"new-password\" autofocus required>\n+ <span class=\"icon is-small is-left\">\n+ <i class=\"fa fa-lock\"></i>\n+ </span>\n+ </div>\n+{% for error in form.new_password1.errors %}\n+ <p class=\"help is-danger\">{{ error }}</p>\n+{% endfor %}\n+ </div>\n+ <div class=\"field\">\n+ <label for=\"id_new_password2\" class=\"label has-text-weight-normal\">\n+ Confirm password\n+ </label>\n+ <div class=\"control has-icons-left\">\n+ <input id=\"id_new_password2\" type=\"password\" name=\"new_password2\" placeholder=\"*******\" class=\"input\" autocomplete=\"new-password\" required>\n+ <span class=\"icon is-small is-left\">\n+ <i class=\"fa fa-lock\"></i>\n+ </span>\n+ </div>\n+{% for error in form.new_password2.errors %}\n+ <p class=\"help is-danger\">{{ error }}</p>\n {% endfor %}\n- <tr>\n- <td colspan=\"2\">\n- <input type=\"submit\" value=\"Set my password\" class=\"default\" />\n- </td>\n- </tr>\n- </table>\n-</form>\n+ </div>\n+ <div class=\"field\">\n+ <button class=\"button is-success is-fullwidth\">\n+ Reset password\n+ </button>\n+ </div>\n+ </form>\n {% else %}\n-<p>\n- The password reset link was invalid, possibly because it has already\n- been used. Please request a new password reset.\n-</p>\n+ <div class=\"block has-text-centered\">\n+ <h1 class=\"title is-3\">Reset your password</h1>\n+ </div>\n+ <div class=\"box\">\n+ <p class=\"block\">\n+ The password reset link was invalid, possibly because it has already been used.\n+ Try again.\n+ </p>\n+ <a href=\"{% url 'password_reset' %}\" class=\"button is-light is-fullwidth\">\n+ Reset password\n+ </a>\n+ </div>\n {% endif %}\n+ </div>\n+ </div>\n+ </div>\n+ </div>\n+</section>\n {% endblock %}\ndiff --git templates/registration/password_reset_done.html templates/registration/password_reset_done.html\nindex 6070f767..ebd38e68 100644\n--- templates/registration/password_reset_done.html\n+++ templates/registration/password_reset_done.html\n@@ -1,15 +1,28 @@\n-{% extends \"base.html\" %}\n+{% extends \"base2.html\" %}\n \n-{% block title %}Password reset{% endblock %}\n-{% block heading %}Password reset{% endblock %}\n+{% block title %}Password reset email sent!{% endblock %}\n \n {% block body %}\n-<p>\n- We have emailed you instructions for setting your password.\n- You should be receiving them shortly.\n-</p>\n-<p>\n- If you don't receive an email, please make sure you've entered the\n- address you registered with, and check your spam folder.\n-</p>\n+<section class=\"hero is-primary is-fullheight\">\n+ <div class=\"hero-body\">\n+ <div class=\"container\">\n+ <div class=\"columns is-centered\">\n+ <div class=\"column is-5-tablet is-4-desktop is-3-widescreen\">\n+ <div class=\"block has-text-centered\">\n+ <h1 class=\"title is-3\">Reset your password</h1>\n+ </div>\n+ <div class=\"box\">\n+ <p class=\"block\">\n+ We have emailed you a link to reset your password.\n+ If you don't receive this email shortly, check your spam folder.\n+ </p>\n+ <a href=\"{% url 'auth_login' %}\" class=\"button is-light is-fullwidth\">\n+ Return to sign in\n+ </a>\n+ </div>\n+ </div>\n+ </div>\n+ </div>\n+ </div>\n+</section>\n {% endblock %}\ndiff --git templates/registration/password_reset_form.html templates/registration/password_reset_form.html\nindex fa6f3f1a..431b4696 100644\n--- templates/registration/password_reset_form.html\n+++ templates/registration/password_reset_form.html\n@@ -1,39 +1,48 @@\n-{% extends \"base.html\" %}\n+{% extends \"base2.html\" %}\n \n-{% block title %}Password reset{% endblock %}\n-{% block heading %}Password reset{% endblock %}\n+{% block title %}Forgot your password?{% endblock %}\n \n {% block body %}\n-<p>\n- Forgotten your password? Enter your email address below, and we will\n- email instructions for setting a new one.\n-</p>\n-\n-<form method=\"post\">\n- {% csrf_token %}\n- <table class=\"form passwordform\">\n-{% if form.errors %}\n- <tr>\n- <td colspan=\"2\" class=\"error\">Please correct the errors below.</p>\n- </tr>\n-{% endif %}\n-{% for field in form %}\n- <tr>\n- <td>{{ field.label_tag }}</td>\n- <td>\n- {{ field.errors }}\n- {{ field }}\n-{% if field.help_text %}\n- <div class=\"help_text\"/>{{ field.help_text }}</div>\n+<section class=\"hero is-primary is-fullheight\">\n+ <div class=\"hero-body\">\n+ <div class=\"container\">\n+ <div class=\"columns is-centered\">\n+ <div class=\"column is-5-tablet is-4-desktop is-3-widescreen\">\n+ <div class=\"block has-text-centered\">\n+ <h1 class=\"title is-3\">Reset your password</h1>\n+ </div>\n+{% if form.non_field_errors %}\n+ <div class=\"notification is-danger is-light\">\n+ <button class=\"delete\"></button>\n+ {{ form.non_field_errors }}\n+ </div>\n {% endif %}\n- </td>\n- </tr>\n+ <form method=\"post\" class=\"box\">\n+ {% csrf_token %}\n+ <div class=\"field\">\n+ <label for=\"id_email\" class=\"label has-text-weight-normal\">\n+ Enter your email address below and we will email instructions\n+ for setting a new one.\n+ </label>\n+ <div class=\"control has-icons-left\">\n+ <input id=\"id_email\" type=\"email\" name=\"email\" placeholder=\"e.g. bobsmith@example.com\" class=\"input\" autocomplete=\"email\" autofocus required>\n+ <span class=\"icon is-small is-left\">\n+ <i class=\"fa fa-envelope\"></i>\n+ </span>\n+ </div>\n+{% for error in form.email.errors %}\n+ <p class=\"help is-danger\">{{ error }}</p>\n {% endfor %}\n- <tr>\n- <td colspan=\"2\">\n- <input type=\"submit\" value=\"Reset my password\" class=\"default\" />\n- </td>\n- </tr>\n- </table>\n-</form>\n+ </div>\n+ <div class=\"field\">\n+ <button class=\"button is-success is-fullwidth\">\n+ Reset password\n+ </button>\n+ </div>\n+ </form>\n+ </div>\n+ </div>\n+ </div>\n+ </div>\n+</section>\n {% endblock %}\n", "prefixes": [ "RFC", "09/19" ] }