diff sat/plugins/plugin_misc_upload.py @ 3922:0ff265725489

plugin XEP-0447: handle attachment and download: - plugin XEP-0447 can now be used in message attachments and to retrieve an attachment - plugin attach: `attachment` being processed is added to `extra` so the handler can inspect it - plugin attach: `size` is added to attachment - plugin download: a whole attachment dict is now used in `download` and `file_download`/`file_download_complete`. `download_uri` can be used as a shortcut when just a URI is used. In addition to URI scheme handler, whole attachment handlers can now be registered with `register_download_handler` - plugin XEP-0363: `file_http_upload` `XEP-0363_upload_size` triggers have been renamed to `XEP-0363_upload_pre_slot` and is now using a dict with arguments, allowing for the size but also the filename to be modified, which is necessary for encryption (filename may be hidden from URL this way). - plugin XEP-0446: fix wrong element name - plugin XEP-0447: source handler can now be registered (`url-data` is registered by default) - plugin XEP-0447: source parsing has been put in a separated `parse_sources_elt` method, as it may be useful to do it independently (notably with XEP-0448) - plugin XEP-0447: parse received message and complete attachments when suitable - plugin XEP-0447: can now be used with message attachments - plugin XEP-0447: can now be used with attachments download - renamed `options` arguments to `extra` for consistency - some style change (progressive move from legacy camelCase to PEP8 snake_case) - some typing rel 379
author Goffi <goffi@goffi.org>
date Thu, 06 Oct 2022 16:02:05 +0200
parents 1658472abd77
children 524856bd7b19
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_upload.py	Thu Oct 06 16:02:05 2022 +0200
+++ b/sat/plugins/plugin_misc_upload.py	Thu Oct 06 16:02:05 2022 +0200
@@ -18,15 +18,20 @@
 
 import os
 import os.path
+from pathlib import Path
+from typing import Optional, Tuple, Union
+
 from twisted.internet import defer
 from twisted.words.protocols.jabber import jid
 from twisted.words.protocols.jabber import error as jabber_error
-from sat.core.i18n import _, D_
+
+from sat.core import exceptions
 from sat.core.constants import Const as C
+from sat.core.core_types import SatXMPPEntity
+from sat.core.i18n import D_, _
+from sat.core.log import getLogger
+from sat.tools import xml_tools
 from sat.tools.common import data_format
-from sat.core.log import getLogger
-from sat.core import exceptions
-from sat.tools import xml_tools
 
 log = getLogger(__name__)
 
@@ -99,26 +104,32 @@
         else:
             return {"progress": progress_id}
 
-    async def upload(self, client, filepath, filename=None, upload_jid=None,
-                     options=None):
+    async def upload(
+        self,
+        client: SatXMPPEntity,
+        filepath: Union[Path, str],
+        filename: Optional[str] = None,
+        upload_jid: Optional[jid.JID] = None,
+        extra: Optional[dict]=None
+    ) -> Tuple[str, defer.Deferred]:
         """Send a file using best available method
 
-        @param filepath(str): absolute path to the file
-        @param filename(None, unicode): name to use for the upload
+        @param filepath: absolute path to the file
+        @param filename: name to use for the upload
             None to use basename of the path
-        @param upload_jid(jid.JID, None): upload capable entity jid,
+        @param upload_jid: upload capable entity jid,
             or None to use autodetected, if possible
-        @param options(dict): option to use for the upload, may be:
+        @param extra: extra data/options to use for the upload, may be:
             - ignore_tls_errors(bool): True to ignore SSL/TLS certificate verification
                 used only if HTTPS transport is needed
             - progress_id(str): id to use for progression
                 if not specified, one will be generated
         @param profile: %(doc_profile)s
-        @return (tuple[unicode,D(unicode)]): progress_id and a Deferred which fire
-            download URL when upload is finished
+        @return: progress_id and a Deferred which fire download URL when upload is
+            finished
         """
-        if options is None:
-            options = {}
+        if extra is None:
+            extra = {}
         if not os.path.isfile(filepath):
             raise exceptions.DataError("The given path doesn't link to a file")
         for method_name, available_cb, upload_cb, priority in self._upload_callbacks:
@@ -132,7 +143,7 @@
                 "{name} method will be used to upload the file".format(name=method_name)
             )
             progress_id, download_d = await upload_cb(
-                client, filepath, filename, upload_jid, options
+                client, filepath, filename, upload_jid, extra
             )
             return progress_id, download_d