comparison libervia/server/utils.py @ 1216:b2d067339de3

python 3 port: /!\ Python 3.6+ is now needed to use libervia /!\ instability may occur and features may not be working anymore, this will improve with time /!\ TxJSONRPC dependency has been removed The same procedure as in backend has been applied (check backend commit ab2696e34d29 logs for details). Removed now deprecated code (Pyjamas compiled browser part, legacy blog, JSON RPC related code). Adapted code to work without `html` and `themes` dirs.
author Goffi <goffi@goffi.org>
date Tue, 13 Aug 2019 19:12:31 +0200
parents 2af117bfe6cc
children 62bf4f87c249
comparison
equal deleted inserted replaced
1215:f14ab8a25e8b 1216:b2d067339de3
19 from sat.core.i18n import _ 19 from sat.core.i18n import _
20 from twisted.internet import reactor 20 from twisted.internet import reactor
21 from twisted.internet import defer 21 from twisted.internet import defer
22 from sat.core import exceptions 22 from sat.core import exceptions
23 from sat.core.log import getLogger 23 from sat.core.log import getLogger
24 import urllib 24 import urllib.request, urllib.parse, urllib.error
25 25
26 log = getLogger(__name__) 26 log = getLogger(__name__)
27 27
28 28
29 def quote(value, safe="@"): 29 def quote(value, safe="@"):
30 """shortcut to quote an unicode value for URL""" 30 """shortcut to quote an unicode value for URL"""
31 return urllib.quote(value.encode("utf-8"), safe=safe) 31 return urllib.parse.quote(value.encode("utf-8"), safe=safe)
32 32
33 33
34 class ProgressHandler(object): 34 class ProgressHandler(object):
35 """class to help the management of progressions""" 35 """class to help the management of progressions"""
36 36
44 @classmethod 44 @classmethod
45 def _signal(cls, name, progress_id, data, profile): 45 def _signal(cls, name, progress_id, data, profile):
46 handlers = cls.handlers 46 handlers = cls.handlers
47 if profile in handlers and progress_id in handlers[profile]: 47 if profile in handlers and progress_id in handlers[profile]:
48 handler_data = handlers[profile][progress_id] 48 handler_data = handlers[profile][progress_id]
49 timeout = handler_data[u"timeout"] 49 timeout = handler_data["timeout"]
50 if timeout.active(): 50 if timeout.active():
51 timeout.cancel() 51 timeout.cancel()
52 cb = handler_data[name] 52 cb = handler_data[name]
53 if cb is not None: 53 if cb is not None:
54 cb(data) 54 cb(data)
55 if name == u"started": 55 if name == "started":
56 pass 56 pass
57 elif name == u"finished": 57 elif name == "finished":
58 handler_data[u"deferred"].callback(data) 58 handler_data["deferred"].callback(data)
59 handler_data[u"instance"].unregister_handler() 59 handler_data["instance"].unregister_handler()
60 elif name == u"error": 60 elif name == "error":
61 handler_data[u"deferred"].errback(Exception(data)) 61 handler_data["deferred"].errback(Exception(data))
62 handler_data[u"instance"].unregister_handler() 62 handler_data["instance"].unregister_handler()
63 else: 63 else:
64 log.error(u"unexpected signal: {name}".format(name=name)) 64 log.error("unexpected signal: {name}".format(name=name))
65 65
66 def _timeout(self): 66 def _timeout(self):
67 log.warning( 67 log.warning(
68 _( 68 _(
69 u"No progress received, cancelling handler: {progress_id} [{profile}]" 69 "No progress received, cancelling handler: {progress_id} [{profile}]"
70 ).format(progress_id=self.progress_id, profile=self.profile) 70 ).format(progress_id=self.progress_id, profile=self.profile)
71 ) 71 )
72 72
73 def unregister_handler(self): 73 def unregister_handler(self):
74 """remove a previously registered handler""" 74 """remove a previously registered handler"""
75 try: 75 try:
76 del self.handlers[self.profile][self.progress_id] 76 del self.handlers[self.profile][self.progress_id]
77 except KeyError: 77 except KeyError:
78 log.warning( 78 log.warning(
79 _(u"Trying to remove unknown handler: {progress_id} [{profile}]").format( 79 _("Trying to remove unknown handler: {progress_id} [{profile}]").format(
80 progress_id=self.progress_id, profile=self.profile 80 progress_id=self.progress_id, profile=self.profile
81 ) 81 )
82 ) 82 )
83 else: 83 else:
84 if not self.handlers[self.profile]: 84 if not self.handlers[self.profile]:
98 handler_data = self.handlers.setdefault(self.profile, {}).setdefault( 98 handler_data = self.handlers.setdefault(self.profile, {}).setdefault(
99 self.progress_id, {} 99 self.progress_id, {}
100 ) 100 )
101 if handler_data: 101 if handler_data:
102 raise exceptions.ConflictError( 102 raise exceptions.ConflictError(
103 u"There is already one handler for this progression" 103 "There is already one handler for this progression"
104 ) 104 )
105 handler_data[u"instance"] = self 105 handler_data["instance"] = self
106 deferred = handler_data[u"deferred"] = defer.Deferred() 106 deferred = handler_data["deferred"] = defer.Deferred()
107 handler_data[u"started"] = started_cb 107 handler_data["started"] = started_cb
108 handler_data[u"finished"] = finished_cb 108 handler_data["finished"] = finished_cb
109 handler_data[u"error"] = error_cb 109 handler_data["error"] = error_cb
110 handler_data[u"timeout"] = reactor.callLater(timeout, self._timeout) 110 handler_data["timeout"] = reactor.callLater(timeout, self._timeout)
111 return deferred 111 return deferred
112 112
113 113
114 class SubPage(unicode): 114 class SubPage(str):
115 """use to mark subpages when generating a page path""" 115 """use to mark subpages when generating a page path"""