def create_chapters_lists(jstruct):
    lista_capitulos = {}    # {'isbn13':['nome_cap01', ...]}
    for analitica in (analitica for analitica in jstruct['docs']
                      if 'a' in analitica[LILACS_NIVEL_TRATAMENTO][0]['_']):
        try:
            isbn13 = str(toISBN13(get(analitica, LILACS_ISBN, '')))
        except (InvalidISBN, KeyError):
            isbn = get(analitica, LILACS_ISBN, 'faltante')
            isbns_invalidos.append((get(analitica, LILACS_IDNUM), isbn))
            continue

        ordem = int(get(analitica, LILACS_CHAPTER_ORDER, 999))
        sbid_analitica = reprbase(int(get(analitica, LILACS_IDNUM)))
        title_chapter = get(analitica, LILACS_CHAPER_NAME)
        titulo = [('title',title_chapter), ('sbid',sbid_analitica)]
        capitulo = (ordem, titulo)
        if lista_capitulos.has_key(isbn13):
            lista_capitulos[isbn13].append(capitulo)
        else:
            lista_capitulos[isbn13] = [capitulo]


    for key in lista_capitulos:
        capitulos = lista_capitulos[key]
        capitulos.sort()
        lista_capitulos[key] = [cap[1] for cap in capitulos]


    return lista_capitulos
def create_chapters_lists(jstruct):
    lista_capitulos = {}  # {'isbn13':['nome_cap01', ...]}
    for analitica in (analitica for analitica in jstruct['docs']
                      if 'a' in analitica[LILACS_NIVEL_TRATAMENTO][0]['_']):
        try:
            isbn13 = str(toISBN13(get(analitica, LILACS_ISBN, '')))
        except (InvalidISBN, KeyError):
            isbn = get(analitica, LILACS_ISBN, 'faltante')
            isbns_invalidos.append((get(analitica, LILACS_IDNUM), isbn))
            continue

        ordem = int(get(analitica, LILACS_CHAPTER_ORDER, 999))
        sbid_analitica = reprbase(int(get(analitica, LILACS_IDNUM)))
        title_chapter = get(analitica, LILACS_CHAPER_NAME)
        titulo = [('title', title_chapter), ('sbid', sbid_analitica)]
        capitulo = (ordem, titulo)
        if lista_capitulos.has_key(isbn13):
            lista_capitulos[isbn13].append(capitulo)
        else:
            lista_capitulos[isbn13] = [capitulo]

    for key in lista_capitulos:
        capitulos = lista_capitulos[key]
        capitulos.sort()
        lista_capitulos[key] = [cap[1] for cap in capitulos]

    return lista_capitulos
def create_document(isis, lista_capitulos):
    monograph_sbid = ''
    edition = ''
    synopsis = ''
    chapte_order = ''
    chapter_title = ''
    chapters_list = []
    chapter_creator = []

    _id = reprbase(int(get(isis, LILACS_IDNUM)))
    title = get(isis, LILACS_TITULO_MONOGRAFICO)

    try:
        isbn = toISBN13(get(isis, LILACS_ISBN, ''))
    except InvalidISBN:
        isbn = get(isis, LILACS_ISBN, 'faltante')
        isbns_invalidos.append((get(isis, LILACS_IDNUM), isbn))

    publisher = get(isis, LILACS_EDITORA)
    edition = get(isis, LILACS_EDICAO)
    year = get(isis, LILACS_DATA_PUBLICACAO)
    doctype = get(isis, LILACS_NIVEL_TRATAMENTO)
    creator = [[('role','author'),('full_name',name['_'])] for name in isis[LILACS_AUTOR_PESSOAL_MONOGRAFICO]]
    shortname = dict(creator[0])['full_name'].split(',')[0].split()[0] #com certeza tem alguma maneira bem mais elegante de fazer isso
    shortname = ''.join((c for c in unicodedata.normalize('NFD', shortname)
                         if unicodedata.category(c) != 'Mn')).lower()
    language = get(isis, LILACS_LANGUAGE)

    if 'a' in doctype:
        doctype = 'Part'
        pages = [('initial', isis[LILACS_PAGINAS_ANALITICO][0].get('f')), ('final', isis[LILACS_PAGINAS_ANALITICO][0].get('l'))]
        try:
            monograph_sbid = isbns_sbid[isbn]
        except KeyError:
            capitulos_sem_sbid_monografica.append((isbn, get(isis, LILACS_IDNUM)))

        chapter_title = get(isis,LILACS_TITULO_ANALITICO)

        try:
            chapter_creator = [[('role','author'),('full_name',name['_'])] for name in isis[LILACS_AUTOR_PESSOAL_ANALITICO]]
        except KeyError:
            chapter_creator = []

        try:
            chapte_order = get(isis, LILACS_ORDEM_CAPITULO)
        except KeyError:
            chapte_order = 999
            capitulos_sem_ordem.append((isbn,get(isis, LILACS_IDNUM)))

    else:
        doctype = 'Monograph'
        pages = get(isis,LILACS_PAGINAS_MONOGRAFICO)
        try:
            synopsis = isis[LILACS_RESUMO][0]['_']
        except KeyError:
            monografias_sem_resumo.append((isbn,get(isis, LILACS_IDNUM)))

        try:
            chapters_list = lista_capitulos[isbn]
        except KeyError:
            monografias_sem_capitulos.append(isbn)

    document = {
        '_id':_id,             #sbid        
        'TYPE':doctype,        #m a mc am a ...
        'isbn':isbn,
        'pages':pages,        
    }



    if doctype == 'Part':
        document.update({
            'creators':chapter_creator,
            'title':chapter_title,    #nivel analitico apenas
            'order':str(chapte_order).zfill(2),    #nivel analitico apenas (campo 902)
            'monograph':monograph_sbid,    #nivel analitico apenas (campo 903)                        
        })

    else:
        document.update({
            'visible':True,
            'edition':edition,
            'shortname':shortname,            
            'title':title,
            'creators':creator,
            'publisher':publisher,
            'language':language,
            'year':year,
            'synopsis':synopsis,        #nivel monografico apenas            
        })

    return document
    monografias_sem_pdf = []
    monografias_sem_thumbnail = []
    capitulos_sem_pdf = []

    INPUT_NAME = argv[1]
    
    server = couchdbkit.Server(db_uri)
    db = server.get_or_create_db(db_name)

    with open(INPUT_NAME) as jfile:
        jstruct = json.load(jfile)

    for mono in (mono for mono in jstruct['docs']
                      if 'a' not in get(mono, LILACS_NIVEL_TRATAMENTO)):
        try:
            isbns_sbid[toISBN13(get(mono, LILACS_ISBN, ''))] = reprbase(int(get(mono, LILACS_IDNUM)))
        except InvalidISBN:
            pass

    lista_capitulos = create_chapters_lists(jstruct)
    documents = jstruct['docs']

    for doc in documents:        
        doc_appstruct = create_document(doc, lista_capitulos)
        if doc_appstruct['TYPE'] == 'Monograph':
            monograph = models.Monograph.from_python(doc_appstruct)

            try:
                monograph.cover = {'fp':get_monograph_cover(monograph._id),
                                   'uid':'coveruid',
                                   'filename':'cover.jpg'}
def create_document(isis, lista_capitulos):
    monograph_sbid = ''
    edition = ''
    synopsis = ''
    chapte_order = ''
    chapter_title = ''
    chapters_list = []
    chapter_creator = []

    _id = reprbase(int(get(isis, LILACS_IDNUM)))
    title = get(isis, LILACS_TITULO_MONOGRAFICO)

    try:
        isbn = toISBN13(get(isis, LILACS_ISBN, ''))
    except InvalidISBN:
        isbn = get(isis, LILACS_ISBN, 'faltante')
        isbns_invalidos.append((get(isis, LILACS_IDNUM), isbn))

    publisher = get(isis, LILACS_EDITORA)
    edition = get(isis, LILACS_EDICAO)
    year = get(isis, LILACS_DATA_PUBLICACAO)
    doctype = get(isis, LILACS_NIVEL_TRATAMENTO)
    creator = [[('role', 'author'), ('full_name', name['_'])]
               for name in isis[LILACS_AUTOR_PESSOAL_MONOGRAFICO]]
    shortname = dict(creator[0])['full_name'].split(',')[0].split()[
        0]  #com certeza tem alguma maneira bem mais elegante de fazer isso
    shortname = ''.join((c for c in unicodedata.normalize('NFD', shortname)
                         if unicodedata.category(c) != 'Mn')).lower()
    language = get(isis, LILACS_LANGUAGE)

    if 'a' in doctype:
        doctype = 'Part'
        pages = [('initial', isis[LILACS_PAGINAS_ANALITICO][0].get('f')),
                 ('final', isis[LILACS_PAGINAS_ANALITICO][0].get('l'))]
        try:
            monograph_sbid = isbns_sbid[isbn]
        except KeyError:
            capitulos_sem_sbid_monografica.append(
                (isbn, get(isis, LILACS_IDNUM)))

        chapter_title = get(isis, LILACS_TITULO_ANALITICO)

        try:
            chapter_creator = [[('role', 'author'), ('full_name', name['_'])]
                               for name in isis[LILACS_AUTOR_PESSOAL_ANALITICO]
                               ]
        except KeyError:
            chapter_creator = []

        try:
            chapte_order = get(isis, LILACS_ORDEM_CAPITULO)
        except KeyError:
            chapte_order = 999
            capitulos_sem_ordem.append((isbn, get(isis, LILACS_IDNUM)))

    else:
        doctype = 'Monograph'
        pages = get(isis, LILACS_PAGINAS_MONOGRAFICO)
        try:
            synopsis = isis[LILACS_RESUMO][0]['_']
        except KeyError:
            monografias_sem_resumo.append((isbn, get(isis, LILACS_IDNUM)))

        try:
            chapters_list = lista_capitulos[isbn]
        except KeyError:
            monografias_sem_capitulos.append(isbn)

    document = {
        '_id': _id,  #sbid        
        'TYPE': doctype,  #m a mc am a ...
        'isbn': isbn,
        'pages': pages,
    }

    if doctype == 'Part':
        document.update({
            'creators': chapter_creator,
            'title': chapter_title,  #nivel analitico apenas
            'order':
            str(chapte_order).zfill(2),  #nivel analitico apenas (campo 902)
            'monograph':
            monograph_sbid,  #nivel analitico apenas (campo 903)                        
        })

    else:
        document.update({
            'visible': True,
            'edition': edition,
            'shortname': shortname,
            'title': title,
            'creators': creator,
            'publisher': publisher,
            'language': language,
            'year': year,
            'synopsis': synopsis,  #nivel monografico apenas            
        })

    return document
    monografias_sem_pdf = []
    monografias_sem_thumbnail = []
    capitulos_sem_pdf = []

    INPUT_NAME = argv[1]

    server = couchdbkit.Server(db_uri)
    db = server.get_or_create_db(db_name)

    with open(INPUT_NAME) as jfile:
        jstruct = json.load(jfile)

    for mono in (mono for mono in jstruct['docs']
                 if 'a' not in get(mono, LILACS_NIVEL_TRATAMENTO)):
        try:
            isbns_sbid[toISBN13(get(mono, LILACS_ISBN, ''))] = reprbase(
                int(get(mono, LILACS_IDNUM)))
        except InvalidISBN:
            pass

    lista_capitulos = create_chapters_lists(jstruct)
    documents = jstruct['docs']

    for doc in documents:
        doc_appstruct = create_document(doc, lista_capitulos)
        if doc_appstruct['TYPE'] == 'Monograph':
            monograph = models.Monograph.from_python(doc_appstruct)

            try:
                monograph.cover = {
                    'fp': get_monograph_cover(monograph._id),