##// END OF EJS Templates
auth-tokens: allow specifing custom expiration date manually....
marcink -
r2083:37b1bdd7 default
parent child Browse files
Show More
@@ -18,6 +18,7 b''
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import time
21 import logging
22 import logging
22 import datetime
23 import datetime
23 import formencode
24 import formencode
@@ -177,14 +178,7 b' class AdminUsersView(BaseAppView, DataGr'
177
178
178 c.active = 'auth_tokens'
179 c.active = 'auth_tokens'
179
180
180 c.lifetime_values = [
181 c.lifetime_values = AuthTokenModel.get_lifetime_values(translator=_)
181 (str(-1), _('forever')),
182 (str(5), _('5 minutes')),
183 (str(60), _('1 hour')),
184 (str(60 * 24), _('1 day')),
185 (str(60 * 24 * 30), _('1 month')),
186 ]
187 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
188 c.role_values = [
182 c.role_values = [
189 (x, AuthTokenModel.cls._get_role_name(x))
183 (x, AuthTokenModel.cls._get_role_name(x))
190 for x in AuthTokenModel.cls.ROLES]
184 for x in AuthTokenModel.cls.ROLES]
@@ -152,15 +152,7 b' class MyAccountView(BaseAppView, DataGri'
152
152
153 c = self.load_default_context()
153 c = self.load_default_context()
154 c.active = 'auth_tokens'
154 c.active = 'auth_tokens'
155
155 c.lifetime_values = AuthTokenModel.get_lifetime_values(translator=_)
156 c.lifetime_values = [
157 (str(-1), _('forever')),
158 (str(5), _('5 minutes')),
159 (str(60), _('1 hour')),
160 (str(60 * 24), _('1 day')),
161 (str(60 * 24 * 30), _('1 month')),
162 ]
163 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
164 c.role_values = [
156 c.role_values = [
165 (x, AuthTokenModel.cls._get_role_name(x))
157 (x, AuthTokenModel.cls._get_role_name(x))
166 for x in AuthTokenModel.cls.ROLES]
158 for x in AuthTokenModel.cls.ROLES]
@@ -37,6 +37,28 b' log = logging.getLogger(__name__)'
37 class AuthTokenModel(BaseModel):
37 class AuthTokenModel(BaseModel):
38 cls = UserApiKeys
38 cls = UserApiKeys
39
39
40 @classmethod
41 def get_lifetime_values(cls, translator):
42 from rhodecode.lib import helpers as h
43 _ = translator
44
45 def date_after_min(mins):
46 after = time.time() + (60 * mins)
47 return h.format_date(h.time_to_datetime(after))
48
49 return [
50 (str(-1),
51 _('forever')),
52 (str(5),
53 _('5 minutes {end_date}').format(end_date=date_after_min(5))),
54 (str(60),
55 _('1 hour {end_date}').format(end_date=date_after_min(60))),
56 (str(60 * 24),
57 _('1 day {end_date}').format(end_date=date_after_min(60 * 24))),
58 (str(60 * 24 * 30),
59 _('1 month {end_date}').format(end_date=date_after_min(60 * 24 * 30))),
60 ]
61
40 def create(self, user, description, lifetime=-1, role=UserApiKeys.ROLE_ALL):
62 def create(self, user, description, lifetime=-1, role=UserApiKeys.ROLE_ALL):
41 """
63 """
42 :param user: user or user_id
64 :param user: user or user_id
@@ -499,3 +499,62 b' function scrollToElement(element, percen'
499 }
499 }
500 collapsableContent();
500 collapsableContent();
501 });
501 });
502
503 var feedLifetimeOptions = function(query, initialData){
504 var data = {results: []};
505 var isQuery = typeof query.term !== 'undefined';
506
507 var section = _gettext('Lifetime');
508 var children = [];
509
510 //filter results
511 $.each(initialData.results, function(idx, value) {
512
513 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
514 children.push({
515 'id': this.id,
516 'text': this.text
517 })
518 }
519
520 });
521 data.results.push({
522 'text': section,
523 'children': children
524 });
525
526 if (isQuery) {
527
528 var now = moment.utc();
529
530 var parseQuery = function(entry, now){
531 var fmt = 'DD/MM/YYYY H:mm';
532 var parsed = moment.utc(entry, fmt);
533 var diffInMin = parsed.diff(now, 'minutes');
534
535 if (diffInMin > 0){
536 return {
537 id: diffInMin,
538 text: parsed.format(fmt)
539 }
540 } else {
541 return {
542 id: undefined,
543 text: parsed.format('DD/MM/YYYY') + ' ' + _gettext('date not in future')
544 }
545 }
546
547
548 };
549
550 data.results.push({
551 'text': _gettext('Specified expiration date'),
552 'children': [{
553 'id': parseQuery(query.term, now).id,
554 'text': parseQuery(query.term, now).text
555 }]
556 });
557 }
558
559 query.callback(data);
560 };
@@ -69,7 +69,7 b''
69 </div>
69 </div>
70 <div class="input">
70 <div class="input">
71 ${h.text('description', class_='medium', placeholder=_('Description'))}
71 ${h.text('description', class_='medium', placeholder=_('Description'))}
72 ${h.select('lifetime', '', c.lifetime_options)}
72 ${h.hidden('lifetime')}
73 ${h.select('role', '', c.role_options)}
73 ${h.select('role', '', c.role_options)}
74
74
75 % if c.allow_scoped_tokens:
75 % if c.allow_scoped_tokens:
@@ -100,9 +100,29 b' var select2Options = {'
100 'dropdownCssClass': "drop-menu-dropdown",
100 'dropdownCssClass': "drop-menu-dropdown",
101 'dropdownAutoWidth': true
101 'dropdownAutoWidth': true
102 };
102 };
103 $("#lifetime").select2(select2Options);
104 $("#role").select2(select2Options);
103 $("#role").select2(select2Options);
105
104
105
106 var preloadData = {
107 results: [
108 % for entry in c.lifetime_values:
109 {id:${entry[0]}, text:"${entry[1]}"}${'' if loop.last else ','}
110 % endfor
111 ]
112 };
113
114 $("#lifetime").select2({
115 containerCssClass: "drop-menu",
116 dropdownCssClass: "drop-menu-dropdown",
117 dropdownAutoWidth: true,
118 data: preloadData,
119 placeholder: ${_('Select or enter expiration date')},
120 query: function(query) {
121 feedLifetimeOptions(query, preloadData);
122 }
123 });
124
125
106 var repoFilter = function(data) {
126 var repoFilter = function(data) {
107 var results = [];
127 var results = [];
108
128
@@ -65,7 +65,7 b''
65 </div>
65 </div>
66 <div class="input">
66 <div class="input">
67 ${h.text('description', class_='medium', placeholder=_('Description'))}
67 ${h.text('description', class_='medium', placeholder=_('Description'))}
68 ${h.select('lifetime', '', c.lifetime_options)}
68 ${h.hidden('lifetime')}
69 ${h.select('role', '', c.role_options)}
69 ${h.select('role', '', c.role_options)}
70
70
71 % if c.allow_scoped_tokens:
71 % if c.allow_scoped_tokens:
@@ -97,9 +97,28 b' var select2Options = {'
97 'dropdownCssClass': "drop-menu-dropdown",
97 'dropdownCssClass': "drop-menu-dropdown",
98 'dropdownAutoWidth': true
98 'dropdownAutoWidth': true
99 };
99 };
100 $("#lifetime").select2(select2Options);
101 $("#role").select2(select2Options);
100 $("#role").select2(select2Options);
102
101
102 var preloadData = {
103 results: [
104 % for entry in c.lifetime_values:
105 {id:${entry[0]}, text:"${entry[1]}"}${'' if loop.last else ','}
106 % endfor
107 ]
108 };
109
110 $("#lifetime").select2({
111 containerCssClass: "drop-menu",
112 dropdownCssClass: "drop-menu-dropdown",
113 dropdownAutoWidth: true,
114 data: preloadData,
115 placeholder: ${_('Select or enter expiration date')},
116 query: function(query) {
117 feedLifetimeOptions(query, preloadData);
118 }
119 });
120
121
103 var repoFilter = function(data) {
122 var repoFilter = function(data) {
104 var results = [];
123 var results = [];
105
124
General Comments 0
You need to be logged in to leave comments. Login now