def transfer_workflow(workflow): """ Enqueue workflow for transfer to an attached USB storage device. Requires that the `python-dbus` package is installed. Once the transfer was succesfully enqueued, watch for the :py:data:`spreadsplug.web.tasks.on_transfer_started` which is emitted when the transfer actually started and subsequently :py:data:`spreadsplug.web.tasks.on_transfer_progressed` and :py:data:`spreadsplug.web.tasks.on_transfer_completed`. :param workflow: UUID or slug for the workflow to be transferred :type workflow: str :status 200: When the transfer was successfully enqueued. :status 500: When the `python-dbus` package was not found. :status 503: When no removable USB device could be found for mounting. """ try: stick = find_stick() except ImportError: raise ApiException( "The transfer feature requires that the `python-dbus` module is " "installed on the system.", error_type='transfer') if stick is None: raise ApiException( "Could not find a removable devices to transfer to." "If you have connected one, make sure that it is formatted with " "the FAT32 file system", 503, error_type='transfer') from tasks import transfer_to_stick transfer_to_stick(workflow.id, app.config['base_path']) return 'OK'
def transfer_workflow(workflow): """ Transfer workflow to an attached USB storage device. """ try: stick = find_stick() except ImportError: return jsonify({"error": "Missing package 'python-dbus', " "please install."}) if stick is None: return jsonify({"error": "Could not find removable device"}), 503 from tasks import transfer_to_stick transfer_to_stick(workflow.id, app.config['base_path']) return 'OK'
def transfer_to_stick(wf_id, base_path): workflow = Workflow.find_by_id(base_path, wf_id) stick = find_stick() files = list(workflow.path.rglob('*')) num_files = len(files) # Filter out problematic characters clean_name = (workflow.path.name.replace(':', '_').replace('/', '_')) workflow.status['step'] = 'transfer' try: if IS_WIN: target_path = Path(stick) / clean_name else: mount = stick.get_dbus_method( "FilesystemMount", dbus_interface="org.freedesktop.UDisks.Device") mount_point = mount('', []) target_path = Path(mount_point) / clean_name if target_path.exists(): shutil.rmtree(unicode(target_path)) target_path.mkdir() signals['transfer:started'].send(workflow) for num, path in enumerate(files, 1): signals['transfer:progressed'].send(workflow, progress=(num / num_files) * 0.79, status=path.name) workflow.status['step_done'] = (num / num_files) * 0.79 target = target_path / path.relative_to(workflow.path) if path.is_dir(): target.mkdir() else: shutil.copyfile(unicode(path), unicode(target)) finally: if 'mount_point' in locals(): signals['transfer:progressed'].send(workflow, progress=0.8, status="Syncing...") workflow.status['step_done'] = 0.8 unmount = stick.get_dbus_method( "FilesystemUnmount", dbus_interface="org.freedesktop.UDisks.Device") unmount([], timeout=1e6) # dbus-python doesn't know an infinite # timeout... unmounting sometimes takes a # long time, since the device has to be # synced. signals['transfer:completed'].send(workflow) workflow.status['step'] = None
def transfer_to_stick(wf_id, base_path): workflow = Workflow.find_by_id(base_path, wf_id) stick = find_stick() files = list(workflow.path.rglob('*')) num_files = len(files) # Filter out problematic characters clean_name = (workflow.path.name.replace(':', '_') .replace('/', '_')) workflow.status['step'] = 'transfer' try: if IS_WIN: target_path = Path(stick)/clean_name else: mount = stick.get_dbus_method( "FilesystemMount", dbus_interface="org.freedesktop.UDisks.Device") mount_point = mount('', []) target_path = Path(mount_point)/clean_name if target_path.exists(): shutil.rmtree(unicode(target_path)) target_path.mkdir() signals['transfer:started'].send(workflow) for num, path in enumerate(files, 1): signals['transfer:progressed'].send( workflow, progress=(num/num_files)*0.79, status=path.name) workflow.status['step_done'] = (num/num_files)*0.79 target = target_path/path.relative_to(workflow.path) if path.is_dir(): target.mkdir() else: shutil.copyfile(unicode(path), unicode(target)) finally: if 'mount_point' in locals(): signals['transfer:progressed'].send(workflow, progress=0.8, status="Syncing...") workflow.status['step_done'] = 0.8 unmount = stick.get_dbus_method( "FilesystemUnmount", dbus_interface="org.freedesktop.UDisks.Device") unmount([], timeout=1e6) # dbus-python doesn't know an infinite # timeout... unmounting sometimes takes a # long time, since the device has to be # synced. signals['transfer:completed'].send(workflow) workflow.status['step'] = None
def transfer_workflow(workflow): """ Transfer workflow to an attached USB storage device. """ try: stick = find_stick() except ImportError: raise ApiException( "The transfer feature requires that the `python-dbus` module is " "installed on the system.", error_type='transfer') if stick is None: raise ApiException( "Could not find a removable devices to transfer to." "If you have connected one, make sure that it is formatted with " "the FAT32 file system", 503, error_type='transfer') from tasks import transfer_to_stick transfer_to_stick(workflow.id, app.config['base_path']) return 'OK'