<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def collect_columns(self):
 """ Collect columns information from a given model. a column info contains the py3 informations exclude Should the column be excluded from the current context ? name the name of the key in the resulting py3o context of the column __col__ The original column object __prop__ In case of a relationship, the SqlaContext wrapping the given object """

        res = []
        for prop in self.get_sorted_columns():

            info_dict = self.get_info_field(prop)
            export_infos = info_dict.get('export', {}).copy()

            main_infos = export_infos.get(self.config_key, {}).copy()

            if export_infos.get('exclude'):
                if main_infos.get('exclude', True):
                    continue

            infos = export_infos
            infos.update(main_infos)

            # Si la clé name n'est pas définit on la met au nom de la colonne
            # par défaut
            infos.setdefault('name', prop.key)
            infos['__col__'] = prop
            if isinstance(prop, RelationshipProperty):
                join = str(prop.primaryjoin)
                if join in self.rels:
                    continue
                else:
                    self.rels.append(str(join))
                    infos['__prop__'] = SqlaContext(
                        prop.mapper,
                        rels=self.rels[:]
                    )

            res.append(infos)
        return res