def __init__(self, project): # Import this here to avoid circular references Command.__init__(self) self.name = "CreateFilesDownloads" self.project = project self.default_directory = FilesConfiguration().default_downloads_directory self.download_config = FilesDownloadConfig(self.project.env_name) self.downloads_dir = filesystem.safe_path(self.download_config.base_path.encode('utf-8'), self.default_directory)
class CreateFilesDownloads(Command): def __init__(self, project): # Import this here to avoid circular references Command.__init__(self) self.name = "CreateFilesDownloads" self.project = project self.default_directory = FilesConfiguration().default_downloads_directory self.download_config = FilesDownloadConfig(self.project.env_name) self.downloads_dir = filesystem.safe_path(self.download_config.base_path.encode('utf-8'), self.default_directory) def do(self): conf.log.warning('CreateFilesDownloads self.files_downloads_sys_path %s'%self.downloads_dir) if not os.path.exists(self.downloads_dir): try: conf.log.warning('CreateFilesDownloads os.makedir %s'%self.downloads_dir) os.makedirs(self.downloads_dir) except Exception: conf.log.exception('Failed to create project files downloads: "%s"' % self.downloads_dir) if not os.path.exists(self.downloads_dir): conf.log.error("Cannot create files downloads") return False try: self.download_config.downloads_dir = self.default_directory self.download_config.save() except Exception: conf.log.exception("Exception. CreateFilesDownloads save failed.") return False return True def undo(self): try: self.download_config.delete() except Exception: conf.log.exception("Exception. CreateFilesDownloads delete failed.") return False if os.path.exists(self.downloads_dir): try: filesystem.rmtree(self.downloads_dir) except Exception: conf.log.exception('Failed to remove project files downloads') return False return True
def target_node(self): if self._target_node is not None: return self._target_node env_name = self.environment_identifier() if not env_name: conf.log.warning("Failed reading identifier") raise NodeError('Target node was invalid: env_name not found') project = Project.get(env_name=env_name) # env_name might be different from project.env_name! base_url = project.get_dav_url(relative=True) path_info = normalized_base_url(self.req.uri) project_id = project.id download_config = FilesDownloadConfig(project.env_name, base_url=base_url) if not path_info.startswith(download_config.base_url): raise NodeError('Target node was invalid: uri %s does not start with %s', path_info, base_url) self._download_config = download_config try: node_factory = MappedFileNode(project_id, download_config.base_path, download_config.base_url, download_config.downloads_dir) self._target_node = MappedFileNode.from_request_path_info(path_info, node_factory) except Exception as e: conf.log.warning("Not node %s", str(e)) raise NodeError('Target node was invalid: %s', str(e)) return self._target_node
def _downloads_dir_check(self): 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) node_factory = FileSystemNode(download_config.base_path) node, dir_exists = self.get_dir_data(download_config, node_factory) if dir_exists: printout("[+] {0:<30} '{1:}'".format( env_name, download_config.downloads_dir)) else: printout("[-] {0:<30} '{1:}'".format( env_name, download_config.downloads_dir))
def files_download_config(self, context_name='files', req=None): """ :param str context_name: either 'files' or 'webdav' :return: FilesDownloadConfig """ ctx = None ctx_key = 'files.download_config.' + context_name if req: ctx = get_context(req) try: return ctx[ctx_key] except KeyError: pass env_name = self.env.project_identifier base_url = self.base_url(context_name=context_name) download_config = FilesDownloadConfig(env_name, base_url=base_url) if ctx: ctx[ctx_key] = download_config return download_config
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 render_admin_panel(self, req, category, page, path_info): req.perm.require('FILES_DOWNLOADS_ADMIN') env_name = self.env.project_identifier download_config = FilesDownloadConfig(env_name) node_factory = FileSystemNode(download_config.base_path) files_console = FilesConsoleAdmin(self.env) old_node, old_dir_exists = files_console.get_dir_data( download_config, node_factory) self.log.debug('downloads directory is "%s"', download_config.downloads_dir) new_dir_name = '' if req.method == 'POST': req.perm.require('FILES_DOWNLOADS_ADMIN') new_dir_name = req.args.get('new_dir_name') old_dir_select = req.args.get('old_dir_select') old_downloads_dir = req.args.get('old_downloads_dir') do_update = True if old_downloads_dir: if download_config.downloads_dir != old_downloads_dir: add_warning( req, _('The downloads directory has been changed. ' ' Check the new directory and try again, if needed.') ) do_update = False if do_update: can_be_moved = bool(req.args.get('move_also')) warning = lambda msg: add_warning(req, msg) notice = lambda msg: add_notice(req, msg) if old_dir_select and new_dir_name: add_warning( req, _('Cannot decide, what to do: ' 'Both old directory selected and new directory name given.' )) elif not old_dir_select: if old_dir_exists and new_dir_name == old_downloads_dir: add_notice( req, _('Old downloads dir was the required one.')) elif new_dir_name: # Create new directory files_console.handle_change(download_config, new_dir_name, can_be_moved, node_factory, warning, notice) req.redirect(req.href.admin(category, page)) else: add_warning(req, _('No new directory name given.')) else: if old_dir_exists and old_dir_select == old_downloads_dir: add_notice( req, _('Old downloads dir was the required one.')) elif old_dir_select == '__delete__': if old_dir_exists: files_console.handle_unset(warning, notice) req.redirect(req.href.admin(category, page)) else: add_notice( req, _('Old downloads dir was already unset.')) else: files_console.handle_change(download_config, old_dir_select, False, node_factory, warning, notice) req.redirect(req.href.admin(category, page)) root_node = FileSystemNode.from_path('.', node_factory) dirs, files = root_node.get_dirs_and_files() default_downloads_directory = FilesCoreComponent( self.env).default_downloads_directory data = { 'downloads_dir': download_config.downloads_dir, 'available_dirs': dirs, 'old_dir_exists': old_dir_exists, 'show_confirm': False, 'public_downloads_default': default_downloads_directory, 'new_dir_name': new_dir_name } return 'multiproject_admin_files.html', data