platypush/platypush/message/response/__init__.py

112 lines
2.9 KiB
Python
Raw Normal View History

import json
import logging
import time
2019-12-27 23:26:39 +01:00
from platypush.message import Message
2019-12-11 18:05:17 +01:00
class Response(Message):
"""Response message class"""
def __init__(
self,
target=None,
origin=None,
id=None,
output=None,
errors=None,
timestamp=None,
logging_level=logging.INFO,
):
"""
2020-08-24 01:14:40 +02:00
:param target: Target
:type target: str
:param origin: Origin
:type origin: str
:param output: Output
:param errors: Errors
:param id: Message ID this response refers to
:type id: str
:param timestamp: Message timestamp
:type timestamp: float
"""
super().__init__(timestamp=timestamp, logging_level=logging_level)
self.target = target
self.output = self._parse_msg(output)
2019-12-11 18:05:17 +01:00
self.errors = self._parse_msg(errors or [])
self.origin = origin
self.id = id
def is_error(self):
"""Returns True if the response has errors"""
return len(self.errors) != 0
@classmethod
def _parse_msg(cls, msg):
if isinstance(msg, (bytes, bytearray)):
msg = msg.decode('utf-8')
if isinstance(msg, str):
2019-12-11 18:05:17 +01:00
try:
msg = json.loads(msg.strip())
except ValueError:
pass
return msg
@classmethod
def build(cls, msg):
msg = super().parse(msg)
args = {
2019-12-11 18:05:17 +01:00
'target': msg['target'],
'output': msg['response']['output'],
'errors': msg['response']['errors'],
'timestamp': msg['_timestamp'] if '_timestamp' in msg else time.time(),
'logging_level': msg.get('_logging_level', logging.INFO),
}
2019-12-11 18:05:17 +01:00
if 'id' in msg:
args['id'] = msg['id']
if 'origin' in msg:
args['origin'] = msg['origin']
2019-12-11 18:05:17 +01:00
return cls(**args)
def __str__(self):
"""
2020-08-24 01:14:40 +02:00
Overrides the ``str()`` operator and converts
the message into a UTF-8 JSON string
"""
output = (
self.output if self.output is not None else {'success': not self.errors}
)
2019-12-27 15:55:56 +01:00
response_dict = {
2019-12-11 18:05:17 +01:00
'id': self.id,
'type': 'response',
'target': self.target if hasattr(self, 'target') else None,
'origin': self.origin if hasattr(self, 'origin') else None,
'_timestamp': self.timestamp,
'response': {
2019-12-27 15:55:56 +01:00
'output': output,
2019-12-11 18:05:17 +01:00
'errors': self.errors,
},
}
if self.logging_level:
response_dict['_logging_level'] = self.logging_level
2019-12-27 23:26:39 +01:00
return json.dumps(response_dict, cls=self.Encoder)
def log(self, action=None):
prefix = (
f'Processed response from action {action}: '
if action
else 'Received response: '
)
super().log(prefix)
2019-12-25 20:32:54 +01:00
# vim:sw=4:ts=4:et: