class NewView(MessageBase): typename = NEW_VIEW schema = ( (f.VIEW_NO.nm, NonNegativeNumberField()), (f.VIEW_CHANGES.nm, IterableField(ViewChangeField())), # list of tuples (node_name, view_change_digest) (f.CHECKPOINT.nm, AnyField()), # Checkpoint to be selected as stable (TODO: or tuple?) (f.BATCHES.nm, IterableField(BatchIDField())) # list of tuples (view_no, pp_view_no, pp_seq_no, pp_digest) # that should get into new view ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if isinstance(self.checkpoint, dict): self.checkpoint = Checkpoint(**self.checkpoint) # The field `batches` can to be a list of BatchIDs or of dicts. # If it's not a list of dicts then we don't need to deserialize it. if not self.batches or not isinstance(self.batches[0], dict): return self.batches = [BatchID(**bid) for bid in self.batches if isinstance(bid, dict)] def _asdict(self): result = super()._asdict() chk = self.checkpoint if not isinstance(chk, dict): result[f.CHECKPOINT.nm] = chk._asdict() # The field `batches` can to be a list of BatchIDs or of dicts. # If its a list of dicts then we don't need to serialize it. if not self.batches or not isinstance(self.batches[0], BatchID): return result result[f.BATCHES.nm] = [bid._asdict() for bid in self.batches] return result
class NewView(MessageBase): typename = NEW_VIEW schema = ( (f.VIEW_NO.nm, NonNegativeNumberField()), (f.VIEW_CHANGES.nm, IterableField(ViewChangeField())), # list of tuples (node_name, view_change_digest) (f.CHECKPOINT.nm, AnyField()), # Checkpoint to be selected as stable (TODO: or tuple?) (f.BATCHES.nm, IterableField(BatchIDField())) # list of tuples (view_no, pp_seq_no, pp_digest) # that should get into new view )