<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def copy_assets(self, output_path):
 """Copies all asset files from the source path to the destination path. If no such source path exists, no asset copying will be performed. """

        src_paths = []

        # if we have a theme
        if self.config.theme is not None:
            # assume it's in the folder: "themes/theme_name/assets"
            src_paths.append(os.path.join(
                self.path,
                StatikProject.THEMES_DIR,
                self.config.theme,
                StatikProject.ASSETS_DIR
            ))
            # NOTE: Adding the theme's assets directory *before* the project's internal assets
            #       directory always ensures that the project's own assets are copied *after* the
            #       theme's, thereby ensuring that the project's assets folder takes precedence
            #       over the theme's.

        # always attempt to copy from our base assets folder
        if os.path.isabs(self.config.assets_src_path):
            src_paths.append(self.config.assets_src_path)
        else:
            src_paths.append(os.path.join(self.path, self.config.assets_src_path))

        for src_path in src_paths:
            if os.path.exists(src_path) and os.path.isdir(src_path):
                dest_path = self.config.assets_dest_path
                if not os.path.isabs(dest_path):
                    dest_path = os.path.join(output_path, dest_path)

                asset_count = copy_tree(src_path, dest_path)
                logger.info("Copied %s asset(s) from %s to %s", asset_count, src_path, dest_path)
            else:
                logger.info(
                    "Missing assets source path - skipping copying of assets: %s",
                    src_path
                )