def upload_worksheet(): from sage.misc.misc import tmp_filename, tmp_dir from werkzeug import secure_filename import zipfile #XXX: i18n backlinks = """ Return to <a href="/upload" title="Upload a worksheet"><strong>Upload File</strong></a>.""" url = request.values['url'].strip() dir = '' if url: #Downloading a file from the internet import urllib filename = tmp_filename() + ('.zip' if url.endswith('.zip') else '.sws') urllib.urlretrieve(url, filename) else: #Uploading a file from the user's computer dir = tmp_dir() file = request.files['file'] if file.filename == '': return current_app.message( "Please specify a worksheet to load.%s" % backlinks) filename = secure_filename(file.filename) filename = os.path.join(dir, filename) file.save(filename) new_name = request.values.get('name', None) try: try: if filename.endswith('.zip'): # Extract all the .sws files from a zip file. zip_file = zipfile.ZipFile(filename) sws_file = os.path.join(dir, "tmp.sws") for sws in zip_file.namelist(): if sws.endswith('.sws'): open(sws_file, 'w').write(zip_file.read( sws)) # 2.6 zip_file.extract(sws, sws_file) W = g.notebook.import_worksheet(sws_file, g.username) if new_name: W.set_name("%s - %s" % (new_name, W.name())) return redirect(url_for('home', username=g.username)) else: W = g.notebook.import_worksheet(filename, g.username) except Exception, msg: s = 'There was an error uploading the worksheet. It could be an old unsupported format or worse. If you desperately need its contents contact the <a href="http://groups.google.com/group/sage-support">sage-support group</a> and post a link to your worksheet. Alternatively, an sws file is just a bzip2 tarball; take a look inside!%s' % backlinks return current_app.message(s, url_for('home', username=g.username)) finally: # Clean up the temporarily uploaded filename. os.unlink(filename) # if a temp directory was created, we delete it now. if dir: import shutil shutil.rmtree(dir)
def upload_worksheet(): from sage.misc.misc import tmp_filename, tmp_dir from werkzeug import secure_filename import zipfile #XXX: i18n backlinks = """ Return to <a href="/upload" title="Upload a worksheet"><strong>Upload File</strong></a>.""" url = request.values['url'].strip() dir = '' if url: #Downloading a file from the internet import urllib filename = tmp_filename() + ('.zip' if url.endswith('.zip') else '.sws') urllib.urlretrieve(url, filename) else: #Uploading a file from the user's computer dir = tmp_dir() file = request.files['file'] if file.filename == '': return current_app.message("Please specify a worksheet to load.%s" % backlinks) filename = secure_filename(file.filename) filename = os.path.join(dir, filename) file.save(filename) new_name = request.values.get('name', None) try: try: if filename.endswith('.zip'): # Extract all the .sws files from a zip file. zip_file = zipfile.ZipFile(filename) sws_file = os.path.join(dir, "tmp.sws") for sws in zip_file.namelist(): if sws.endswith('.sws'): open(sws_file, 'w').write(zip_file.read(sws)) # 2.6 zip_file.extract(sws, sws_file) W = g.notebook.import_worksheet(sws_file, g.username) if new_name: W.set_name("%s - %s" % (new_name, W.name())) return redirect(url_for('home', username=g.username)) else: W = g.notebook.import_worksheet(filename, g.username) except Exception, msg: s = 'There was an error uploading the worksheet. It could be an old unsupported format or worse. If you desperately need its contents contact the <a href="http://groups.google.com/group/sage-support">sage-support group</a> and post a link to your worksheet. Alternatively, an sws file is just a bzip2 tarball; take a look inside!%s' % backlinks return current_app.message(s, url_for('home', username=g.username)) finally: # Clean up the temporarily uploaded filename. os.unlink(filename) # if a temp directory was created, we delete it now. if dir: import shutil shutil.rmtree(dir)
def download_worksheets(): from sagenb.misc.misc import walltime, tmp_filename t = walltime() print "Starting zipping a group of worksheets in a separate thread..." zip_filename = tmp_filename() + ".zip" # child worksheet_names = set() if 'filenames' in request.values: import json filenames = json.loads(request.values['filenames']) worksheets = [ g.notebook.get_worksheet_with_filename(x.strip()) for x in filenames if len(x.strip()) > 0 ] else: worksheets = g.notebook.worksheet_list_for_user(g.username) import zipfile zip = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_STORED) for worksheet in worksheets: sws_filename = tmp_filename() + '.sws' g.notebook.export_worksheet(worksheet.filename(), sws_filename) entry_name = worksheet.name() if entry_name in worksheet_names: i = 2 while ("%s_%s" % (entry_name, i)) in worksheet_names: i += 1 entry_name = "%s_%s" % (entry_name, i) zip.write(sws_filename, entry_name + ".sws") os.unlink(sws_filename) zip.close() r = open(zip_filename, 'rb').read() os.unlink(zip_filename) print "Finished zipping %s worksheets (%s seconds)" % (len(worksheets), walltime(t)) response = current_app.make_response(r) response.headers['Content-Type'] = 'application/zip' return response
def download_worksheets(): from sagenb.misc.misc import walltime, tmp_filename t = walltime() print "Starting zipping a group of worksheets in a separate thread..." zip_filename = tmp_filename() + ".zip" # child worksheet_names = set() if 'filenames' in request.values: import json filenames = json.loads(request.values['filenames']) worksheets = [g.notebook.get_worksheet_with_filename(x.strip()) for x in filenames if len(x.strip()) > 0] else: worksheets = g.notebook.worksheet_list_for_user(g.username) import zipfile zip = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_STORED) for worksheet in worksheets: sws_filename = tmp_filename() + '.sws' g.notebook.export_worksheet(worksheet.filename(), sws_filename) entry_name = worksheet.name() if entry_name in worksheet_names: i = 2 while ("%s_%s" % (entry_name, i)) in worksheet_names: i += 1 entry_name = "%s_%s" % (entry_name, i) zip.write(sws_filename, entry_name + ".sws") os.unlink(sws_filename) zip.close() r = open(zip_filename, 'rb').read() os.unlink(zip_filename) print "Finished zipping %s worksheets (%s seconds)"%(len(worksheets), walltime(t)) response = current_app.make_response(r) response.headers['Content-Type'] = 'application/zip' return response
def unconditional_download(worksheet, title): from sagenb.misc.misc import tmp_filename from flask.helpers import send_file filename = tmp_filename() + '.sws' if title.endswith('.sws'): title = title[:-4] try: #XXX: Accessing the hard disk. g.notebook.export_worksheet(worksheet.filename(), filename, title) except KeyError: return current_app.message(_('No such worksheet.')) from flask.helpers import send_file return send_file(filename, mimetype='application/sage')
def upload_worksheet(): from sage.misc.misc import tmp_filename, tmp_dir from werkzeug.utils import secure_filename import zipfile if g.notebook.readonly_user(g.username): return current_app.message(_("Account is in read-only mode"), cont=url_for('home', username=g.username)) backlinks = _("""Return to <a href="/upload" title="Upload a worksheet"><strong>Upload File</strong></a>.""") url = request.values['url'].strip() dir = '' if url != '': #Downloading a file from the internet # The file will be downloaded from the internet and saved # to a temporary file with the same extension path = urlparse.urlparse(url).path extension = os.path.splitext(path)[1].lower() if extension not in ["", ".txt", ".sws", ".zip", ".html", ".rst"]: # Or shall we try to import the document as an sws when in doubt? return current_app.message("Unknown worksheet extension: %s. %s" % (extension, backlinks)) filename = tmp_filename()+extension try: import re matches = re.match("file://(?:localhost)?(/.+)", url) if matches: if g.notebook.interface != 'localhost': return current_app.message(_("Unable to load file URL's when not running on localhost.\n%(backlinks)s",backlinks=backlinks)) import shutil shutil.copy(matches.group(1),filename) else: my_urlretrieve(url, filename, backlinks=backlinks) except RetrieveError as err: return current_app.message(str(err)) else: #Uploading a file from the user's computer dir = tmp_dir() file = request.files['file'] if file.filename is None: return current_app.message(_("Please specify a worksheet to load.\n%(backlinks)s",backlinks=backlinks)) filename = secure_filename(file.filename) if len(filename)==0: return current_app.message(_("Invalid filename.\n%(backlinks)s",backlinks=backlinks)) filename = os.path.join(dir, filename) file.save(filename) new_name = request.values.get('name', None) try: try: if filename.endswith('.zip'): # Extract all the .sws files from a zip file. zip_file = zipfile.ZipFile(filename) for subfilename in zip_file.namelist(): prefix, extension = os.path.splitext(subfilename) # Mac zip files contain files like __MACOSX/._worksheet.sws # which are metadata files, so we skip those as # well as any other files we won't understand if extension in ['.sws', '.html', '.txt', '.rst'] and not prefix.startswith('__MACOSX/'): tmpfilename = os.path.join(dir, "tmp" + extension) try: tmpfilename = zip_file.extract(subfilename, tmpfilename) except AttributeError: open(tmpfilename, 'w').write(zip_file.read(subfilename)) W = g.notebook.import_worksheet(tmpfilename, g.username) if new_name: W.set_name("%s - %s" % (new_name, W.name())) else: print "Unknown extension, file %s is ignored" % subfilename return redirect(url_for('home', username=g.username)) else: if url and extension in ['', '.html']: linked_sws = parse_link_rel(url, filename) if linked_sws: # just grab 1st URL; perhaps later add interface for # downloading multiple linked .sws try: filename = my_urlretrieve(linked_sws[0]['url'], backlinks=backlinks)[0] print 'Importing {0}, linked to from {1}'.format(linked_sws[0]['url'], url) except RetrieveError as err: return current_app.message(str(err)) W = g.notebook.import_worksheet(filename, g.username) except Exception, msg: print 'error uploading worksheet', msg s = _('There was an error uploading the worksheet. It could be an old unsupported format or worse. If you desperately need its contents contact the <a href="http://groups.google.com/group/sage-support">sage-support group</a> and post a link to your worksheet. Alternatively, an sws file is just a bzip2 tarball; take a look inside!\n%(backlinks)s', backlinks=backlinks) return current_app.message(s, url_for('home', username=g.username)) finally: # Clean up the temporarily uploaded filename. os.unlink(filename) # if a temp directory was created, we delete it now. if dir: import shutil shutil.rmtree(dir)
def upload_worksheet(): from sage.misc.misc import tmp_filename, tmp_dir from werkzeug.utils import secure_filename import zipfile backlinks = _("""Return to <a href="/upload" title="Upload a worksheet"><strong>Upload File</strong></a>.""") url = request.values['url'].strip() dir = '' if url: #Downloading a file from the internet import urllib, urlparse filename = tmp_filename() + ('.zip' if url.endswith('.zip') else '.sws') # The file will be downloaded from the internet and saved # to a temporary file with the same extension path = urlparse.urlparse(url).path extension = os.path.splitext(path)[1].lower() if extension not in [".txt", ".sws", ".zip", ".html", ".rst"]: # Or shall we try to import the document as an sws in doubt? return current_app.message("Unknown worksheet extension: %s. %s" % (extension, backlinks)) filename = tmp_filename()+extension try: urllib.urlretrieve(url, filename) except IOError as err: if err.strerror == 'unknown url type' and err.filename == 'https': return current_app.message(_("This Sage notebook is not configured to load worksheets from 'https' URLs. Try a different URL or download the worksheet and upload it directly from your computer.\n%(backlinks)s",backlinks=backlinks)) else: raise else: #Uploading a file from the user's computer dir = tmp_dir() file = request.files['file'] if file.filename is None: return current_app.message(_("Please specify a worksheet to load.\n%(backlinks)s",backlinks=backlinks)) filename = secure_filename(file.filename) if len(filename)==0: return current_app.message(_("Invalid filename.\n%(backlinks)s",backlinks=backlinks)) filename = os.path.join(dir, filename) file.save(filename) new_name = request.values.get('name', None) try: try: if filename.endswith('.zip'): # Extract all the .sws files from a zip file. zip_file = zipfile.ZipFile(filename) for subfilename in zip_file.namelist(): prefix, extension = os.path.splitext(subfilename) if extension in ['.sws', '.html', '.txt', '.rst'] : tmpfilename = os.path.join(dir, "tmp" + extension) try: tmpfilename = zip_file.extract(subfilename, tmpfilename) except AttributeError: open(tmpfilename, 'w').write(zip_file.read(subfilename)) W = g.notebook.import_worksheet(tmpfilename, g.username) if new_name: W.set_name("%s - %s" % (new_name, W.name())) else: print "Unknown extension, file %s is ignored" % subfilename return redirect(url_for('home', username=g.username)) else: W = g.notebook.import_worksheet(filename, g.username) except Exception, msg: print 'error uploading worksheet', msg s = _('There was an error uploading the worksheet. It could be an old unsupported format or worse. If you desperately need its contents contact the <a href="http://groups.google.com/group/sage-support">sage-support group</a> and post a link to your worksheet. Alternatively, an sws file is just a bzip2 tarball; take a look inside!\n%(backlinks)s', backlinks=backlinks) return current_app.message(s, url_for('home', username=g.username)) finally: # Clean up the temporarily uploaded filename. os.unlink(filename) # if a temp directory was created, we delete it now. if dir: import shutil shutil.rmtree(dir)
def upload_worksheet(): from sage.misc.all import tmp_filename, tmp_dir from werkzeug.utils import secure_filename import zipfile if g.notebook.readonly_user(g.username): return current_app.message(_("Account is in read-only mode"), cont=url_for('home', username=g.username)) backlinks = _( """Return to <a href="/upload" title="Upload a worksheet"><strong>Upload File</strong></a>.""" ) url = request.values['url'].strip() dir = '' if url != '': #Downloading a file from the internet # The file will be downloaded from the internet and saved # to a temporary file with the same extension path = urlparse.urlparse(url).path extension = os.path.splitext(path)[1].lower() if extension not in ["", ".txt", ".sws", ".zip", ".html", ".rst"]: # Or shall we try to import the document as an sws when in doubt? return current_app.message( _("Unknown worksheet extension: %(ext)s. %(links)s", ext=extension, links=backlinks)) filename = tmp_filename() + extension try: import re matches = re.match("file://(?:localhost)?(/.+)", url) if matches: if g.notebook.interface != 'localhost': return current_app.message( _("Unable to load file URL's when not running on localhost.\n%(backlinks)s", backlinks=backlinks)) import shutil shutil.copy(matches.group(1), filename) else: my_urlretrieve(url, filename, backlinks=backlinks) except RetrieveError as err: return current_app.message(str(err)) else: #Uploading a file from the user's computer dir = tmp_dir() file = request.files['file'] if file.filename is None: return current_app.message( _("Please specify a worksheet to load.\n%(backlinks)s", backlinks=backlinks)) filename = secure_filename(file.filename) if len(filename) == 0: return current_app.message( _("Invalid filename.\n%(backlinks)s", backlinks=backlinks)) filename = os.path.join(dir, filename) file.save(filename) new_name = request.values.get('name', None) try: try: if filename.endswith('.zip'): # Extract all the .sws files from a zip file. zip_file = zipfile.ZipFile(filename) for subfilename in zip_file.namelist(): prefix, extension = os.path.splitext(subfilename) # Mac zip files contain files like __MACOSX/._worksheet.sws # which are metadata files, so we skip those as # well as any other files we won't understand if extension in ['.sws', '.html', '.txt', '.rst' ] and not prefix.startswith('__MACOSX/'): tmpfilename = os.path.join(dir, "tmp" + extension) try: tmpfilename = zip_file.extract( subfilename, tmpfilename) except AttributeError: open(tmpfilename, 'w').write(zip_file.read(subfilename)) W = g.notebook.import_worksheet( tmpfilename, g.username) if new_name: W.set_name("%s - %s" % (new_name, W.name())) else: print "Unknown extension, file %s is ignored" % subfilename return redirect(url_for('home', username=g.username)) else: if url and extension in ['', '.html']: linked_sws = parse_link_rel(url, filename) if linked_sws: # just grab 1st URL; perhaps later add interface for # downloading multiple linked .sws try: filename = my_urlretrieve(linked_sws[0]['url'], backlinks=backlinks)[0] print 'Importing {0}, linked to from {1}'.format( linked_sws[0]['url'], url) except RetrieveError as err: return current_app.message(str(err)) W = g.notebook.import_worksheet(filename, g.username) except Exception, msg: print 'error uploading worksheet', msg s = _( 'There was an error uploading the worksheet. It could be an old unsupported format or worse. If you desperately need its contents contact the <a href="http://groups.google.com/group/sage-support">sage-support group</a> and post a link to your worksheet. Alternatively, an sws file is just a bzip2 tarball; take a look inside!\n%(backlinks)s', backlinks=backlinks) return current_app.message(s, url_for('home', username=g.username)) finally: # Clean up the temporarily uploaded filename. os.unlink(filename) # if a temp directory was created, we delete it now. if dir: import shutil shutil.rmtree(dir)
def upload_worksheet(): from sage.misc.misc import tmp_filename, tmp_dir from werkzeug.utils import secure_filename import zipfile backlinks = _( """Return to <a href="/upload" title="Upload a worksheet"><strong>Upload File</strong></a>.""" ) url = request.values['url'].strip() dir = '' if url: #Downloading a file from the internet import urllib, urlparse filename = tmp_filename() + ('.zip' if url.endswith('.zip') else '.sws') # The file will be downloaded from the internet and saved # to a temporary file with the same extension path = urlparse.urlparse(url).path extension = os.path.splitext(path)[1].lower() if extension not in [".txt", ".sws", ".zip", ".html", ".rst"]: # Or shall we try to import the document as an sws in doubt? return current_app.message("Unknown worksheet extension: %s. %s" % (extension, backlinks)) filename = tmp_filename() + extension urllib.urlretrieve(url, filename) else: #Uploading a file from the user's computer dir = tmp_dir() file = request.files['file'] if file.filename is None: return current_app.message( _("Please specify a worksheet to load.\n%(backlinks)s", backlinks=backlinks)) filename = secure_filename(file.filename) if len(filename) == 0: return current_app.message( _("Invalid filename.\n%(backlinks)s", backlinks=backlinks)) filename = os.path.join(dir, filename) file.save(filename) new_name = request.values.get('name', None) try: try: if filename.endswith('.zip'): # Extract all the .sws files from a zip file. zip_file = zipfile.ZipFile(filename) for subfilename in zip_file.namelist(): prefix, extension = os.path.splitext(subfilename) if extension in ['.sws', '.html', '.txt', '.rst']: tmpfilename = os.path.join(dir, "tmp" + extension) try: tmpfilename = zip_file.extract( subfilename, tmpfilename) except AttributeError: open(tmpfilename, 'w').write(zip_file.read(subfilename)) W = g.notebook.import_worksheet( tmpfilename, g.username) if new_name: W.set_name("%s - %s" % (new_name, W.name())) else: print "Unknown extension, file %s is ignored" % subfilename return redirect(url_for('home', username=g.username)) else: W = g.notebook.import_worksheet(filename, g.username) except Exception, msg: print 'error uploading worksheet', msg s = _( 'There was an error uploading the worksheet. It could be an old unsupported format or worse. If you desperately need its contents contact the <a href="http://groups.google.com/group/sage-support">sage-support group</a> and post a link to your worksheet. Alternatively, an sws file is just a bzip2 tarball; take a look inside!\n%(backlinks)s', backlinks=backlinks) return current_app.message(s, url_for('home', username=g.username)) finally: # Clean up the temporarily uploaded filename. os.unlink(filename) # if a temp directory was created, we delete it now. if dir: import shutil shutil.rmtree(dir)