def process_update(self, node, node_factory, req, timeline_notifier, user): open_in_mode_mode = '' filename = None selected_files = self._get_selected_files(req, node, True) # Updating the meta-info can currently be done only for one file at a time if len(selected_files) == 1: filename = selected_files[0] relative_path = os.path.join(node.relative_path, filename) target_node = MappedFileNode.from_path(relative_path, node_factory, assume_relative_path=True) from_dir = os.path.dirname(target_node.relative_path) moved_node = None # If the filename was changed, we have to do the move_by_request if req.args.get('to_relative_path', filename) != filename: try: moved_node = target_node.move_by_request(req, user.id, timeline_notifier, destination_is_dir=False, update_also=True) except TracError as e: add_warning(req, _("Could not move file or folder %(filename)s: ", filename=target_node.filename) + str(e)) # If the moving was successful, add a proper notice if moved_node: target_node = moved_node self.log.debug("update target_node %s", target_node) destination = target_node.get_parent_dir() destination_link = tag.a(target_node.filename, href=destination.get_href(req)) sentence = _("Renamed and updated file %(filename)s successfully to ", filename=selected_files[0]) add_notice(req, tag(sentence, destination_link)) if from_dir == os.path.dirname(target_node.relative_path): open_in_mode_mode = 'show_mode' filename = target_node.filename # If the filename was not changed, just updating the file info is enough else: try: target_node.update_metadata_from_request(req, user.id) open_in_mode_mode = 'show_mode' filename = target_node.filename add_notice(req, _("Updated file %(filename)s download information.", filename=filename)) except TracError as e: self.log.exception("foobar") add_warning(req, _("Could not save the downloads information for file.")) return filename, open_in_mode_mode
def file_link(self, formatter, ns, target, label): req = formatter.req if ns != 'file' and ns != 'download' and ns != 'filesdownload': return files_core = FilesCoreComponent(self.env) node_factory, download_config = files_core.files_node_factory_and_config(req) try: if ns == 'file': node = MappedFileNode.from_path(target, node_factory, True) else: node = MappedFileNode.from_download_path(target, node_factory, True) missing_perm = None if node.is_download(): if 'FILES_DOWNLOADS_VIEW' not in req.perm: missing_perm = 'FILES_DOWNLOADS_VIEW' elif 'FILES_VIEW' not in req.perm: missing_perm = 'FILES_VIEW' if missing_perm: return html.a(label, href='#', title = _('Missing %(permission)s permission', permission=missing_perm), class_ = 'missing') if node.exists(): if node.is_file(): if node.is_download(): if not node.download().is_available(): return html.a(label, href='#', title = _('Download information not available for %(path)s', path=node.relative_path), class_ = 'missing') else: return html.a(label, href=node.get_url(req), title = _('Download %(name)s (%(size)s)',name=node.filename, size= pretty_size(node.size))) else: return html.a(label, href=node.get_url(req), title = _('File %(name)s',name=node.filename)) elif node.is_dir(): return html.a(label, href=node.get_url(req), title = _('Folder %(name)s',name=node.filename)) else: return html.a(label, href='#', title = _('Not existing file: %(path)s', path=node.relative_path), class_ = 'missing') except TracError: # File doesn't exist return html.a(label, href='#', title=_('Invalid target for %(ns)s: %(path)s',ns=ns, path=target), class_='missing')
def process_update(self, node, node_factory, req, timeline_notifier, user): open_in_mode_mode = "" filename = None selected_files = self._get_selected_files(req, node, True) # Updating the meta-info can currently be done only for one file at a time if len(selected_files) == 1: filename = selected_files[0] relative_path = os.path.join(node.relative_path, filename) target_node = MappedFileNode.from_path(relative_path, node_factory, assume_relative_path=True) from_dir = os.path.dirname(target_node.relative_path) moved_node = None # If the filename was changed, we have to do the move_by_request if req.args.get("to_relative_path", filename) != filename: try: moved_node = target_node.move_by_request( req, user.id, timeline_notifier, destination_is_dir=False, update_also=True ) except TracError as e: add_warning( req, _("Could not move file or folder %(filename)s: ", filename=target_node.filename) + str(e) ) # If the moving was successful, add a proper notice if moved_node: target_node = moved_node self.log.debug("update target_node %s", target_node) destination = target_node.get_parent_dir() destination_link = tag.a(target_node.filename, href=destination.get_href(req)) sentence = _("Renamed and updated file %(filename)s successfully to ", filename=selected_files[0]) add_notice(req, tag(sentence, destination_link)) if from_dir == os.path.dirname(target_node.relative_path): open_in_mode_mode = "show_mode" filename = target_node.filename # If the filename was not changed, just updating the file info is enough else: try: target_node.update_metadata_from_request(req, user.id) open_in_mode_mode = "show_mode" filename = target_node.filename add_notice(req, _("Updated file %(filename)s download information.", filename=filename)) except TracError as e: self.log.exception("foobar") add_warning(req, _("Could not save the downloads information for file.")) return filename, open_in_mode_mode
def process_delete(self, action, node, node_factory, req, timeline_notifier): selected_files = self._get_selected_files(req, node, action == "delete") successful_files = 0 target_node = None for filename in selected_files: relative_path = os.path.join(node.relative_path, filename) removed_node = MappedFileNode.from_path(relative_path, node_factory, assume_relative_path=True) try: removed_node.remove_by_request(req, timeline_notifier) successful_files += 1 except TracError as e: add_warning(req, _("Could not remove file or folder %(filename)s: ", filename=filename) + str(e)) if len(selected_files) == 1 and successful_files == 1: add_notice(req, _("Removed file %(filename)s successfully", filename=selected_files[0])) elif successful_files and successful_files == len(selected_files): add_notice(req, _("Removed files successfully")) elif successful_files: add_notice(req, _("Removed other files successfully"))
def process_move(self, action, node, node_factory, req, timeline_notifier, user): is_rename = action == 'rename' selected_files = self._get_selected_files(req, node, is_rename) successful_files = 0 target_node = None for filename in selected_files: relative_path = os.path.join(node.relative_path, filename) target_node = MappedFileNode.from_path(relative_path, node_factory, assume_relative_path=True) try: moved_node = target_node.move_by_request(req, user.id, timeline_notifier, destination_is_dir=not is_rename, update_also=is_rename) target_node = moved_node successful_files += 1 except TracError as e: add_warning(req, _("Could not move file or folder %(filename)s: ", filename=target_node.filename) + str(e)) destination_link = None if target_node: destination = target_node.get_parent_dir() if is_rename: filename = target_node.filename else: filename = destination.relative_path == '.' and _('Home')\ or destination.filename destination_link = tag.a(filename, href=destination.get_href(req)) if successful_files and successful_files == len(selected_files): if successful_files == 1: if is_rename: sentence = _("Renamed file %(filename)s successfully to ", filename=selected_files[0]) else: sentence = _("Moved file %(filename)s successfully to location ", filename=selected_files[0]) add_notice(req, tag(sentence, destination_link)) else: # Batch rename not implemented add_notice(req, tag(_("Moved files successfully to location "), destination_link)) elif successful_files: add_notice(req, tag(_("Moved other files successfully to location "), destination_link))
def _handle_change(self, command, downloads_dir_name, can_be_moved): try: env_name = self.env.project_identifier except AttributeError as e: # In case of trac admin commands, project_identifier is not found env_name = self.env.path.split('/')[-1] self.env.project_identifier = env_name download_config = FilesDownloadConfig(env_name) if downloads_dir_name is None: files_core = FilesCoreComponent(self.env) downloads_dir_name = files_core.default_downloads_directory node_factory = FileSystemNode(download_config.base_path) old_node, old_dir_exists = self.get_dir_data(download_config, node_factory) if command == 'downloads-dir-create': if old_dir_exists: raise AdminCommandError( _('Project already has existing downloads directory')) node = FileSystemNode.from_path(downloads_dir_name, node_factory) if node.exists(): raise AdminCommandError( _('The given downloads directory already exists')) msg_handler = lambda msg: printout(msg) try: self.handle_change(download_config, downloads_dir_name, can_be_moved, node_factory, msg_handler, msg_handler) except TracError as e: raise AdminCommandError(str(e)) if command == 'downloads-dir-create': files_core = FilesCoreComponent(self.env) mapped_node_factory, mapped_download_config = files_core.files_node_factory_and_config( ) created_node = MappedFileNode.from_path( download_config.downloads_dir, mapped_node_factory) files_notifier = FilesEventNotifier(self.env) files_notifier.node_created('trac', created_node)
def process_delete(self, action, node, node_factory, req, timeline_notifier): selected_files = self._get_selected_files(req, node, action == 'delete') successful_files = 0 target_node = None for filename in selected_files: relative_path = os.path.join(node.relative_path, filename) removed_node = MappedFileNode.from_path(relative_path, node_factory, assume_relative_path=True) try: removed_node.remove_by_request(req, timeline_notifier) successful_files += 1 except TracError as e: add_warning(req, _("Could not remove file or folder %(filename)s: ", filename=filename) + str(e)) if len(selected_files) == 1 and successful_files == 1: add_notice(req, _("Removed file %(filename)s successfully", filename=selected_files[0])) elif successful_files and successful_files == len(selected_files): add_notice(req, _("Removed files successfully")) elif successful_files: add_notice(req, _("Removed other files successfully"))
def process_move(self, action, node, node_factory, req, timeline_notifier, user): is_rename = action == "rename" selected_files = self._get_selected_files(req, node, is_rename) successful_files = 0 target_node = None for filename in selected_files: relative_path = os.path.join(node.relative_path, filename) target_node = MappedFileNode.from_path(relative_path, node_factory, assume_relative_path=True) try: moved_node = target_node.move_by_request( req, user.id, timeline_notifier, destination_is_dir=not is_rename, update_also=is_rename ) target_node = moved_node successful_files += 1 except TracError as e: add_warning( req, _("Could not move file or folder %(filename)s: ", filename=target_node.filename) + str(e) ) destination_link = None if target_node: destination = target_node.get_parent_dir() if is_rename: filename = target_node.filename else: filename = destination.relative_path == "." and _("Home") or destination.filename destination_link = tag.a(filename, href=destination.get_href(req)) if successful_files and successful_files == len(selected_files): if successful_files == 1: if is_rename: sentence = _("Renamed file %(filename)s successfully to ", filename=selected_files[0]) else: sentence = _("Moved file %(filename)s successfully to location ", filename=selected_files[0]) add_notice(req, tag(sentence, destination_link)) else: # Batch rename not implemented add_notice(req, tag(_("Moved files successfully to location "), destination_link)) elif successful_files: add_notice(req, tag(_("Moved other files successfully to location "), destination_link))
def _handle_change(self, command, downloads_dir_name, can_be_moved): try: env_name = self.env.project_identifier except AttributeError as e: # In case of trac admin commands, project_identifier is not found env_name = self.env.path.split("/")[-1] self.env.project_identifier = env_name download_config = FilesDownloadConfig(env_name) if downloads_dir_name is None: files_core = FilesCoreComponent(self.env) downloads_dir_name = files_core.default_downloads_directory node_factory = FileSystemNode(download_config.base_path) old_node, old_dir_exists = self.get_dir_data(download_config, node_factory) if command == "downloads-dir-create": if old_dir_exists: raise AdminCommandError(_("Project already has existing downloads directory")) node = FileSystemNode.from_path(downloads_dir_name, node_factory) if node.exists(): raise AdminCommandError(_("The given downloads directory already exists")) msg_handler = lambda msg: printout(msg) try: self.handle_change( download_config, downloads_dir_name, can_be_moved, node_factory, msg_handler, msg_handler ) except TracError as e: raise AdminCommandError(str(e)) if command == "downloads-dir-create": files_core = FilesCoreComponent(self.env) mapped_node_factory, mapped_download_config = files_core.files_node_factory_and_config() created_node = MappedFileNode.from_path(download_config.downloads_dir, mapped_node_factory) files_notifier = FilesEventNotifier(self.env) files_notifier.node_created("trac", created_node)