my_account_auth_tokens.mako
199 lines
| 7.0 KiB
| application/x-mako
|
MakoHtmlLexer
r1282 | <div class="panel panel-default"> | |||
r4316 | <script> | |||
var showAuthToken = function(authTokenId) { | ||||
return _showAuthToken(authTokenId, pyroutes.url('my_account_auth_tokens_view')) | ||||
} | ||||
</script> | ||||
r3391 | <div class="panel-heading"> | |||
r1282 | <h3 class="panel-title">${_('Authentication Tokens')}</h3> | |||
r3391 | </div> | |||
<div class="panel-body"> | ||||
r1518 | <div class="apikeys_wrap"> | |||
r1282 | <p> | |||
r3391 | ${_('Authentication tokens can be used to interact with the API, or VCS-over-http. ' | |||
'Each token can have a role. Token with a role can be used only in given context, ' | ||||
r1480 | 'e.g. VCS tokens can be used together with the authtoken auth plugin for git/hg/svn operations only.')} | |||
r1282 | </p> | |||
<table class="rctable auth_tokens"> | ||||
r1518 | <tr> | |||
<th>${_('Token')}</th> | ||||
<th>${_('Description')}</th> | ||||
<th>${_('Role')}</th> | ||||
r3391 | <th>${_('Repository Scope')}</th> | |||
r1518 | <th>${_('Expiration')}</th> | |||
<th>${_('Action')}</th> | ||||
</tr> | ||||
r1282 | %if c.user_auth_tokens: | |||
%for auth_token in c.user_auth_tokens: | ||||
r3391 | <tr class="${('expired' if auth_token.expired else '')}"> | |||
r4316 | <td class="td-authtoken"> | |||
<div class="user_auth_tokens"> | ||||
<code class="cursor-pointer" onclick="showAuthToken(${auth_token.user_api_key_id})"> | ||||
${auth_token.token_obfuscated} | ||||
</code> | ||||
r1480 | </div> | |||
</td> | ||||
r1282 | <td class="td-wrap">${auth_token.description}</td> | |||
<td class="td-tags"> | ||||
<span class="tag disabled">${auth_token.role_humanized}</span> | ||||
</td> | ||||
r3391 | <td class="td">${auth_token.scope_humanized}</td> | |||
r1282 | <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> | ||||
<td class="td-action"> | ||||
r2105 | ${h.secure_form(h.route_path('my_account_auth_tokens_delete'), request=request)} | |||
r4316 | <input name="del_auth_token" type="hidden" value="${auth_token.user_api_key_id}"> | |||
r1282 | <button class="btn btn-link btn-danger" type="submit" | |||
r4313 | onclick="submitConfirm(event, this, _gettext('Confirm to delete this auth token'), _gettext('Delete'), '${auth_token.token_obfuscated}')" | |||
> | ||||
r1282 | ${_('Delete')} | |||
</button> | ||||
${h.end_form()} | ||||
</td> | ||||
</tr> | ||||
%endfor | ||||
%else: | ||||
r1518 | <tr><td><div class="ip">${_('No additional auth tokens specified')}</div></td></tr> | |||
r1282 | %endif | |||
</table> | ||||
r1518 | </div> | |||
r1282 | ||||
r3391 | <div class="user_auth_tokens"> | |||
${h.secure_form(h.route_path('my_account_auth_tokens_add'), request=request)} | ||||
<div class="form form-vertical"> | ||||
<!-- fields --> | ||||
<div class="fields"> | ||||
<div class="field"> | ||||
<div class="label"> | ||||
<label for="new_email">${_('New authentication token')}:</label> | ||||
</div> | ||||
<div class="input"> | ||||
${h.text('description', class_='medium', placeholder=_('Description'))} | ||||
${h.hidden('lifetime')} | ||||
r4240 | ${h.select('role', request.GET.get('token_role', ''), c.role_options)} | |||
r1507 | ||||
r3391 | % 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> | |||
r3391 | <p class="help-block"> | |||
${_('Repository scope works only with tokens with VCS type.')} | ||||
</p> | ||||
</div> | ||||
<div class="buttons"> | ||||
${h.submit('save',_('Add'),class_="btn")} | ||||
${h.reset('reset',_('Reset'),class_="btn")} | ||||
r1282 | </div> | |||
</div> | ||||
</div> | ||||
r3391 | ${h.end_form()} | |||
</div> | ||||
r1282 | </div> | |||
</div> | ||||
r3391 | ||||
r1507 | <script> | |||
$(document).ready(function(){ | ||||
var select2Options = { | ||||
'containerCssClass': "drop-menu", | ||||
'dropdownCssClass': "drop-menu-dropdown", | ||||
'dropdownAutoWidth': true | ||||
}; | ||||
$("#role").select2(select2Options); | ||||
r2083 | var preloadData = { | |||
results: [ | ||||
% for entry in c.lifetime_values: | ||||
{id:${entry[0]}, text:"${entry[1]}"}${'' if loop.last else ','} | ||||
% endfor | ||||
] | ||||
}; | ||||
$("#lifetime").select2({ | ||||
containerCssClass: "drop-menu", | ||||
dropdownCssClass: "drop-menu-dropdown", | ||||
dropdownAutoWidth: true, | ||||
data: preloadData, | ||||
r2084 | placeholder: "${_('Select or enter expiration date')}", | |||
r2083 | query: function(query) { | |||
feedLifetimeOptions(query, preloadData); | ||||
} | ||||
}); | ||||
r1507 | var repoFilter = function(data) { | |||
var results = []; | ||||
if (!data.results[0]) { | ||||
return data | ||||
} | ||||
$.each(data.results[0].children, function() { | ||||
// replace name to ID for submision | ||||
r2774 | this.id = this.repo_id; | |||
r1507 | results.push(this); | |||
}); | ||||
data.results[0].children = results; | ||||
return data; | ||||
}; | ||||
$("#scope_repo_id_disabled").select2(select2Options); | ||||
r2118 | var selectVcsScope = function() { | |||
// select vcs scope and disable input | ||||
$("#role").select2("val", "${c.role_vcs}").trigger('change'); | ||||
$("#role").select2("readonly", true) | ||||
}; | ||||
r1507 | $("#scope_repo_id").select2({ | |||
cachedDataSource: {}, | ||||
minimumInputLength: 2, | ||||
placeholder: "${_('repository scope')}", | ||||
dropdownAutoWidth: true, | ||||
containerCssClass: "drop-menu", | ||||
dropdownCssClass: "drop-menu-dropdown", | ||||
r2774 | formatResult: formatRepoResult, | |||
r1507 | 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'), | |||
r1507 | 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)); | ||||
} | ||||
}) | ||||
} | ||||
}) | ||||
}); | ||||
r2118 | $("#scope_repo_id").on('select2-selecting', function(e){ | |||
selectVcsScope() | ||||
}); | ||||
r1507 | ||||
}); | ||||
</script> | ||||