def set_event(self, timestamp, row): if timestamp.tzinfo is None or \ timestamp.tzinfo.utcoffset(timestamp) is None: timestamp = INTERNAL_TIMEZONE.localize(timestamp) # Update first and latest value. if 'value' in row: if not self.latest_value_timestamp \ or self.latest_value_timestamp <= timestamp: if self.value_type in ( Timeseries.ValueType.INTEGER, Timeseries.ValueType.FLOAT ): self.latest_value_number = row['value'] elif self.value_type in ( Timeseries.ValueType.TEXT, Timeseries.ValueType.IMAGE, Timeseries.ValueType.GEO_REMOTE_SENSING): self.latest_value_text = row['value'] self.latest_value_timestamp = timestamp if not self.first_value_timestamp \ or timestamp < self.first_value_timestamp: self.first_value_timestamp = timestamp store = DataStore() store.write_row('events', self.uuid, timestamp, row)
def get_events(self, start=None, end=None, filter=None, ignore_rejected=None): if filter is None: filter = ['value', 'flag'] if start and ( start.tzinfo is None or start.tzinfo.utcoffset(start) is None ): start = INTERNAL_TIMEZONE.localize(start) if end and ( end.tzinfo is None or end.tzinfo.utcoffset(end) is None ): end = INTERNAL_TIMEZONE.localize(end) if (self.first_value_timestamp is None or self.latest_value_timestamp is None): # If there's no first or last timestamp, there's no data. # So make sure Cassandra returns nothing with no hard work. start = None end = None else: if start is None or start < self.first_value_timestamp: start = self.first_value_timestamp if end is None or end > self.latest_value_timestamp: end = self.latest_value_timestamp + timedelta(seconds=1) if start > end: start = None end = None store = DataStore() value_type_map = { Timeseries.ValueType.FLOAT: 'float', Timeseries.ValueType.INTEGER: 'integer', } convert_values_to = value_type_map.get(self.value_type) return store.read( 'events', self.uuid, start, end, params=filter, convert_values_to=convert_values_to, ignore_rejected=ignore_rejected )
def set_file(self, timestamp, content): if not self.is_file(): raise Exception("Timeseries is not a file type.") if timestamp.tzinfo is None or \ timestamp.tzinfo.utcoffset(timestamp) is None: timestamp = INTERNAL_TIMEZONE.localize(timestamp) dt = timestamp.strftime(FILENAME_FORMAT) data_dir = self._data_dir(timestamp) file_path = data_dir + dt temp = tempfile.NamedTemporaryFile(delete=False) temp.write(content) if not os.path.exists(data_dir): os.makedirs(data_dir) shutil.move(temp.name, file_path) row = {"datetime": dt, "value": file_path} self.set_event(timestamp, row)