removed webshell
This commit is contained in:
@@ -1,3 +1,11 @@
|
||||
|
||||
## 2.15.x
|
||||
- web2py does not support python 2.6 anymore
|
||||
- py3.5 syntax compatible (see #1353 for details)
|
||||
- dropped web shell from admin
|
||||
- scheduler new feature: you can now specify intervals with cron
|
||||
|
||||
|
||||
## 2.14.6
|
||||
|
||||
- Increased test coverage (thanks Richard)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import os
|
||||
import sys
|
||||
#import gluon.contrib.shell
|
||||
import gluon.dal
|
||||
import gluon.html
|
||||
import gluon.validators
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
import sys
|
||||
import gluon.contrib.shell
|
||||
import code
|
||||
import thread
|
||||
import cgi
|
||||
from gluon.shell import env
|
||||
from gluon._compat import StringIO
|
||||
|
||||
if DEMO_MODE or MULTI_USER_MODE:
|
||||
session.flash = T('disabled in demo mode')
|
||||
redirect(URL('default', 'site'))
|
||||
|
||||
FE = 10 ** 9
|
||||
|
||||
|
||||
def index():
|
||||
app = request.args(0) or 'admin'
|
||||
reset()
|
||||
return dict(app=app)
|
||||
|
||||
|
||||
def callback():
|
||||
app = request.args[0]
|
||||
command = request.vars.statement
|
||||
escape = command[:1] != '!'
|
||||
history = session['history:' + app] = session.get(
|
||||
'history:' + app, gluon.contrib.shell.History())
|
||||
if not escape:
|
||||
command = command[1:]
|
||||
if command == '%reset':
|
||||
reset()
|
||||
return '*** reset ***'
|
||||
elif command[0] == '%':
|
||||
try:
|
||||
command = session['commands:' + app][int(command[1:])]
|
||||
except ValueError:
|
||||
return ''
|
||||
session['commands:' + app].append(command)
|
||||
environ = env(app, True, extra_request=dict(is_https=request.is_https))
|
||||
output = gluon.contrib.shell.run(history, command, environ)
|
||||
k = len(session['commands:' + app]) - 1
|
||||
#output = PRE(output)
|
||||
#return TABLE(TR('In[%i]:'%k,PRE(command)),TR('Out[%i]:'%k,output))
|
||||
return cgi.escape('In [%i] : %s%s\n' % (k + 1, command, output))
|
||||
|
||||
|
||||
def reset():
|
||||
app = request.args(0) or 'admin'
|
||||
session['commands:' + app] = []
|
||||
session['history:' + app] = gluon.contrib.shell.History()
|
||||
return 'done'
|
||||
@@ -98,7 +98,6 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
<div id="controllers_inner">
|
||||
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||
<div data-role="controlgroup" data-type="horizontal">
|
||||
{{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}}
|
||||
{{=button(URL('test',args=app), T("test"))}}
|
||||
{{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
|
||||
</div>
|
||||
|
||||
@@ -149,7 +149,6 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
<div id="controllers_inner" class="component_contents">
|
||||
{{if not controllers:}}<p><strong>{{=T("There are no controllers")}}</strong></p>{{else:}}
|
||||
<div class="controls comptools">
|
||||
{{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}}
|
||||
{{=button(URL('test',args=app), T("test"))}}
|
||||
{{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
|
||||
</div>
|
||||
|
||||
@@ -1,117 +0,0 @@
|
||||
{{extend 'layout.html'}}
|
||||
{{block sectionclass}}shell{{end}}
|
||||
<!-- begin "shell" block -->
|
||||
<div id="wrapper">
|
||||
<div class="row-fluid">
|
||||
<div class="output-wrapper span8">
|
||||
<textarea id="output" readonly="readonly">web2py Shell {{=request.env.web2py_version}}
|
||||
</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row-fluid">
|
||||
<form id="form" action="{{=URL(r=request,f='callback',args=app)}}" method="get" class="span8">
|
||||
<div id="shellwrapper">
|
||||
<div class="prompt-wrapper">
|
||||
<div class="prompt-container">
|
||||
<textarea class="prompt" name="statement" id="statement"></textarea>
|
||||
</div>
|
||||
<a href="#" rel="tooltip" data-placement="right" data-original-title="{{=T('Type some Python code in here and hit Return (Enter) to execute it.')}}">
|
||||
{{=helpicon()}}
|
||||
<span>Type some Python code in here and hit Return (Enter) to execute it.</span>
|
||||
</a>
|
||||
</div>
|
||||
<div id="caret"><span>>>></span></div>
|
||||
<div id="autoscroll">autoscroll</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="row-fluid clearfix">
|
||||
<div class="help alert alert-info span6">
|
||||
<ul>
|
||||
<li>Using the shell may lock the database to other users of this app.</li>
|
||||
<li>Each db statement is automatically committed.</li>
|
||||
<li>Creating new tables dynamically is not allowed.</li>
|
||||
<li>Models are automatically imported in the shell.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="{{=URL('static', 'js/autoscroll.js')}}"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var bShellScrolling=0
|
||||
jQuery(document).ready(function(){
|
||||
jQuery('#statement').focus();
|
||||
|
||||
jQuery('#statement').keyup(function(event){
|
||||
var t=jQuery(this),
|
||||
s=t.val(),
|
||||
o=jQuery('#output'),
|
||||
RETURN = 38;
|
||||
if(s=='\n') t.val('');
|
||||
if(s.length>1 && s.substr(s.length-1,1)=='\n' && s.substr(s.length-2,1)!=':' &&
|
||||
(s.indexOf(':\n ')<0 || s.substr(s.length-2,1)=='\n')) {
|
||||
t.val('');
|
||||
jQuery.post("{{=URL(r=request,f='callback',args=app)}}",
|
||||
{statement:s},function(data){o.html(o.html()+data).attr('scrollTop',o.attr('scrollHeight'));});
|
||||
} else { };
|
||||
if(event.keyCode==RETURN){
|
||||
var i=s.length
|
||||
if(i==0){
|
||||
var s=o.find('table:last pre:first').text();
|
||||
bShellScrolling=o.find('table').length;
|
||||
}else if(bShellScrolling){
|
||||
var i=bShellScrolling
|
||||
if(i<1){
|
||||
return
|
||||
}else{
|
||||
i--
|
||||
var s=o.find('table:nth-child('+(i)+') pre:first').text();
|
||||
bShellScrolling=i
|
||||
}
|
||||
}else if(s.indexOf('\n')<0){
|
||||
var oo=o.find('tr:first-child pre:contains("'+s+'")')
|
||||
if(oo.length==0){
|
||||
return
|
||||
}else if(oo.length==1){
|
||||
s=oo.text();
|
||||
}else{
|
||||
sVar=oo.text();
|
||||
o.html(o.html()+'<dd>'+s+' ?</dd><dt>'+sVar+'</dt>').attr('scrollTop',o.attr('scrollHeight'))
|
||||
return
|
||||
}
|
||||
}else{
|
||||
//multistring expr
|
||||
return;
|
||||
}
|
||||
// if(s.slice(s.length-1)=='\n'){
|
||||
s=s.slice(0,s.length-1)
|
||||
// }
|
||||
t.val(s);
|
||||
}
|
||||
if(bShellScrolling && event.keyCode==40){
|
||||
var i=bShellScrolling
|
||||
i++
|
||||
var s=o.find('table:nth-child('+i+') tr:first-child pre').text();
|
||||
if(s){
|
||||
s=s.slice(0,s.length-1)
|
||||
t.val(s);
|
||||
bShellScrolling=i
|
||||
}else{
|
||||
bShellScrolling=0
|
||||
t.val('')
|
||||
}
|
||||
};
|
||||
if(bShellScrolling && (event.keyCode==37 || event.keyCode==39)){
|
||||
bShellScrolling=0;
|
||||
};
|
||||
if(event.keyCode==27){
|
||||
bShellScrolling=0;
|
||||
t.val('');
|
||||
};
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<!-- end "shell" block -->
|
||||
@@ -77,9 +77,10 @@ input:invalid, input.error, textarea:invalid, textarea.error {background: #ffdfd
|
||||
.container>.quarter, .container>.half, .container>.third, .container>.twothirds, .container>.threequarters {display:inline-block; padding: 0 20px 0 0; vertical-align:top}
|
||||
.container>.fill{display: inline-block}
|
||||
.container img, .container video {max-width:100%}
|
||||
.max900 {margin-left:auto; margin-right:auto}
|
||||
|
||||
@media all and (min-width:800px) {
|
||||
.max900 {max-width:900px; margin-left:auto; margin-right:auto}
|
||||
.max900 {max-width:900px}
|
||||
.quarter {width:25%; margin-right:-5px}
|
||||
.half {width:50%; margin-right:-10px}
|
||||
.third {width:33.33%; margin-right:-6.66px}
|
||||
|
||||
+1
-1
Submodule gluon/packages/dal updated: d13e82fcb4...dba8fa826b
Reference in New Issue
Block a user