コード例 #1
0
    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
コード例 #2
0
    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')
コード例 #3
0
ファイル: files.py プロジェクト: nagyistoce/trac-multiproject
    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
コード例 #4
0
ファイル: files.py プロジェクト: nagyistoce/trac-multiproject
 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"))
コード例 #5
0
 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))
コード例 #6
0
ファイル: admin.py プロジェクト: nagyistoce/trac-multiproject
    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)
コード例 #7
0
 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"))
コード例 #8
0
ファイル: files.py プロジェクト: nagyistoce/trac-multiproject
 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))
コード例 #9
0
ファイル: admin.py プロジェクト: nagyistoce/trac-multiproject
    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)