def workflow_restrict_column(column: Column) -> Optional[str]: """Set category of the column to the existing set of values. Given a workflow and a column, modifies the column so that only the values already present are allowed for future updates. :param column: Column object to restrict :return: String with error or None if correct """ # Load the data frame data_frame = load_table(column.workflow.get_data_frame_table_name()) cat_values = set(data_frame[column.name].dropna()) if not cat_values: # Column has no meaningful values. Nothing to do. return _('Column has no meaningful values') # Set categories column.set_categories(list(cat_values)) column.save() # Re-evaluate the operands in the workflow column.workflow.set_query_builder_ops() column.workflow.save() # Correct execution return None
def create(self, validated_data, **kwargs): # Preliminary checks data_type = validated_data.get('data_type', None) if data_type is None or \ data_type not in pandas_datatype_names.values(): # The data type is not legal raise Exception(_('Incorrect data type {0}.').format(data_type)) column_obj = None try: # Create the object, but point to the given workflow column_obj = Column( name=validated_data['name'], description_text=validated_data.get('description_text', ''), workflow=self.context['workflow'], data_type=data_type, is_key=validated_data.get('is_key', False), position=validated_data.get('position', 0), in_viz=validated_data.get('in_viz', True), active_from=validated_data.get('active_from', None), active_to=validated_data.get('active_to', None), ) # Set the categories if they exists column_obj.set_categories(validated_data.get('categories', []), True) if column_obj.active_from and column_obj.active_to and \ column_obj.active_from > column_obj.active_to: raise Exception( _('Incorrect date/times in the active window for ' 'column {0}').format(validated_data['name'])) # TODO: Fix the position field when creating the columns # All tests passed, proceed to save the object. column_obj.save() except Exception as e: if column_obj: column_obj.delete() raise e return column_obj