Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
    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