コード例 #1
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
コード例 #2
0
    def destination_node(self):
        if self._destination_node is not None:
            return self._destination_node

        # If req is a sub-request, req.main is the main request.
        destination = self._get_header('Destination')

        if destination:
            # Parse path from url
            try:
                encoded_destination = normalized_base_url(destination)
                destination = urllib.unquote(encoded_destination).decode('UTF-8')
                self._destination_node = MappedFileNode.from_request_path_info(destination,
                    self.target_node)
            except Exception as e:
                raise NodeError('Destination node was invalid: %s'%str(e))

        return self._destination_node
コード例 #3
0
    def process_request(self, req):
        """ Process request for listing, creating and removing projects
        """

        files_core = FilesCoreComponent(self.env)
        timeline_notifier = FilesEventNotifier(self.env)
        node_factory, download_config = files_core.files_node_factory_and_config(req)
        if req.args.get('redirect') == 'downloads':
            req.perm.require('FILES_DOWNLOADS_VIEW')
            if download_config.downloads_dir == '':
                raise HTTPNotFound(_("The project doesn't have downloads directory."))
            req.redirect(req.href.files(download_config.downloads_dir))

        user_store = get_userstore()
        user = user_store.getUser(req.authname)

        env_name = download_config.env_name

        node = MappedFileNode.from_request_path_info(req.path_info, node_factory)
        open_in_mode_mode = ''
        filename = None
        if req.args.get('action') == 'open_in_mode':
            open_in_mode_mode = req.args.get('mode')
        if not node.exists():
            if node.is_download() and node.download().is_available():
                node.delete()
            raise HTTPNotFound(_("The file was not found!"))
        if req.method == 'POST' and not req.args.get('cancel'):
            # Each X_from_request or X_by_request method does permission check
            action = req.args.get('action')
            # need to delete a file?
            if action == 'delete_multiple' or action == 'delete':
                self.process_delete(action, node, node_factory, req, timeline_notifier)
            elif action == 'add_file':
                filename, open_in_mode_mode = self.process_add_file(node,
                    req, timeline_notifier, user)
            elif action == 'move_multiple' or action == 'rename':
                self.process_move(action, node, node_factory, req,
                    timeline_notifier, user)
            elif action == 'add_folder':
                try:
                    new_dir = node.create_dir_from_request(req, user.id, timeline_notifier)
                    if not new_dir:
                        add_warning(req, _("No folder name was given"))
                    else:
                        filename = new_dir.filename
                        open_in_mode_mode = 'show_mode'
                except TracError as e:
                    add_warning(req, _("Error when creating a new directory: ") + str(e))
            elif action == 'update':
                filename, open_in_mode_mode = self.process_update(node, node_factory, req,
                    timeline_notifier, user)

        if node.is_dir():
            if open_in_mode_mode:
                if not filename:
                    filename = req.args.get('target')
                return self.show_dir(req, node, node_factory, files_core, user_store,
                    target_filename=filename, current_mode=open_in_mode_mode)
            else:
                return self.show_dir(req, node, node_factory, files_core, user_store)
        elif node.is_file():
            mimeview = Mimeview(self.env)
            try:
                node.show_file(req, mimeview, timeline_notifier)
            except InvalidOperationError as e:
                pass
            else:
                add_warning(req, _("Error was received when displaying the file"))
            parent_node = node.get_parent_dir()
            # Error was obtained
            return self.show_dir(req, parent_node, node_factory, files_core, user_store)
        else:
            raise TracError(_('Invalid filesystem node was requested'))
コード例 #4
0
ファイル: files.py プロジェクト: nagyistoce/trac-multiproject
    def process_request(self, req):
        """ Process request for listing, creating and removing projects
        """

        files_core = FilesCoreComponent(self.env)
        timeline_notifier = FilesEventNotifier(self.env)
        node_factory, download_config = files_core.files_node_factory_and_config(req)
        if req.args.get("redirect") == "downloads":
            req.perm.require("FILES_DOWNLOADS_VIEW")
            if download_config.downloads_dir == "":
                raise HTTPNotFound(_("The project doesn't have downloads directory."))
            req.redirect(req.href.files(download_config.downloads_dir))

        user_store = get_userstore()
        user = user_store.getUser(req.authname)

        env_name = download_config.env_name

        node = MappedFileNode.from_request_path_info(req.path_info, node_factory)
        open_in_mode_mode = ""
        filename = None
        if req.args.get("action") == "open_in_mode":
            open_in_mode_mode = req.args.get("mode")
        if not node.exists():
            if node.is_download() and node.download().is_available():
                node.delete()
            raise HTTPNotFound(_("The file was not found!"))
        if req.method == "POST" and not req.args.get("cancel"):
            # Each X_from_request or X_by_request method does permission check
            action = req.args.get("action")
            # need to delete a file?
            if action == "delete_multiple" or action == "delete":
                self.process_delete(action, node, node_factory, req, timeline_notifier)
            elif action == "add_file":
                filename, open_in_mode_mode = self.process_add_file(node, req, timeline_notifier, user)
            elif action == "move_multiple" or action == "rename":
                self.process_move(action, node, node_factory, req, timeline_notifier, user)
            elif action == "add_folder":
                try:
                    new_dir = node.create_dir_from_request(req, user.id, timeline_notifier)
                    if not new_dir:
                        add_warning(req, _("No folder name was given"))
                    else:
                        filename = new_dir.filename
                        open_in_mode_mode = "show_mode"
                except TracError as e:
                    add_warning(req, _("Error when creating a new directory: ") + str(e))
            elif action == "update":
                filename, open_in_mode_mode = self.process_update(node, node_factory, req, timeline_notifier, user)

        if node.is_dir():
            if open_in_mode_mode:
                if not filename:
                    filename = req.args.get("target")
                return self.show_dir(
                    req,
                    node,
                    node_factory,
                    files_core,
                    user_store,
                    target_filename=filename,
                    current_mode=open_in_mode_mode,
                )
            else:
                return self.show_dir(req, node, node_factory, files_core, user_store)
        elif node.is_file():
            mimeview = Mimeview(self.env)
            try:
                node.show_file(req, mimeview, timeline_notifier)
            except InvalidOperationError as e:
                pass
            else:
                add_warning(req, _("Error was received when displaying the file"))
            parent_node = node.get_parent_dir()
            # Error was obtained
            return self.show_dir(req, parent_node, node_factory, files_core, user_store)
        else:
            raise TracError(_("Invalid filesystem node was requested"))