<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>
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'),
]
from patchwork.models import Project
from patchwork.models import State
from patchwork.views import generic_list
+from patchwork.views import utils
def register(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)
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'))