def create(self, validated_data, **kwargs): view_obj = None try: view_obj = View( workflow=self.context['workflow'], name=validated_data['name'], description_text=validated_data['description_text'], formula=validated_data['formula']) view_obj.save() # Load the columns in the view columns = ColumnNameSerializer( data=validated_data.get('columns'), many=True, required=False, ) if columns.is_valid(): for citem in columns.data: column = view_obj.workflow.columns.get(name=citem['name']) view_obj.columns.add(column) view_obj.save() else: raise Exception(_('Incorrect column data')) except Exception: if view_obj and view_obj.id: view_obj.delete() raise return view_obj
class ViewSerializer(serializers.ModelSerializer): # This serializer only includes the column name (the structure is # serialized as part of the workflow columns = ColumnNameSerializer(required=False, many=True) def create(self, validated_data, **kwargs): view_obj = View(workflow=self.context['workflow'], name=validated_data['name'], description_text=validated_data['description_text'], formula=validated_data['formula']) view_obj.save() # Load the columns in the view columns = ColumnNameSerializer( data=validated_data.get('columns'), many=True, required=False, ) if columns.is_valid(): for citem in columns.data: column = view_obj.workflow.columns.get(name=citem['name']) view_obj.columns.add(column) view_obj.save() else: view_obj.delete() return None return view_obj class Meta: model = View exclude = ('id', 'workflow', 'created', 'modified')
def create(self, validated_data, **kwargs): # Process first the used_columns field to get a sense of how many # columns, their type how many of them new, etc. etc. new_columns = [] for citem in validated_data['used_columns']: cname = citem.get('name', None) if not cname: raise Exception('Incorrect column name {0}.'.format(cname)) col = Column.objects.filter(workflow=self.context['workflow'], name=cname).first() if not col: # new column if citem['is_key']: raise Exception('New action cannot have non-existing key ' 'column {0}'.format(cname)) # Accummulate the new columns just in case we have to undo # the changes new_columns.append(citem) continue # existing column if col.data_type != citem.get('data_type', None) or \ col.is_key != citem['is_key'] or \ set(col.categories) != set(citem['categories']): # The two columns are different raise Exception( 'Imported column {0} is different from existing ' 'one.'.format(cname)) new_column_names = [x['name'] for x in new_columns] action_obj = None try: # used_columns has been verified. action_obj = Action( workflow=self.context['workflow'], name=validated_data['name'], description_text=validated_data['description_text'], is_out=validated_data['is_out'], serve_enabled=validated_data['serve_enabled'], active_from=validated_data['active_from'], active_to=validated_data['active_to'], content=validated_data.get('content', '')) action_obj.save() if new_columns: # There are some new columns that need to be created column_data = ColumnSerializer(data=new_columns, many=True, context=self.context) # And save its content if column_data.is_valid(): column_data.save() workflow = self.context['workflow'] df = pandas_db.load_from_db(self.context['workflow'].id) if df is None: # If there is no data frame, there is no point on # adding columns. Column.objects.filter( workflow=self.context['workflow'], name__in=new_column_names).delete() action_obj.delete() raise Exception('Action cannot be imported with and ' 'empty data table') for col in Column.objects.filter( workflow=workflow, name__in=new_column_names): # Add the column with the initial value df = ops.data_frame_add_column(df, col, None) # Update the column position col.position = len(df.columns) col.save() # Store the df to DB ops.store_dataframe_in_db(df, workflow.id) else: raise Exception('Unable to create column data') # Load the conditions pointing to the action condition_data = ConditionSerializer( data=validated_data.get('conditions', []), many=True, context={'action': action_obj}) if condition_data.is_valid(): condition_data.save() else: raise Exception('Unable to create condition information') # Update the condition variables for each formula if not present for condition in action_obj.conditions.all(): if condition.columns.all().count() == 0: col_names = get_variables(condition.formula) # Add the corresponding columns to the condition condition.columns.set( self.context['workflow'].columns.filter( name__in=col_names)) # Load the columns field columns = ColumnNameSerializer(data=validated_data['columns'], many=True, required=False, context=self.context) if columns.is_valid(): for citem in columns.data: column = action_obj.workflow.columns.get( name=citem['name']) action_obj.columns.add(column) columns.save() else: raise Exception('Unable to create columns field') except Exception: if action_obj and action_obj.id: action_obj.delete() Column.objects.filter(workflow=self.context['workflow'], name__in=new_column_names).delete() raise return action_obj