def update(self, result: ProcessorResult) -> None: """ Sets the value of the cell""" if isinstance(result.data, Series): if result.data.empty: self.value = ProcessorResult(False, 'Empty series as a result of processing.') else: self.value = ProcessorResult(True, result.data.iloc[-1]) else: self.value = ProcessorResult(True, result.data) self.updated_time = get_utc_now()
def _process_special_cells(self) -> None: """ Processes Coordinate and Entity cells :return: None """ # fetch entity cells for cell in self._entity_cells: try: cell.value = cell.processor.process(cell.entity) except Exception as e: cell.value = f'Error Calculating processor {cell.processor.__class__.__name__} ' \ f'for entity: {cell.entity.get_marquee_id()} due to {e}' cell.updated_time = get_utc_now() for cell in self._coord_processor_cells: try: cell.value = cell.processor.process() except Exception as e: cell.value = f'Error Calculating processor {cell.processor.__class__.__name__} ' \ f'for entity: {cell.entity.get_marquee_id()} due to {e}' cell.updated_time = get_utc_now()
def initialize(self) -> None: """ Initializes the DataGrid. Iterates over all rows and columns, preparing cell structures. Cells then contain a graph and data queries to leaf processors. Upon providing data to a leaf, the leaf processor is calculated and propagated up the graph to the cell level. """ all_queries: List[DataQueryInfo] = [] entity_cells: List[DataCell] = [] current_row_group = None # Loop over rows, columns for row_index, row in enumerate(self.rows): if isinstance(row, RowSeparator): current_row_group = row.name continue entity: Entity = row.entity cells: List[DataCell] = [] row_overrides = row.overrides for column_index, column in enumerate(self.columns): column_name = column.name column_processor = column.processor # Get all the data coordinate overrides and apply the processor override if it exists data_overrides, value_override, processor_override = _get_overrides( row_overrides, column_name) # Create the cell cell: DataCell = DataCell(column_name, column_processor, entity, data_overrides, column_index, row_index, current_row_group) if processor_override: # Check if there is a processor override and apply if so cell.processor = processor_override if value_override: cell.value = ProcessorResult(True, value_override.value) cell.updated_time = get_utc_now() elif isinstance(column_processor, EntityProcessor): # store these cells to fetch entity data during poll entity_cells.append(cell) elif isinstance(column_processor, CoordinateProcessor): # store these cells to fetch entity data during poll if len(data_overrides): # Get the last in the list if more than 1 override is given cell.processor.children['a'].set_dimensions( data_overrides[-1].dimensions) self._coord_processor_cells.append(cell) else: # append the required queries to the map cell.build_cell_graph(all_queries) cells.append(cell) self._cells.extend(cells) self.results.append(cells) self._data_queries = all_queries self._entity_cells = entity_cells self.is_initialized = True