user_edit_auth_tokens.mako
157 lines
| 6.1 KiB
| application/x-mako
|
MakoHtmlLexer
r1282 | <div class="panel panel-default"> | |||
<div class="panel-heading"> | ||||
r1518 | <h3 class="panel-title">${_('Authentication Tokens')}</h3> | |||
r1282 | </div> | |||
<div class="panel-body"> | ||||
<div class="apikeys_wrap"> | ||||
r1480 | <p> | |||
${_('Each token can have a role. Token with a role can be used only in given context, ' | ||||
'e.g. VCS tokens can be used together with the authtoken auth plugin for git/hg/svn operations only.')} | ||||
</p> | ||||
r1282 | <table class="rctable auth_tokens"> | |||
r1480 | <tr> | |||
<th>${_('Token')}</th> | ||||
<th>${_('Scope')}</th> | ||||
<th>${_('Description')}</th> | ||||
<th>${_('Role')}</th> | ||||
<th>${_('Expiration')}</th> | ||||
<th>${_('Action')}</th> | ||||
</tr> | ||||
r1282 | %if c.user_auth_tokens: | |||
%for auth_token in c.user_auth_tokens: | ||||
<tr class="${'expired' if auth_token.expired else ''}"> | ||||
<td class="truncate-wrap td-authtoken"><div class="user_auth_tokens truncate autoexpand"><code>${auth_token.api_key}</code></div></td> | ||||
r1480 | <td class="td">${auth_token.scope_humanized}</td> | |||
r1282 | <td class="td-wrap">${auth_token.description}</td> | |||
<td class="td-tags"> | ||||
r1518 | <span class="tag disabled">${auth_token.role_humanized}</span> | |||
r1282 | </td> | |||
<td class="td-exp"> | ||||
%if auth_token.expires == -1: | ||||
r1480 | ${_('never')} | |||
r1282 | %else: | |||
%if auth_token.expired: | ||||
r1480 | <span style="text-decoration: line-through">${h.age_component(h.time_to_utcdatetime(auth_token.expires))}</span> | |||
r1282 | %else: | |||
r1480 | ${h.age_component(h.time_to_utcdatetime(auth_token.expires))} | |||
r1282 | %endif | |||
%endif | ||||
</td> | ||||
r1518 | <td class="td-action"> | |||
r1821 | ${h.secure_form(h.route_path('edit_user_auth_tokens_delete', user_id=c.user.user_id), method='POST')} | |||
${h.hidden('del_auth_token', auth_token.user_api_key_id)} | ||||
r1282 | <button class="btn btn-link btn-danger" type="submit" | |||
r1821 | onclick="return confirm('${_('Confirm to remove this auth token: %s') % auth_token.token_obfuscated}');"> | |||
r1282 | ${_('Delete')} | |||
</button> | ||||
${h.end_form()} | ||||
</td> | ||||
</tr> | ||||
%endfor | ||||
%else: | ||||
<tr><td><div class="ip">${_('No additional auth tokens specified')}</div></td></tr> | ||||
%endif | ||||
</table> | ||||
</div> | ||||
<div class="user_auth_tokens"> | ||||
r1821 | ${h.secure_form(h.route_path('edit_user_auth_tokens_add', user_id=c.user.user_id), method='POST')} | |||
r1282 | <div class="form form-vertical"> | |||
<!-- fields --> | ||||
<div class="fields"> | ||||
<div class="field"> | ||||
<div class="label"> | ||||
r1480 | <label for="new_email">${_('New authentication token')}:</label> | |||
r1282 | </div> | |||
<div class="input"> | ||||
${h.text('description', class_='medium', placeholder=_('Description'))} | ||||
${h.select('lifetime', '', c.lifetime_options)} | ||||
${h.select('role', '', c.role_options)} | ||||
r1518 | ||||
% if c.allow_scoped_tokens: | ||||
${h.hidden('scope_repo_id')} | ||||
% else: | ||||
${h.select('scope_repo_id_disabled', '', ['Scopes available in EE edition'], disabled='disabled')} | ||||
% endif | ||||
r1282 | </div> | |||
r1518 | <p class="help-block"> | |||
${_('Repository scope works only with tokens with VCS type.')} | ||||
</p> | ||||
r1282 | </div> | |||
<div class="buttons"> | ||||
r1518 | ${h.submit('save',_('Add'),class_="btn")} | |||
${h.reset('reset',_('Reset'),class_="btn")} | ||||
r1282 | </div> | |||
</div> | ||||
</div> | ||||
${h.end_form()} | ||||
</div> | ||||
</div> | ||||
</div> | ||||
<script> | ||||
r1518 | ||||
$(document).ready(function(){ | ||||
var select2Options = { | ||||
'containerCssClass': "drop-menu", | ||||
'dropdownCssClass': "drop-menu-dropdown", | ||||
'dropdownAutoWidth': true | ||||
}; | ||||
$("#lifetime").select2(select2Options); | ||||
$("#role").select2(select2Options); | ||||
var repoFilter = function(data) { | ||||
var results = []; | ||||
if (!data.results[0]) { | ||||
return data | ||||
} | ||||
$.each(data.results[0].children, function() { | ||||
// replace name to ID for submision | ||||
this.id = this.obj.repo_id; | ||||
results.push(this); | ||||
}); | ||||
data.results[0].children = results; | ||||
return data; | ||||
}; | ||||
$("#scope_repo_id_disabled").select2(select2Options); | ||||
$("#scope_repo_id").select2({ | ||||
cachedDataSource: {}, | ||||
minimumInputLength: 2, | ||||
placeholder: "${_('repository scope')}", | ||||
dropdownAutoWidth: true, | ||||
containerCssClass: "drop-menu", | ||||
dropdownCssClass: "drop-menu-dropdown", | ||||
formatResult: formatResult, | ||||
query: $.debounce(250, function(query){ | ||||
self = this; | ||||
var cacheKey = query.term; | ||||
var cachedData = self.cachedDataSource[cacheKey]; | ||||
if (cachedData) { | ||||
query.callback({results: cachedData.results}); | ||||
} else { | ||||
$.ajax({ | ||||
r1667 | url: pyroutes.url('repo_list_data'), | |||
r1518 | data: {'query': query.term}, | |||
dataType: 'json', | ||||
type: 'GET', | ||||
success: function(data) { | ||||
data = repoFilter(data); | ||||
self.cachedDataSource[cacheKey] = data; | ||||
query.callback({results: data.results}); | ||||
}, | ||||
error: function(data, textStatus, errorThrown) { | ||||
alert("Error while fetching entries.\nError code {0} ({1}).".format(data.status, data.statusText)); | ||||
} | ||||
}) | ||||
} | ||||
r1282 | }) | |||
r1518 | }); | |||
}); | ||||
r1282 | </script> | |||