@classmethod
def _plan_assign_field_values(cls, path, graph, canvas):
    """Assign :class:`FieldValue` to a path.

        :param path: list of node_ids
        :param graph: BrowserGraph instance
        :param canvas: Planner instance
        :return:
        """
    prev_node = None
    for n, ndata in graph.iter_model_data(model_class='AllowableFieldType',
        nbunch=path):
        aft = ndata['model']
        sample = ndata['sample']
        if aft.field_type.role == 'output':
            if 'operation' not in ndata:
                op = canvas.create_operation_by_type_id(aft.field_type.
                    parent_id)
                fv = op.output(aft.field_type.name)
                canvas.set_field_value(fv, sample=sample)
                ndata['field_value'] = fv
                ndata['operation'] = op
            else:
                op = ndata['operation']
            if prev_node:
                input_aft = prev_node[1]['model']
                input_sample = prev_node[1]['sample']
                input_name = input_aft.field_type.name
                if input_aft.field_type.array:
                    input_fv = canvas.set_input_field_value_array(op,
                        input_name, sample=input_sample)
                else:
                    input_fv = canvas.set_field_value(op.input(input_name),
                        sample=input_sample)
                prev_node[1]['field_value'] = input_fv
                prev_node[1]['operation'] = op
        prev_node = n, ndata
