Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Copy fails when it is not a synology office file #18

Open
alloant opened this issue Jun 20, 2023 · 3 comments
Open

Copy fails when it is not a synology office file #18

alloant opened this issue Jun 20, 2023 · 3 comments

Comments

@alloant
Copy link

alloant commented Jun 20, 2023

Copy works well for synology office files like:

synd.copy("/mydrive/test.odoc","/mydrive/tests/test.odoc")

Always gives error for other files:

synd.copy("/mydrive/test.pdf","/mydrive/tests/test.pdf")

Using SYNO.SynologyDrive.Files in the code solve the issue for me, I don't know if this could be included/replace in files.py:

`def copy(self, source: str, dist: str) -> dict:
"""

    copy file or dir

    :param source : id:23333333333  or "'team-folders/folder2/'"

    :param dist: "'team-folders/folder2/temp.odoc'"

    """

    api_name = "SYNO.SynologyDrive.Files"

    endpoint = 'entry.cgi'

    distpath, distname = os.path.split(dist)

    params = {'api': api_name, 'version': 2, 'method': 'copy',

              'to_parent_folder': distpath, 'to_parent_name': distname,

              'conflict_action': 'autorename', 

              'files': f'["{source}"]'}

    return self.session.http_put(endpoint, params=params)

`

@alloant
Copy link
Author

alloant commented Jun 22, 2023

Still SYNO.Office.Node works better for Synology Office. I propose this solution:

    def copy(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        distpath, distname = os.path.split(dist)
        ext = os.path.splitext(distname)[1]

        if ext in ['.odoc','osheet','oslides']:
            copy_office(source,dist)
        else:
            copy_drive(source,dist)

    def copy_office(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        api_name = "SYNO.Office.Node"
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'dry_run': 'true', 'name': distname,
                  'title': distname[:distname.index('.')],
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)
    
    def copy_drive(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source
        
        api_name = "SYNO.SynologyDrive.Files"
        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'to_parent_name': distname,
                  'conflict_action': 'autorename', 
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

@zbjdonald
Copy link
Owner

Still SYNO.Office.Node works better for Synology Office. I propose this solution:

    def copy(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        distpath, distname = os.path.split(dist)
        ext = os.path.splitext(distname)[1]

        if ext in ['.odoc','osheet','oslides']:
            copy_office(source,dist)
        else:
            copy_drive(source,dist)

    def copy_office(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        api_name = "SYNO.Office.Node"
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'dry_run': 'true', 'name': distname,
                  'title': distname[:distname.index('.')],
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)
    
    def copy_drive(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source
        
        api_name = "SYNO.SynologyDrive.Files"
        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'to_parent_name': distname,
                  'conflict_action': 'autorename', 
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

Let me see.

@1983shake
Copy link

Still SYNO.Office.Node works better for Synology Office. I propose this solution:

    def copy(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        distpath, distname = os.path.split(dist)
        ext = os.path.splitext(distname)[1]

        if ext in ['.odoc','osheet','oslides']:
            copy_office(source,dist)
        else:
            copy_drive(source,dist)

    def copy_office(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        api_name = "SYNO.Office.Node"
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'dry_run': 'true', 'name': distname,
                  'title': distname[:distname.index('.')],
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)
    
    def copy_drive(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source
        
        api_name = "SYNO.SynologyDrive.Files"
        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'to_parent_name': distname,
                  'conflict_action': 'autorename', 
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

Let me see.

请问这段代码能解决问题吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants