]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
views: Provide a way to view, (re)generate tokens
authorAndrew Donnellan <andrew.donnellan@au1.ibm.com>
Thu, 25 May 2017 05:42:16 +0000 (15:42 +1000)
committerStephen Finucane <stephen@that.guru>
Wed, 14 Jun 2017 08:38:25 +0000 (09:38 +0100)
Integrate token support into the web UI.

Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Stephen Finucane <stephen@that.guru>
htdocs/css/style.css
patchwork/templates/patchwork/profile.html
patchwork/urls.py
patchwork/views/user.py

index 5218f6d7429a464389a2eaf96a55ac2cc81d20f0..af2f0732eef937dc6d1d0b692252064ba932f4e2 100644 (file)
@@ -369,7 +369,6 @@ table.form th.headerrow {
 }
 
 table.form th {
-       font-weight: normal;
        text-align: left;
        vertical-align: top;
        padding-top: 0.6em;
index f9761953836f18e54675b6eef0243bb794ae79cd..75c4f59f89049aba62159c903a9a1f36637330b4 100644 (file)
@@ -134,7 +134,35 @@ address.</p>
 
 <div class="box">
 <h2>Authentication</h2>
-<a href="{% url 'password_change' %}">Change password</a>
+
+<table class="form">
+ <tr>
+  <th>Password:</th>
+  <td><a href="{% url 'password_change' %}">Change password</a>
+ </tr>
+ <tr>
+  <th>API Token:</th>
+  <td>
+   {% if api_token %}
+   <input id="token" style="width: 25em;" readonly value="{{ api_token }}">
+   <button type="button" class="btn-copy" title="Copy to clipboard"
+    data-clipboard-target="#token">Copy</button>
+   {% endif %}
+  </td>
+ <tr>
+  <th></th>
+  <td>
+   <form method="post" action="{% url 'generate_token' %}">
+    {% csrf_token %}
+    {% if api_token %}
+    <input type="submit" value="Regenerate token"/>
+    {% else %}
+    <input type="submit" value="Generate token"/>
+    {% endif %}
+   </form>
+  </td>
+ </tr>
+</table>
 </div>
 
 </div>
index be996c0b2ef739d7aa758e93e6e08ecb98e58bf3..285d5659e30b194786e6680b7c77368f80b6c80f 100644 (file)
@@ -235,6 +235,10 @@ if settings.ENABLE_REST_API:
 
     urlpatterns += [
         url(r'^api/(?:(?P<version>(1.0))/)?', include(api_patterns)),
+
+        # token change
+        url(r'^user/generate-token/$', user_views.generate_token,
+            name='generate_token'),
     ]
 
 
index 375d3d9b8cc84d3bb1b27bc0744fa78af1a3fdc5..d99fedf064a001e8a2af1d8787c66e8b1e5c4c96 100644 (file)
@@ -41,6 +41,7 @@ from patchwork.models import Person
 from patchwork.models import Project
 from patchwork.models import State
 from patchwork.views import generic_list
+from patchwork.views import utils
 
 
 def register(request):
@@ -126,6 +127,7 @@ def profile(request):
         .extra(select={'is_optout': optout_query})
     context['linked_emails'] = people
     context['linkform'] = EmailForm()
+    context['api_token'] = request.user.profile.token
 
     return render(request, 'patchwork/profile.html', context)
 
@@ -232,3 +234,9 @@ def todo_list(request, project_id):
     context['action_required_states'] = \
         State.objects.filter(action_required=True).all()
     return render(request, 'patchwork/todo-list.html', context)
+
+
+@login_required
+def generate_token(request):
+    utils.regenerate_token(request.user)
+    return HttpResponseRedirect(reverse('user-profile'))