##// END OF EJS Templates
gists: updated template names and synced edit with create template.
marcink -
r3870:796d3ee3 default
parent child Browse files
Show More
@@ -1,414 +1,414 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2013-2019 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import time
22 22 import logging
23 23
24 24 import formencode
25 25 import formencode.htmlfill
26 26 import peppercorn
27 27
28 28 from pyramid.httpexceptions import HTTPNotFound, HTTPFound, HTTPBadRequest
29 29 from pyramid.view import view_config
30 30 from pyramid.renderers import render
31 31 from pyramid.response import Response
32 32
33 33 from rhodecode.apps._base import BaseAppView
34 34 from rhodecode.lib import helpers as h
35 35 from rhodecode.lib.auth import LoginRequired, NotAnonymous, CSRFRequired
36 36 from rhodecode.lib.utils2 import time_to_datetime
37 37 from rhodecode.lib.ext_json import json
38 38 from rhodecode.lib.vcs.exceptions import VCSError, NodeNotChangedError
39 39 from rhodecode.model.gist import GistModel
40 40 from rhodecode.model.meta import Session
41 41 from rhodecode.model.db import Gist, User, or_
42 42 from rhodecode.model import validation_schema
43 43 from rhodecode.model.validation_schema.schemas import gist_schema
44 44
45 45
46 46 log = logging.getLogger(__name__)
47 47
48 48
49 49 class GistView(BaseAppView):
50 50
51 51 def load_default_context(self):
52 52 _ = self.request.translate
53 53 c = self._get_local_tmpl_context()
54 54 c.user = c.auth_user.get_instance()
55 55
56 56 c.lifetime_values = [
57 57 (-1, _('forever')),
58 58 (5, _('5 minutes')),
59 59 (60, _('1 hour')),
60 60 (60 * 24, _('1 day')),
61 61 (60 * 24 * 30, _('1 month')),
62 62 ]
63 63
64 64 c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
65 65 c.acl_options = [
66 66 (Gist.ACL_LEVEL_PRIVATE, _("Requires registered account")),
67 67 (Gist.ACL_LEVEL_PUBLIC, _("Can be accessed by anonymous users"))
68 68 ]
69 69
70 70 return c
71 71
72 72 @LoginRequired()
73 73 @view_config(
74 74 route_name='gists_show', request_method='GET',
75 renderer='rhodecode:templates/admin/gists/index.mako')
75 renderer='rhodecode:templates/admin/gists/gist_index.mako')
76 76 def gist_show_all(self):
77 77 c = self.load_default_context()
78 78
79 79 not_default_user = self._rhodecode_user.username != User.DEFAULT_USER
80 80 c.show_private = self.request.GET.get('private') and not_default_user
81 81 c.show_public = self.request.GET.get('public') and not_default_user
82 82 c.show_all = self.request.GET.get('all') and self._rhodecode_user.admin
83 83
84 84 gists = _gists = Gist().query()\
85 85 .filter(or_(Gist.gist_expires == -1, Gist.gist_expires >= time.time()))\
86 86 .order_by(Gist.created_on.desc())
87 87
88 88 c.active = 'public'
89 89 # MY private
90 90 if c.show_private and not c.show_public:
91 91 gists = _gists.filter(Gist.gist_type == Gist.GIST_PRIVATE)\
92 92 .filter(Gist.gist_owner == self._rhodecode_user.user_id)
93 93 c.active = 'my_private'
94 94 # MY public
95 95 elif c.show_public and not c.show_private:
96 96 gists = _gists.filter(Gist.gist_type == Gist.GIST_PUBLIC)\
97 97 .filter(Gist.gist_owner == self._rhodecode_user.user_id)
98 98 c.active = 'my_public'
99 99 # MY public+private
100 100 elif c.show_private and c.show_public:
101 101 gists = _gists.filter(or_(Gist.gist_type == Gist.GIST_PUBLIC,
102 102 Gist.gist_type == Gist.GIST_PRIVATE))\
103 103 .filter(Gist.gist_owner == self._rhodecode_user.user_id)
104 104 c.active = 'my_all'
105 105 # Show all by super-admin
106 106 elif c.show_all:
107 107 c.active = 'all'
108 108 gists = _gists
109 109
110 110 # default show ALL public gists
111 111 if not c.show_public and not c.show_private and not c.show_all:
112 112 gists = _gists.filter(Gist.gist_type == Gist.GIST_PUBLIC)
113 113 c.active = 'public'
114 114
115 115 _render = self.request.get_partial_renderer(
116 116 'rhodecode:templates/data_table/_dt_elements.mako')
117 117
118 118 data = []
119 119
120 120 for gist in gists:
121 121 data.append({
122 122 'created_on': _render('gist_created', gist.created_on),
123 123 'created_on_raw': gist.created_on,
124 124 'type': _render('gist_type', gist.gist_type),
125 125 'access_id': _render('gist_access_id', gist.gist_access_id, gist.owner.full_contact),
126 126 'author': _render('gist_author', gist.owner.full_contact, gist.created_on, gist.gist_expires),
127 127 'author_raw': h.escape(gist.owner.full_contact),
128 128 'expires': _render('gist_expires', gist.gist_expires),
129 129 'description': _render('gist_description', gist.gist_description)
130 130 })
131 131 c.data = json.dumps(data)
132 132
133 133 return self._get_template_context(c)
134 134
135 135 @LoginRequired()
136 136 @NotAnonymous()
137 137 @view_config(
138 138 route_name='gists_new', request_method='GET',
139 renderer='rhodecode:templates/admin/gists/new.mako')
139 renderer='rhodecode:templates/admin/gists/gist_new.mako')
140 140 def gist_new(self):
141 141 c = self.load_default_context()
142 142 return self._get_template_context(c)
143 143
144 144 @LoginRequired()
145 145 @NotAnonymous()
146 146 @CSRFRequired()
147 147 @view_config(
148 148 route_name='gists_create', request_method='POST',
149 renderer='rhodecode:templates/admin/gists/new.mako')
149 renderer='rhodecode:templates/admin/gists/gist_new.mako')
150 150 def gist_create(self):
151 151 _ = self.request.translate
152 152 c = self.load_default_context()
153 153
154 154 data = dict(self.request.POST)
155 155 data['filename'] = data.get('filename') or Gist.DEFAULT_FILENAME
156 156 data['nodes'] = [{
157 157 'filename': data['filename'],
158 158 'content': data.get('content'),
159 159 'mimetype': data.get('mimetype') # None is autodetect
160 160 }]
161 161
162 162 data['gist_type'] = (
163 163 Gist.GIST_PUBLIC if data.get('public') else Gist.GIST_PRIVATE)
164 164 data['gist_acl_level'] = (
165 165 data.get('gist_acl_level') or Gist.ACL_LEVEL_PRIVATE)
166 166
167 167 schema = gist_schema.GistSchema().bind(
168 168 lifetime_options=[x[0] for x in c.lifetime_values])
169 169
170 170 try:
171 171
172 172 schema_data = schema.deserialize(data)
173 173 # convert to safer format with just KEYs so we sure no duplicates
174 174 schema_data['nodes'] = gist_schema.sequence_to_nodes(
175 175 schema_data['nodes'])
176 176
177 177 gist = GistModel().create(
178 178 gist_id=schema_data['gistid'], # custom access id not real ID
179 179 description=schema_data['description'],
180 180 owner=self._rhodecode_user.user_id,
181 181 gist_mapping=schema_data['nodes'],
182 182 gist_type=schema_data['gist_type'],
183 183 lifetime=schema_data['lifetime'],
184 184 gist_acl_level=schema_data['gist_acl_level']
185 185 )
186 186 Session().commit()
187 187 new_gist_id = gist.gist_access_id
188 188 except validation_schema.Invalid as errors:
189 189 defaults = data
190 190 errors = errors.asdict()
191 191
192 192 if 'nodes.0.content' in errors:
193 193 errors['content'] = errors['nodes.0.content']
194 194 del errors['nodes.0.content']
195 195 if 'nodes.0.filename' in errors:
196 196 errors['filename'] = errors['nodes.0.filename']
197 197 del errors['nodes.0.filename']
198 198
199 data = render('rhodecode:templates/admin/gists/new.mako',
199 data = render('rhodecode:templates/admin/gists/gist_new.mako',
200 200 self._get_template_context(c), self.request)
201 201 html = formencode.htmlfill.render(
202 202 data,
203 203 defaults=defaults,
204 204 errors=errors,
205 205 prefix_error=False,
206 206 encoding="UTF-8",
207 207 force_defaults=False
208 208 )
209 209 return Response(html)
210 210
211 211 except Exception:
212 212 log.exception("Exception while trying to create a gist")
213 213 h.flash(_('Error occurred during gist creation'), category='error')
214 214 raise HTTPFound(h.route_url('gists_new'))
215 215 raise HTTPFound(h.route_url('gist_show', gist_id=new_gist_id))
216 216
217 217 @LoginRequired()
218 218 @NotAnonymous()
219 219 @CSRFRequired()
220 220 @view_config(
221 221 route_name='gist_delete', request_method='POST')
222 222 def gist_delete(self):
223 223 _ = self.request.translate
224 224 gist_id = self.request.matchdict['gist_id']
225 225
226 226 c = self.load_default_context()
227 227 c.gist = Gist.get_or_404(gist_id)
228 228
229 229 owner = c.gist.gist_owner == self._rhodecode_user.user_id
230 230 if not (h.HasPermissionAny('hg.admin')() or owner):
231 231 log.warning('Deletion of Gist was forbidden '
232 232 'by unauthorized user: `%s`', self._rhodecode_user)
233 233 raise HTTPNotFound()
234 234
235 235 GistModel().delete(c.gist)
236 236 Session().commit()
237 237 h.flash(_('Deleted gist %s') % c.gist.gist_access_id, category='success')
238 238
239 239 raise HTTPFound(h.route_url('gists_show'))
240 240
241 241 def _get_gist(self, gist_id):
242 242
243 243 gist = Gist.get_or_404(gist_id)
244 244
245 245 # Check if this gist is expired
246 246 if gist.gist_expires != -1:
247 247 if time.time() > gist.gist_expires:
248 248 log.error(
249 249 'Gist expired at %s', time_to_datetime(gist.gist_expires))
250 250 raise HTTPNotFound()
251 251
252 252 # check if this gist requires a login
253 253 is_default_user = self._rhodecode_user.username == User.DEFAULT_USER
254 254 if gist.acl_level == Gist.ACL_LEVEL_PRIVATE and is_default_user:
255 255 log.error("Anonymous user %s tried to access protected gist `%s`",
256 256 self._rhodecode_user, gist_id)
257 257 raise HTTPNotFound()
258 258 return gist
259 259
260 260 @LoginRequired()
261 261 @view_config(
262 262 route_name='gist_show', request_method='GET',
263 renderer='rhodecode:templates/admin/gists/show.mako')
263 renderer='rhodecode:templates/admin/gists/gist_show.mako')
264 264 @view_config(
265 265 route_name='gist_show_rev', request_method='GET',
266 renderer='rhodecode:templates/admin/gists/show.mako')
266 renderer='rhodecode:templates/admin/gists/gist_show.mako')
267 267 @view_config(
268 268 route_name='gist_show_formatted', request_method='GET',
269 269 renderer=None)
270 270 @view_config(
271 271 route_name='gist_show_formatted_path', request_method='GET',
272 272 renderer=None)
273 273 def gist_show(self):
274 274 gist_id = self.request.matchdict['gist_id']
275 275
276 276 # TODO(marcink): expose those via matching dict
277 277 revision = self.request.matchdict.get('revision', 'tip')
278 278 f_path = self.request.matchdict.get('f_path', None)
279 279 return_format = self.request.matchdict.get('format')
280 280
281 281 c = self.load_default_context()
282 282 c.gist = self._get_gist(gist_id)
283 283 c.render = not self.request.GET.get('no-render', False)
284 284
285 285 try:
286 286 c.file_last_commit, c.files = GistModel().get_gist_files(
287 287 gist_id, revision=revision)
288 288 except VCSError:
289 289 log.exception("Exception in gist show")
290 290 raise HTTPNotFound()
291 291
292 292 if return_format == 'raw':
293 293 content = '\n\n'.join([f.content for f in c.files
294 294 if (f_path is None or f.path == f_path)])
295 295 response = Response(content)
296 296 response.content_type = 'text/plain'
297 297 return response
298 298 elif return_format:
299 299 raise HTTPBadRequest()
300 300
301 301 return self._get_template_context(c)
302 302
303 303 @LoginRequired()
304 304 @NotAnonymous()
305 305 @view_config(
306 306 route_name='gist_edit', request_method='GET',
307 renderer='rhodecode:templates/admin/gists/edit.mako')
307 renderer='rhodecode:templates/admin/gists/gist_edit.mako')
308 308 def gist_edit(self):
309 309 _ = self.request.translate
310 310 gist_id = self.request.matchdict['gist_id']
311 311 c = self.load_default_context()
312 312 c.gist = self._get_gist(gist_id)
313 313
314 314 owner = c.gist.gist_owner == self._rhodecode_user.user_id
315 315 if not (h.HasPermissionAny('hg.admin')() or owner):
316 316 raise HTTPNotFound()
317 317
318 318 try:
319 319 c.file_last_commit, c.files = GistModel().get_gist_files(gist_id)
320 320 except VCSError:
321 321 log.exception("Exception in gist edit")
322 322 raise HTTPNotFound()
323 323
324 324 if c.gist.gist_expires == -1:
325 325 expiry = _('never')
326 326 else:
327 327 # this cannot use timeago, since it's used in select2 as a value
328 328 expiry = h.age(h.time_to_datetime(c.gist.gist_expires))
329 329
330 330 c.lifetime_values.append(
331 331 (0, _('%(expiry)s - current value') % {'expiry': _(expiry)})
332 332 )
333 333
334 334 return self._get_template_context(c)
335 335
336 336 @LoginRequired()
337 337 @NotAnonymous()
338 338 @CSRFRequired()
339 339 @view_config(
340 340 route_name='gist_update', request_method='POST',
341 renderer='rhodecode:templates/admin/gists/edit.mako')
341 renderer='rhodecode:templates/admin/gists/gist_edit.mako')
342 342 def gist_update(self):
343 343 _ = self.request.translate
344 344 gist_id = self.request.matchdict['gist_id']
345 345 c = self.load_default_context()
346 346 c.gist = self._get_gist(gist_id)
347 347
348 348 owner = c.gist.gist_owner == self._rhodecode_user.user_id
349 349 if not (h.HasPermissionAny('hg.admin')() or owner):
350 350 raise HTTPNotFound()
351 351
352 352 data = peppercorn.parse(self.request.POST.items())
353 353
354 354 schema = gist_schema.GistSchema()
355 355 schema = schema.bind(
356 356 # '0' is special value to leave lifetime untouched
357 357 lifetime_options=[x[0] for x in c.lifetime_values] + [0],
358 358 )
359 359
360 360 try:
361 361 schema_data = schema.deserialize(data)
362 362 # convert to safer format with just KEYs so we sure no duplicates
363 363 schema_data['nodes'] = gist_schema.sequence_to_nodes(
364 364 schema_data['nodes'])
365 365
366 366 GistModel().update(
367 367 gist=c.gist,
368 368 description=schema_data['description'],
369 369 owner=c.gist.owner,
370 370 gist_mapping=schema_data['nodes'],
371 371 lifetime=schema_data['lifetime'],
372 372 gist_acl_level=schema_data['gist_acl_level']
373 373 )
374 374
375 375 Session().commit()
376 376 h.flash(_('Successfully updated gist content'), category='success')
377 377 except NodeNotChangedError:
378 378 # raised if nothing was changed in repo itself. We anyway then
379 379 # store only DB stuff for gist
380 380 Session().commit()
381 381 h.flash(_('Successfully updated gist data'), category='success')
382 382 except validation_schema.Invalid as errors:
383 383 errors = h.escape(errors.asdict())
384 384 h.flash(_('Error occurred during update of gist {}: {}').format(
385 385 gist_id, errors), category='error')
386 386 except Exception:
387 387 log.exception("Exception in gist edit")
388 388 h.flash(_('Error occurred during update of gist %s') % gist_id,
389 389 category='error')
390 390
391 391 raise HTTPFound(h.route_url('gist_show', gist_id=gist_id))
392 392
393 393 @LoginRequired()
394 394 @NotAnonymous()
395 395 @view_config(
396 396 route_name='gist_edit_check_revision', request_method='GET',
397 397 renderer='json_ext')
398 398 def gist_edit_check_revision(self):
399 399 _ = self.request.translate
400 400 gist_id = self.request.matchdict['gist_id']
401 401 c = self.load_default_context()
402 402 c.gist = self._get_gist(gist_id)
403 403
404 404 last_rev = c.gist.scm_instance().get_commit()
405 405 success = True
406 406 revision = self.request.GET.get('revision')
407 407
408 408 if revision != last_rev.raw_id:
409 409 log.error('Last revision %s is different then submitted %s',
410 410 revision, last_rev)
411 411 # our gist has newer version than we
412 412 success = False
413 413
414 414 return {'success': success}
@@ -1,139 +1,137 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.mako"/>
3 3
4 4 <%def name="title()">
5 5 ${_('Edit Gist')} &middot; ${c.gist.gist_access_id}
6 6 %if c.rhodecode_name:
7 7 &middot; ${h.branding(c.rhodecode_name)}
8 8 %endif
9 9 </%def>
10 10
11 <%def name="breadcrumbs_links()">
12 ${_('Edit Gist')} &middot; ${c.gist.gist_access_id}
13 </%def>
11 <%def name="breadcrumbs_links()"></%def>
14 12
15 13 <%def name="menu_bar_nav()">
16 14 ${self.menu_items(active='gists')}
17 15 </%def>
18 16
19 17 <%def name="main()">
20 18 <div class="box">
21 19 <!-- box / title -->
22 20 <div class="title">
23 ${self.breadcrumbs()}
21
24 22 </div>
25 23
26 24 <div class="table">
27
28 25 <div id="files_data">
29 26 ${h.secure_form(h.route_path('gist_update', gist_id=c.gist.gist_access_id), id='eform', request=request)}
30 27 <div>
31 28 <input type="hidden" value="${c.file_last_commit.raw_id}" name="parent_hash">
32 <textarea id="description" name="description"
33 placeholder="${_('Gist description ...')}">${c.gist.gist_description}</textarea>
34 29 <div>
35 30 <span class="gist-gravatar">
36 31 ${self.gravatar(h.email_or_none(c.rhodecode_user.full_contact), 30)}
37 32 </span>
38 33 <label for='lifetime'>${_('Gist lifetime')}</label>
39 34 ${h.dropdownmenu('lifetime', '0', c.lifetime_options)}
40 35
41 36 <label for='gist_acl_level'>${_('Gist access level')}</label>
42 37 ${h.dropdownmenu('gist_acl_level', c.gist.acl_level, c.acl_options)}
38
39 <textarea style="margin-top: 5px; border-color: #dbd9da" id="description" name="description"
40 placeholder="${_('Gist description ...')}">${c.gist.gist_description}</textarea>
43 41 </div>
44 42 </div>
45 43
46 44 ## peppercorn schema
47 45 <input type="hidden" name="__start__" value="nodes:sequence"/>
48 46 % for cnt, file in enumerate(c.files):
49 47 <input type="hidden" name="__start__" value="file:mapping"/>
50 48 <div id="codeblock" class="codeblock" >
51 49 <div class="code-header">
52 50 <div class="form">
53 51 <div class="fields">
54 52 <input type="hidden" name="filename_org" value="${file.path}" >
55 53 <input id="filename_${h.FID('f',file.path)}" name="filename" size="30" type="text" value="${file.path}">
56 54 ${h.dropdownmenu('mimetype' ,'plain',[('plain',_('plain'))],enable_filter=True, id='mimetype_'+h.FID('f',file.path))}
57 55 </div>
58 56 </div>
59 57 </div>
60 58 <div class="editor_container">
61 59 <pre id="editor_pre"></pre>
62 60 <textarea id="editor_${h.FID('f',file.path)}" name="content" >${file.content}</textarea>
63 61 </div>
64 62 </div>
65 63 <input type="hidden" name="__end__" />
66 64
67 65 ## dynamic edit box.
68 66 <script type="text/javascript">
69 67 $(document).ready(function(){
70 68 var myCodeMirror = initCodeMirror(
71 69 "editor_${h.FID('f',file.path)}", '');
72 70
73 71 var modes_select = $("#mimetype_${h.FID('f',file.path)}");
74 72 fillCodeMirrorOptions(modes_select);
75 73
76 74 // try to detect the mode based on the file we edit
77 75 var mimetype = "${file.mimetype}";
78 76 var detected_mode = detectCodeMirrorMode(
79 77 "${file.path}", mimetype);
80 78
81 79 if(detected_mode){
82 80 $(modes_select).select2("val", mimetype);
83 81 $(modes_select).change();
84 82 setCodeMirrorMode(myCodeMirror, detected_mode);
85 83 }
86 84
87 85 var filename_selector = "#filename_${h.FID('f',file.path)}";
88 86 // on change of select field set mode
89 87 setCodeMirrorModeFromSelect(
90 88 modes_select, filename_selector, myCodeMirror, null);
91 89
92 90 // on entering the new filename set mode, from given extension
93 91 setCodeMirrorModeFromInput(
94 92 modes_select, filename_selector, myCodeMirror, null);
95 93 });
96 94 </script>
97 95 %endfor
98 96 <input type="hidden" name="__end__" />
99 97
100 98 <div class="pull-right">
101 99 ${h.submit('update',_('Update Gist'),class_="btn btn-success")}
102 100 <a class="btn" href="${h.route_path('gist_show', gist_id=c.gist.gist_access_id)}">${_('Cancel')}</a>
103 101 </div>
104 102 ${h.end_form()}
105 103 </div>
106 104 </div>
107 105
108 106 </div>
109 107 <script>
110 108 $('#update').on('click', function(e){
111 109 e.preventDefault();
112 110
113 111 $(this).val('Updating...');
114 112 $(this).attr('disabled', 'disabled');
115 113 // check for newer version.
116 114 $.ajax({
117 115 url: "${h.route_path('gist_edit_check_revision', gist_id=c.gist.gist_access_id)}",
118 116 data: {
119 117 'revision': '${c.file_last_commit.raw_id}'
120 118 },
121 119 dataType: 'json',
122 120 type: 'GET',
123 121 success: function(data) {
124 122 if(data.success === false){
125 123 message = '${h.literal(_('Gist was updated since you started editing. Copy your changes and click %(here)s to reload the new version.')
126 124 % {'here': h.link_to('here', h.route_path('gist_edit', gist_id=c.gist.gist_access_id))})}'
127 125 alertMessage = [{"message": {
128 126 "message": message, "force": "true", "level": "warning"}}];
129 127 $.Topic('/notifications').publish(alertMessage[0]);
130 128 }
131 129 else{
132 130 $('#eform').submit();
133 131 }
134 132 }
135 133 });
136 134 })
137 135
138 136 </script>
139 137 </%def>
1 NO CONTENT: file renamed from rhodecode/templates/admin/gists/index.mako to rhodecode/templates/admin/gists/gist_index.mako
@@ -1,85 +1,85 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.mako"/>
3 3
4 4 <%def name="title()">
5 5 ${_('New Gist')}
6 6 %if c.rhodecode_name:
7 7 &middot; ${h.branding(c.rhodecode_name)}
8 8 %endif
9 9 </%def>
10 10
11 11 <%def name="breadcrumbs_links()"></%def>
12 12
13 13 <%def name="menu_bar_nav()">
14 14 ${self.menu_items(active='gists')}
15 15 </%def>
16 16
17 17 <%def name="main()">
18 18 <div class="box">
19 19 <!-- box / title -->
20 20 <div class="title">
21 21
22 22 </div>
23 23
24 24 <div class="table">
25 25 <div id="files_data">
26 26 ${h.secure_form(h.route_path('gists_create'), id='eform', request=request)}
27 27 <div>
28 28 <span class="gist-gravatar">
29 29 ${self.gravatar(c.rhodecode_user.email, 30)}
30 30 </span>
31 31 <label for='gistid'>${_('Gist id')}</label>
32 32 ${h.text('gistid', placeholder=_('Auto generated'))}
33 33
34 34 <label for='lifetime'>${_('Gist lifetime')}</label>
35 35 ${h.dropdownmenu('lifetime', '', c.lifetime_options)}
36 36
37 37 <label for='acl_level'>${_('Gist access level')}</label>
38 38 ${h.dropdownmenu('gist_acl_level', '', c.acl_options)}
39 39
40 <textarea style="margin-top: 5px" id="description" name="description" placeholder="${_('Gist description ...')}"></textarea>
40 <textarea style="margin-top: 5px; border-color: #dbd9da" id="description" name="description" placeholder="${_('Gist description ...')}"></textarea>
41 41 </div>
42 42
43 43 <div id="codeblock" class="codeblock">
44 44 <div class="code-header">
45 45 <div class="form">
46 46 <div class="fields">
47 47 ${h.text('filename', size=30, placeholder=_('name gist file...'))}
48 48 ${h.dropdownmenu('mimetype','plain',[('plain',_('plain'))],enable_filter=True)}
49 49 </div>
50 50 </div>
51 51 </div>
52 52
53 53 <div id="editor_container">
54 54 <div id="editor_pre"></div>
55 55 <textarea id="editor" name="content" ></textarea>
56 56 </div>
57 57 </div>
58 58
59 59 <div class="pull-right">
60 60 ${h.submit('private',_('Create Private Gist'),class_="btn")}
61 61 ${h.submit('public',_('Create Public Gist'),class_="btn")}
62 62 </div>
63 63 ${h.end_form()}
64 64 </div>
65 65 </div>
66 66
67 67 </div>
68 68
69 69 <script type="text/javascript">
70 70 var myCodeMirror = initCodeMirror('editor', '');
71 71
72 72 var modes_select = $('#mimetype');
73 73 fillCodeMirrorOptions(modes_select);
74 74
75 75 var filename_selector = '#filename';
76 76 // on change of select field set mode
77 77 setCodeMirrorModeFromSelect(
78 78 modes_select, filename_selector, myCodeMirror, null);
79 79
80 80 // on entering the new filename set mode, from given extension
81 81 setCodeMirrorModeFromInput(
82 82 modes_select, filename_selector, myCodeMirror, null);
83 83
84 84 </script>
85 85 </%def>
1 NO CONTENT: file renamed from rhodecode/templates/admin/gists/show.mako to rhodecode/templates/admin/gists/gist_show.mako
General Comments 0
You need to be logged in to leave comments. Login now