def unzip_external(request, directory, django_file, overwrite): # Make a temporary directory to hold a zip file and its unzipped contents. from pootle_misc import ptempfile as tempfile tempdir = tempfile.mkdtemp(prefix="pootle") # Make a temporary file to hold the zip file. tempzipfd, tempzipname = tempfile.mkstemp(prefix="pootle", suffix=".zip") try: # Dump the uploaded file to the temporary file. try: os.write(tempzipfd, django_file.read()) finally: os.close(tempzipfd) # Unzip the temporary zip file. import subprocess if subprocess.call(["unzip", tempzipname, "-d", tempdir]): import zipfile raise zipfile.BadZipfile(_("Error while extracting archive")) # Enumerate the temporary directory. maybe_skip = True prefix = tempdir for basedir, dirs, files in os.walk(tempdir): if maybe_skip and not files and len(dirs) == 1: try: directory.child_dirs.get(name=dirs[0]) maybe_skip = False except Directory.DoesNotExist: prefix = os.path.join(basedir, dirs[0]) continue else: maybe_skip = False for fname in files: # Read the contents of a file. fcontents = open(os.path.join(basedir, fname), "rb").read() newfile = StringIO.StringIO(fcontents) newfile.name = os.path.basename(fname) # Get the filesystem path relative to the temporary directory. subdir = host_to_unix_path(basedir[len(prefix) + len(os.sep) :]) if subdir: target_dir = directory.get_or_make_subdir(subdir) else: target_dir = directory # Construct a full UNIX path relative to the current # translation project URL by attaching a UNIXified # 'relative_host_dir' to the root relative path, i.e. the path # from which the user is uploading the ZIP file. try: upload_file(request, target_dir, newfile, overwrite) except ValueError: logging.exception(u"Error adding file %s", fname) finally: # Clean up temporary file and directory used in try-block. import shutil os.unlink(tempzipname) shutil.rmtree(tempdir)
def unzip_external(request, directory, django_file, overwrite): # Make a temporary directory to hold a zip file and its unzipped contents from pootle_misc import ptempfile as tempfile tempdir = tempfile.mkdtemp(prefix='pootle') # Make a temporary file to hold the zip file tempzipfd, tempzipname = tempfile.mkstemp(prefix='pootle', suffix='.zip') try: # Dump the uploaded file to the temporary file try: os.write(tempzipfd, django_file.read()) finally: os.close(tempzipfd) # Unzip the temporary zip file import subprocess if subprocess.call(["unzip", tempzipname, "-d", tempdir]): import zipfile raise zipfile.BadZipfile(_("Error while extracting archive")) # Enumerate the temporary directory... maybe_skip = True prefix = tempdir for basedir, dirs, files in os.walk(tempdir): if maybe_skip and not files and len(dirs) == 1: try: directory.child_dirs.get(name=dirs[0]) maybe_skip = False except Directory.DoesNotExist: prefix = os.path.join(basedir, dirs[0]) continue else: maybe_skip = False for fname in files: # Read the contents of a file... fcontents = open(os.path.join(basedir, fname), 'rb').read() newfile = StringIO.StringIO(fcontents) newfile.name = os.path.basename(fname) # Get the filesystem path relative to the temporary directory subdir = host_to_unix_path(basedir[len(prefix) + len(os.sep):]) if subdir: target_dir = directory.get_or_make_subdir(subdir) else: target_dir = directory # Construct a full UNIX path relative to the current # translation project URL by attaching a UNIXified # 'relative_host_dir' to the root relative path # (i.e. the path from which the user is uploading the # ZIP file. try: upload_file(request, target_dir, newfile, overwrite) except ValueError, e: logging.error(u"Error adding %s\t%s", fname, e) finally: # Clean up temporary file and directory used in try-block import shutil os.unlink(tempzipname) shutil.rmtree(tempdir)