11"""Module that provides various utility methods on the portal level."""
22
33from Acquisition import aq_inner
4+ from Acquisition import ImplicitAcquisitionWrapper
5+ from datetime import date
6+ from datetime import datetime
7+ from DateTime .DateTime import DateTime
8+ from email .mime .multipart import MIMEMultipart
49from email .utils import formataddr
510from email .utils import parseaddr
611from logging import getLogger
1217from Products .CMFCore .interfaces import ISiteRoot
1318from Products .CMFCore .utils import getToolByName
1419from Products .statusmessages .interfaces import IStatusMessage
20+ from typing import Any
21+ from typing import List
22+ from typing import Optional
23+ from typing import Union
1524from zope .component import ComponentLookupError
1625from zope .component import getUtilitiesFor
1726from zope .component import getUtility
1827from zope .component import providedBy
1928from zope .component .hooks import getSite
2029from zope .globalrequest import getRequest
30+ from zope .interface .interface import InterfaceClass
2131from zope .interface .interfaces import IInterface
2232from zope .schema .interfaces import IVocabularyFactory
33+ from zope .schema .vocabulary import SimpleVocabulary
34+ from ZPublisher .HTTPRequest import HTTPRequest
2335
2436import datetime as dtime
2537import re
5264MISSING = object ()
5365
5466
55- def get ():
67+ def get () -> ImplicitAcquisitionWrapper :
5668 """Get the Plone portal object out of thin air.
5769
5870 Without the need to import fancy Interfaces and doing multi adapter
@@ -76,7 +88,9 @@ def get():
7688
7789
7890@required_parameters ("context" )
79- def get_navigation_root (context = None ):
91+ def get_navigation_root (
92+ context : Optional [ImplicitAcquisitionWrapper ] = None ,
93+ ) -> ImplicitAcquisitionWrapper :
8094 """Get the navigation root object for the context.
8195
8296 This traverses the path up and returns the nearest navigation root.
@@ -93,7 +107,7 @@ def get_navigation_root(context=None):
93107
94108
95109@required_parameters ("name" )
96- def get_tool (name = None ):
110+ def get_tool (name : Optional [ str ] = None ) -> ImplicitAcquisitionWrapper :
97111 """Get a portal tool in a simple way.
98112
99113 :param name: [required] Name of the tool you want.
@@ -123,11 +137,11 @@ def get_tool(name=None):
123137
124138@required_parameters ("recipient" , "subject" , "body" )
125139def send_email (
126- sender = None ,
127- recipient = None ,
128- subject = None ,
129- body = None ,
130- immediate = False ,
140+ sender : Optional [ str ] = None ,
141+ recipient : Optional [ str ] = None ,
142+ subject : Optional [ str ] = None ,
143+ body : Optional [ Union [ MIMEMultipart , str ]] = None ,
144+ immediate : bool = False ,
131145):
132146 """Send an email.
133147
@@ -171,11 +185,6 @@ def send_email(
171185 # formataddr probably got confused by special characters.
172186 sender = from_address
173187
174- # If the mail headers are not properly encoded we need to extract
175- # them and let MailHost manage the encoding.
176- if isinstance (body , str ):
177- body = body .encode (encoding )
178-
179188 host = get_tool ("MailHost" )
180189 host .send (
181190 body ,
@@ -188,7 +197,11 @@ def send_email(
188197
189198
190199@required_parameters ("datetime" )
191- def get_localized_time (datetime = None , long_format = False , time_only = False ):
200+ def get_localized_time (
201+ datetime : Optional [Union [date , DateTime , datetime ]] = None ,
202+ long_format : bool = False ,
203+ time_only : bool = False ,
204+ ) -> str :
192205 """Display a date/time in a user-friendly way.
193206
194207 It should be localized to the user's preferred language.
@@ -236,7 +249,11 @@ def get_localized_time(datetime=None, long_format=False, time_only=False):
236249
237250
238251@required_parameters ("message" )
239- def show_message (message = None , request = None , type = "info" ):
252+ def show_message (
253+ message : Optional [str ] = None ,
254+ request : Optional [HTTPRequest ] = None ,
255+ type : str = "info" ,
256+ ):
240257 """Display a status message.
241258
242259 :param message: [required] Message to show.
@@ -255,7 +272,11 @@ def show_message(message=None, request=None, type="info"):
255272
256273
257274@required_parameters ("name" )
258- def get_registry_record (name = None , interface = None , default = MISSING ):
275+ def get_registry_record (
276+ name : Optional [str ] = None ,
277+ interface : Optional [InterfaceClass ] = None ,
278+ default : Any = MISSING ,
279+ ) -> Any :
259280 """Get a record value from ``plone.app.registry``.
260281
261282 :param name: [required] Name
@@ -322,7 +343,11 @@ def get_registry_record(name=None, interface=None, default=MISSING):
322343
323344
324345@required_parameters ("name" , "value" )
325- def set_registry_record (name = None , value = None , interface = None ):
346+ def set_registry_record (
347+ name : Optional [str ] = None ,
348+ value : Any = None ,
349+ interface : Optional [InterfaceClass ] = None ,
350+ ):
326351 """Set a record value in the ``plone.app.registry``.
327352
328353 :param name: [required] Name of the record
@@ -374,7 +399,7 @@ def set_registry_record(name=None, value=None, interface=None):
374399 registry [name ] = value
375400
376401
377- def get_default_language ():
402+ def get_default_language () -> str :
378403 """Return the default language.
379404
380405 :returns: language identifier
@@ -388,7 +413,7 @@ def get_default_language():
388413 return settings .default_language
389414
390415
391- def get_current_language (context = None ):
416+ def get_current_language (context : Optional [ ImplicitAcquisitionWrapper ] = None ) -> str :
392417 """Return the current negotiated language.
393418
394419 :param context: context object
@@ -405,7 +430,7 @@ def get_current_language(context=None):
405430 )
406431
407432
408- def translate (msgid , domain = "plone" , lang = None ):
433+ def translate (msgid : str , domain : str = "plone" , lang : Optional [ str ] = None ) -> str :
409434 """Translate a message into a given language.
410435
411436 Default to current negotiated language if no target language specified.
@@ -437,7 +462,9 @@ def translate(msgid, domain="plone", lang=None):
437462
438463
439464@required_parameters ("name" )
440- def get_vocabulary (name = None , context = None ):
465+ def get_vocabulary (
466+ name : Optional [str ] = None , context : Optional [ImplicitAcquisitionWrapper ] = None
467+ ) -> SimpleVocabulary :
441468 """Return a vocabulary object with the given name.
442469
443470 :param name: Name of the vocabulary.
@@ -464,7 +491,7 @@ def get_vocabulary(name=None, context=None):
464491 return vocabulary (context )
465492
466493
467- def get_vocabulary_names ():
494+ def get_vocabulary_names () -> List [ str ] :
468495 """Return a list of vocabulary names.
469496
470497 :returns: A sorted list of vocabulary names.
0 commit comments