working upload, traversing, and delete

This commit is contained in:
Andrew Davidson 2012-04-19 22:08:08 -07:00
parent fd59cf82ec
commit ddb66f6f91

View file

@ -1,8 +1,8 @@
import os, sys
import git
from git import *
from bottle import route, run, request, template, static_file
from os.path import isdir
from string import lower
from string import lower, split
from urllib import unquote
import shutil
from datetime import datetime
@ -22,7 +22,6 @@ conf['ext_render'] = []
@route('/private/<name:path>')
def public(name=''):
tree = []
data = []
filename, extension = os.path.splitext(name)
filename = os.path.basename(filename)
@ -30,17 +29,46 @@ def public(name=''):
path = os.path.join(conf['private'], name.lstrip('../'))
if os.path.exists(path):
if isdir(path) and not lower(extension) in conf['ext_bundles']:
tree.append('<ul>')
print "This is a regular dir: " + path
for f in os.listdir(path):
if not f.startswith('.') and not f.startswith('_'):
tree.append('<a href="/private/'+os.path.join(name,f)+'">'+f+'</a>')
if not name == '':
n = name.rstrip('/')
l = split(n, '/')
tree.append('<li>')
if len(l) > 1:
tree.append('<a href="/private/'+'/'.join(l[0:-1])+'">..</a>')
else:
tree.append('<a href="/private/">..</a>')
tree.append('</li>')
return template('templates/yield', content="<br/>".join(tree)+'<br/>'+ \
'<br/>'.join(data), title="Files in "+name)
dirs = []
files = []
for f in sorted(os.listdir(path)):
if not f.startswith('.') and not f.startswith('_'):
if isdir(os.path.join(path,f)):
dirs.append('<li>')
dirs.append('<a href="/private/'+os.path.join(name,f)+'">'+f+'</a>')
dirs.append('<a href="/delete/'+os.path.join(name,f)+'">(delete)</a>')
dirs.append('</li>')
else:
files.append('<li>')
files.append('<a href="/private/'+os.path.join(name,f)+'">'+f+'</a>')
files.append('<a href="/delete/'+os.path.join(name,f)+'">(delete)</a>')
files.append('</li>')
for d in dirs: tree.append(d)
for f in files: tree.append(f)
tree.append('</ul>')
tree.append('<p><a href="/upload/'+name+'">Upload here</a>.</p>')
return template('templates/yield', content="\n".join(tree), title="Files in "+name)
else:
@ -71,7 +99,6 @@ def public(name=''):
return template('templates/yield', content = content, \
title=filename+extension)
else:
print "This is a file: " + unquote(name)
@ -84,9 +111,10 @@ def public(name=''):
@route('/upload/:path', method="GET")
@route('/upload/', method="GET")
@route('/upload', method="GET")
def upload():
def upload(path=''):
body = []
@ -102,7 +130,10 @@ def upload():
body.append('<tr><td class="l"><label for="uploaded">Upload:</label></td>')
body.append('<td class="r"><input type="file" name="uploaded" /></td></tr>')
body.append('<tr><td class="l"><label for="path">Destination:</label></td>')
body.append('<td class="r"><input type="text" name="path" style="width:250px" /></td></tr>')
body.append('<td class="r"><input type="text" name="path" style="width:250px" ')
if not path == '':
body.append('value="'+path+'" ')
body.append('/></td></tr>')
body.append('<tr><td class="l"><label for="message">Commit Message</label></td>')
body.append('<td class="r"><textarea name="message" cols="50" rows="7"></textarea></td></tr>')
body.append('<tr><td class="c"><input type="submit" name="submit"></td></tr>')
@ -116,19 +147,110 @@ def upload():
@route('/upload', method="POST")
def do_upload():
path = request.forms.path
message = request.forms.message
repo = Repo(conf['private'])
filename = request.forms.uploaded
path = request.forms.path
message = request.forms.message
u = request.files.uploaded
return "Path: " + path + '\nMessage: ' + message + '\n filename: ' + filename + '\n length: '+ str(len(u.file.read()))
filename = u.filename
new_file = os.path.join(conf['private'],path,filename)
if not os.path.exists(os.path.join(conf['private'],path)):
os.mkdir(os.path.join(conf['private'],path))
overwritten = False
if os.path.exists(new_file):
overwritten = True
w = open(new_file,'wb')
w.write(u.file.read())
w.close()
content = ['<p><a href="/private/'+path+'/'+filename+'">' + filename + '</a> uploaded to\
<a href="/private/'+path+'">/' + path + '</a>']
if overwritten:
content.append(' (original overwritten).</p>')
else:
content.append('.</p>')
if not overwritten or (overwritten and not repo.git.diff(new_file) == ""):
repo.git.add(new_file)
content.append("<p>Git: ")
commit_result = repo.git.commit(new_file,m=" '"+re.sub("'","\\'",message)+"'")
if not commit_result.endswith('.'):
commit_result += '.'
content.append(commit_result)
content.append('</p>')
else:
content.append('<p>Git: file is not different.</p>')
content.append('<p><a href="/upload">Upload another.</a></p>')
return template('templates/yield', content='\n'.join(content), title='"'+filename+'" uploaded.')
@route('/delete')
@route('/delete', method="GET")
@route('/delete/<path:path>', method="GET")
def delete(path = ''):
body = []
body.append('<style type="text/css">\
td.r { text-align: left; }\
td.c { text-align: center; }\
td.l { text-align: right; }\
</style>')
body.append('<h1>Delete a file</h1>')
body.append('<form style="width:500px;" method="post" action="/delete" enctype="multipart/form-data">')
body.append('<table>')
body.append('<tr><td class="l"><label for="path">File to be deleted:</label></td>')
body.append('<td class="r"><input type="text" name="path" style="width:250px" ')
if not path == '': body.append('value="'+path+'" ')
body.append('/></td></tr>')
body.append('<tr><td class="l"><label for="message">Commit Message</label></td>')
body.append('<td class="r"><textarea name="message" cols="50" rows="7"></textarea></td></tr>')
body.append('<tr><td><label for="delete">Do you really want to delete?</label></td>')
body.append('<td class="c"><input type="submit" name="delete" value="Yes."></td></tr>')
body.append('</table>')
body.append('</form>')
return template('templates/yield', content='\n'.join(body), title='Delete')
@route('/delete', method='POST')
def delete():
return "Delete stuff here."
body = []
repo = Repo(conf['private'])
path = request.forms.path
directory,filename = os.path.split(path)
directory = '/'+directory
message = request.forms.message
result = False
if os.path.exists(os.path.join(conf['private'],path)):
try:
repo.git.rm(path, r=True)
result = repo.git.commit(path, m=" '"+re.sub("'","\\'",message)+"'")
except:
if not isdir(os.path.join(conf['private'],path)):
os.remove(os.path.join(conf['private'],path))
body.append('<p>' + path + ' deleted from <a href="/private'+directory+'">'+directory+'</a>.</p>')
if result: body.append('<p>Git: '+result+'</p>')
else:
body.append('<p>'+path+' does not exist.</p>')
return template('templates/yield', content='\n'.join(body), title=path+' deleted.')
@route('/')
def index():