<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_tree(cls, *condition, **kwargs):
 """ parent is root parent value, default is None current is current value condition is extra condition for select root records mode is search method, value is 'wide' or 'deep' """

        parent_field = kwargs.pop('parent_field', 'parent')
        parent = kwargs.pop('parent', None)
        parent_order_by = kwargs.pop('parent_order_by', None)
        current = kwargs.pop('current', None)
        order_by = kwargs.pop('order_by', None)
        id_field = kwargs.pop('id_field', 'id')
        mode = kwargs.pop('mode', 'wide')
        if mode not in ('wide', 'deep'):
            raise Exception("mode parameter should be 'wide' or 'deep', but '{}' found.".format(mode))

        def _f(parent):
            query = cls.filter(cls.c[parent_field]==parent, *condition)
            if order_by is not None:
                query.order_by(order_by)
            for row in query:
                if mode == 'wide':
                    yield row
                for _row in _f(getattr(row, id_field)):
                    yield _row
                if mode == 'deep':
                    yield row

        if current:
            query = cls.filter(cls.c[id_field]==current)
        else:
            if is_condition(parent):
                query = cls.filter(parent)
            else:
                query = cls.filter(cls.c[parent_field]==parent)
        if parent_order_by is not None:
            query.order_by(parent_order_by)
        for row in query:
            if mode == 'wide':
                yield row
            for r in _f(getattr(row, id_field)):
                yield r
            if mode == 'deep':
                yield row