Merge pull request #322 from robertop23/master
Allow create files from editor page in "files toggle"
This commit is contained in:
@@ -1239,7 +1239,6 @@ def plugin():
|
|||||||
languages=languages,
|
languages=languages,
|
||||||
crontab=crontab)
|
crontab=crontab)
|
||||||
|
|
||||||
|
|
||||||
def create_file():
|
def create_file():
|
||||||
""" Create files handler """
|
""" Create files handler """
|
||||||
if request.vars and not request.vars.token == session.token:
|
if request.vars and not request.vars.token == session.token:
|
||||||
@@ -1250,6 +1249,8 @@ def create_file():
|
|||||||
app = get_app(request.vars.app)
|
app = get_app(request.vars.app)
|
||||||
path = abspath(request.vars.location)
|
path = abspath(request.vars.location)
|
||||||
else:
|
else:
|
||||||
|
if request.vars.dir:
|
||||||
|
request.vars.location += request.vars.dir + '/'
|
||||||
app = get_app(name=request.vars.location.split('/')[0])
|
app = get_app(name=request.vars.location.split('/')[0])
|
||||||
path = apath(request.vars.location, r=request)
|
path = apath(request.vars.location, r=request)
|
||||||
filename = re.sub('[^\w./-]+', '_', request.vars.filename)
|
filename = re.sub('[^\w./-]+', '_', request.vars.filename)
|
||||||
@@ -1377,7 +1378,11 @@ def create_file():
|
|||||||
|
|
||||||
safe_write(full_filename, text)
|
safe_write(full_filename, text)
|
||||||
log_progress(app, 'CREATE', filename)
|
log_progress(app, 'CREATE', filename)
|
||||||
session.flash = T('file "%(filename)s" created',
|
if request.vars.dir:
|
||||||
|
result = T('file "%(filename)s" created',
|
||||||
|
dict(filename=full_filename[len(path):]))
|
||||||
|
else:
|
||||||
|
session.flash = T('file "%(filename)s" created',
|
||||||
dict(filename=full_filename[len(path):]))
|
dict(filename=full_filename[len(path):]))
|
||||||
vars = {}
|
vars = {}
|
||||||
if request.vars.id:
|
if request.vars.id:
|
||||||
@@ -1390,9 +1395,40 @@ def create_file():
|
|||||||
if not isinstance(e, HTTP):
|
if not isinstance(e, HTTP):
|
||||||
session.flash = T('cannot create file')
|
session.flash = T('cannot create file')
|
||||||
|
|
||||||
redirect(request.vars.sender + anchor)
|
if request.vars.dir:
|
||||||
|
id_filename = '#' + request.vars.dir + '__' + filename.replace('.','__') + ' a'
|
||||||
|
return response.json({'result':result, 'id_filename':id_filename})
|
||||||
|
else:
|
||||||
|
redirect(request.vars.sender + anchor)
|
||||||
|
|
||||||
|
|
||||||
|
def listfiles(app, dir, regexp='.*\.py$'):
|
||||||
|
files = sorted(
|
||||||
|
listdir(apath('%(app)s/%(dir)s/' % {'app':app, 'dir':dir}, r=request), regexp))
|
||||||
|
files = [x.replace('\\', '/') for x in files if not x.endswith('.bak')]
|
||||||
|
return files
|
||||||
|
|
||||||
|
def editfile(path,file,vars={}, app = None):
|
||||||
|
args=(path,file) if 'app' in vars else (app,path,file)
|
||||||
|
url = URL('edit', args=args, vars=vars)
|
||||||
|
return A(file, _class='editor_filelink', _href=url, _style='word-wrap: nowrap;')
|
||||||
|
|
||||||
|
def files_menu():
|
||||||
|
app = 'welcome'#request.args[0]
|
||||||
|
dirs=[{'name':'models', 'reg':'.*\.py$'},
|
||||||
|
{'name':'controllers', 'reg':'.*\.py$'},
|
||||||
|
{'name':'views', 'reg':'[\w/\-]+(\.\w+)+$'},
|
||||||
|
{'name':'modules', 'reg':'.*\.py$'},
|
||||||
|
{'name':'static', 'reg': '[^\.#].*'}]
|
||||||
|
result_files = []
|
||||||
|
for dir in dirs:
|
||||||
|
result_files.append(TAG[''](LI(dir['name'], _class="nav-header component", _onclick="collapse('" + dir['name'] + "_files');"),
|
||||||
|
LI(UL(*[LI(editfile(dir['name'], f, dict(id=dir['name'] + f.replace('.','__')), app), _style="overflow:hidden", _id=dir['name']+"__"+f.replace('.','__'))
|
||||||
|
for f in listfiles(app, dir['name'], regexp=dir['reg'])],
|
||||||
|
_class="nav nav-list small-font"),
|
||||||
|
_id=dir['name'] + '_files', _style="display: none;")))
|
||||||
|
return dict(result_files = result_files)
|
||||||
|
|
||||||
def upload_file():
|
def upload_file():
|
||||||
""" File uploading handler """
|
""" File uploading handler """
|
||||||
if request.vars and not request.vars.token == session.token:
|
if request.vars and not request.vars.token == session.token:
|
||||||
|
|||||||
@@ -1,4 +1,32 @@
|
|||||||
{{extend 'layout.html'}}
|
{{extend 'layout.html'}}
|
||||||
|
{{
|
||||||
|
dirs=[{'name':'models', 'reg':'.*\.py$'},
|
||||||
|
{'name':'controllers', 'reg':'.*\.py$'},
|
||||||
|
{'name':'views', 'reg':'[\w/\-]+(\.\w+)+$'},
|
||||||
|
{'name':'modules', 'reg':'.*\.py$'},
|
||||||
|
{'name':'static', 'reg': '[^\.#].*'}]
|
||||||
|
|
||||||
|
def file_create_form(location, anchor=None, helptext=""):
|
||||||
|
form=FORM(
|
||||||
|
LABEL(T("create file with filename:")),
|
||||||
|
SELECT(_name='dir', _style='width:100px;',
|
||||||
|
*[OPTION(dir['name'], _value=dir['name']) for dir in dirs]),
|
||||||
|
XML(' '),LABEL('/', _style='display:inline-block;'),XML(' '),
|
||||||
|
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY(),_class=''),
|
||||||
|
TAG['SMALL'](helptext,_class="help-block"),
|
||||||
|
INPUT(_type='submit', name=T('filename'), _value=T('Create'), _style='display:block', _id='btn_file_create'),
|
||||||
|
INPUT(_type="hidden",_name="editor"),
|
||||||
|
INPUT(_type="hidden",_name="location",_value=location),
|
||||||
|
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)),
|
||||||
|
INPUT(_type="hidden",_name="token",_value=session.token),
|
||||||
|
#INPUT(_type="hidden",_name="id",_value=anchor),
|
||||||
|
_action=URL('create_file'),
|
||||||
|
_id='file_create_form',
|
||||||
|
_class="generatedbyw2p well well-small")
|
||||||
|
return form
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
<!-- begin "edit" block -->
|
<!-- begin "edit" block -->
|
||||||
{{
|
{{
|
||||||
def shortcut(combo, description):
|
def shortcut(combo, description):
|
||||||
@@ -204,27 +232,43 @@ $(document).on('click', 'a.font_button', function (e) {
|
|||||||
<div class="files-menu">
|
<div class="files-menu">
|
||||||
<ul class="nav nav-list" rel="pagebookmark" id="filelist">
|
<ul class="nav nav-list" rel="pagebookmark" id="filelist">
|
||||||
<li><input type="text" placeholder="{{=T('Rapid Search')}}" class="input-block-level typeahead-tw search-query"></li>
|
<li><input type="text" placeholder="{{=T('Rapid Search')}}" class="input-block-level typeahead-tw search-query"></li>
|
||||||
{{dirs=[{'name':'models', 'reg':'.*\.py$'},
|
|
||||||
{'name':'controllers', 'reg':'.*\.py$'},
|
|
||||||
{'name':'views', 'reg':'[\w/\-]+(\.\w+)+$'},
|
|
||||||
{'name':'modules', 'reg':'.*\.py$'}, ]}}
|
|
||||||
{{auto_complete_list=[]}}
|
{{auto_complete_list=[]}}
|
||||||
{{for dir in dirs:}}
|
<br />
|
||||||
<li class="nav-header component" onclick="collapse('{{="%s_files" % dir['name']}}');">{{=dir['name']}}</li>
|
<div>
|
||||||
<li id="{{="%s_files" % dir['name']}}">
|
<button onclick="jQuery('#form').slideToggle()" class="btn btn-mini">{{=T('Create')}}</button>
|
||||||
<ul class="nav nav-list small-font">
|
<br />
|
||||||
{{for f in listfiles(app, dir['name'], regexp=dir['reg'] ):}}
|
<div id="form">
|
||||||
{{id="%s__" % dir['name'] + f.replace('.','__')}}
|
<div>
|
||||||
{{current_file = request.args(len(request.args) - 1)}}
|
{{=file_create_form('%s/' % app, '')}}
|
||||||
<li class="{{#='active' if current_file==f else ''}}" style="overflow:hidden">
|
<script>
|
||||||
{{a_tag=editfile(dir['name'], f, dict(id=id))}}
|
jQuery("#btn_file_create").click(function() {
|
||||||
{{=a_tag}}
|
jQuery.ajax({
|
||||||
{{auto_complete_list.append({'value':f, 'tokens':f.split('/'), 'a_tag':a_tag})}}
|
type: "POST",
|
||||||
</li>
|
url: "{{=URL('create_file')}}",
|
||||||
{{pass}}
|
data: jQuery("#file_create_form").serialize(),
|
||||||
</ul>
|
dataType: 'JSON',
|
||||||
</li>
|
success: function(data){
|
||||||
{{pass}}
|
jQuery(".flash").html(data["result"]);
|
||||||
|
jQuery(".flash").show();
|
||||||
|
jQuery.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "{{=URL('files_menu')}}",
|
||||||
|
success: function(data){
|
||||||
|
jQuery("#files_menu").html(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>jQuery('#form').slideToggle()</script>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div id="files_menu">
|
||||||
|
{{=LOAD('default', 'files_menu', args=['welcome'])}}
|
||||||
|
</div>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{{for files in result_files:}}
|
||||||
|
{{=files}}
|
||||||
|
{{pass}}
|
||||||
Reference in New Issue
Block a user