Swisslinux.org

− The GNU/Linux crossroads in Switzerland −

 

Language

 

The Forum

You are not logged in.

#1 15 Jun 2010 18:52:58

Tengu
Gourou(e) du libre
From: La Tour-de-Peilz
Registered: 17 Nov 2004
Posts: 493
Website

[Python] récursions avec les dossiers IMAP

Hello,

Je suis en train de me prendre la tête un peu méchament avec une récursions des plus sympatiques.
Le contexte : je tente de me faire un webmail à base de python (via le framework pylons) et la lib JS ukijs. Tout va presque bien (les encodings explosent joyeusement et tout - détail), sauf que je me pète les dents sur l'affichage des dossiers IMAP.

Utilisant imaplib[1], je me retrouve avec un array de ce genre :
['Inbox.archive', 'Inbox.archive.2007', 'Inbox.entreprise', 'Inbox', 'Inbox.prive', 'Inbox.prive.parents', 'Inbox.archive.2007.entreprise']

Or, ukijs s'attend à avoir un beau JSON de ce type :

Code:

[
  {'Inbox', 'children': [ 
    {'archive', 'children': [
      {'2007', 'children': [
        {'entreprise'}
      ]}
    ]}, {'entrprise'}, 
    {'prive', 'children': [
      {'parents'}
    ]} 
  ]}
]

(bon le json réel est un poil plus compliqué, mais dans l'ensemble, c'est ça... le json en question : http://ukijs.org/mail/mailbox/?callback … 6620862358 )

J'avoue ne pas savoir par quel bout empoigner le problème. J'ai passé pas mal de temps à chercher, mais rien trouvé... Si quelqu'un a déjà eu ce genre de petit délice...

Merci d'avance.

++

T.


1. http://docs.python.org/library/imaplib.html


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Offline

 

#2 15 Jun 2010 21:33:42

BOFH
Admin
From: Ecublens, VD
Registered: 03 Feb 2005
Posts: 862
Website

Re: [Python] récursions avec les dossiers IMAP

Disclaimer: je fais du python depuis moins de 24h big_smile

Code:

def deepset(l,ks):
        found = False
        node = {}
        for folder in l:
                if folder["name"] == ks[0]:
                        found = True
                        node = folder
        if not found:
                node = {"name": ks[0]}
                l.append(node)
        if (len(ks) > 1):
                if "children" not in node:
                        node["children"] = []
                deepset(node["children"], ks[1:])

def parse(data):
        l = []
        for s in data:
                deepset(l,s.split("."))
        return l

data = ['Inbox.archive', 'Inbox.archive.2007', 'Inbox.entreprise', 'Inbox', 'Inbox.prive', 'Inbox.prive.parents', 'Inbox.archive.2007.entreprise']

>>> parse(data)

[{'name': 'Inbox', 'children': [{'name': 'archive', 'children': [{'name': '2007', 'children': [{'name': 'entreprise'}]}]}, {'name': 'entreprise'}, {'name': 'prive', 'children': [{'name': 'parents'}]}]}]

Offline

 

#3 15 Jun 2010 22:03:04

Tengu
Gourou(e) du libre
From: La Tour-de-Peilz
Registered: 17 Nov 2004
Posts: 493
Website

Re: [Python] récursions avec les dossiers IMAP

didjiu. magique! et rapide en plus. Vais voir ce que ça donne avec mes "quelques" dossiers smile


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Offline

 

#4 15 Jun 2010 22:30:51

Tengu
Gourou(e) du libre
From: La Tour-de-Peilz
Registered: 17 Nov 2004
Posts: 493
Website

Re: [Python] récursions avec les dossiers IMAP

Sans changer le fonctionnement du code, voici ce que je fais maintenant :

Code:

    rsp, data = self.connection.list()
    test = map(self.__parse_list_response, data)
    self.json_dir = parse(test)

self.connection est en fait un imaplib.IMAP4_SSL connecté

Merci, B0FH smile


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Offline

 

Board footer

Powered by FluxBB