示例#1
0
def creer_articles_section(texte, niveau, version_section_parente, articles, version_texte, cid, cache):
    
    marque_niveau = ''
    for i in range(niveau):
        marque_niveau = marque_niveau + '#'
    
    # Champ Article
    articles_section = articles.select().where(Article.version_section == version_section_parente)
    
    # Itérer sur les articles de cette section
    for article in articles_section:
        
        if comp_infini_strict(version_texte.debut, article.debut) or comp_infini_strict(article.fin, version_texte.fin):
            raise Exception('article non valide (version texte de {} à {}, version article de {} à {})'.format(version_texte.debut, version_texte.fin, article.debut, article.fin))
            continue
        
        chemin_markdown = os.path.join(cache, 'markdown', cid, article.id + '.md')
        f_article = open(chemin_markdown, 'r')
        texte_article = f_article.read().decode('utf-8')
        f_article.close()
        
        texte = texte                                                      \
                + marque_niveau + ' Article ' + article.num.strip() + '\n' \
                + '\n'                                                     \
                + texte_article + '\n'                                     \
                + '\n'                                                     \
                + '\n'
        
    return texte
示例#2
0
def creer_sections(texte, niveau, version_section_parente, versions_sections, articles, version_texte, cid, cache):
    
    marque_niveau = ''
    for i in range(niveau):
        marque_niveau = marque_niveau + '#'
    
    # Champ Version_section
    versions_section = versions_sections.select().where(Version_section.id_parent == version_section_parente).order_by(Version_section.numero)
    
    # Itérer sur les sections de cette section
    for version_section in versions_section:
        
        if comp_infini_strict(version_texte.debut, version_section.debut) or comp_infini_strict(version_section.fin, version_texte.fin):
            raise Exception('section non valide (version texte de {} à {}, version section de {} à {})'.format(version_texte.debut, version_texte.fin, version_section.debut, version_section.fin))
            return texte
        
        texte = texte                                                      \
                + marque_niveau + ' ' + version_section.nom.strip() + '\n' \
                + '\n'
        
        texte = creer_sections(texte, niveau+1, version_section, versions_sections, articles, version_texte, cid, cache)
        
        texte = creer_articles_section(texte, niveau, version_section, articles, version_texte, cid, cache)
    
    return texte
示例#3
0
def creer_sections(texte, niveau, version_section_parente, versions_sections,
                   articles, version_texte, cid, format, sections, dossier,
                   cache):

    #print(sections)

    marque_niveau = ''
    for i in range(niveau):
        marque_niveau = marque_niveau + '#'

    # Champ Version_section
    versions_section = versions_sections.select().where(
        Version_section.id_parent == version_section_parente).order_by(
            Version_section.numero)

    # Itérer sur les sections de cette section
    for version_section in versions_section:

        if comp_infini_strict(version_texte.debut,
                              version_section.debut) or comp_infini_strict(
                                  version_section.fin, version_texte.fin):
            raise Exception(
                'section non valide (version texte de {} à {}, version section de {} à {})'
                .format(version_texte.debut, version_texte.fin,
                        version_section.debut, version_section.fin))
            return texte

        texte = texte                                                      \
                + marque_niveau + ' ' + version_section.nom.strip() + '\n' \
                + '\n'

        nouv_sections = sections
        nouv_sections.append(version_section.nom.strip())

        texte = creer_sections(texte, niveau + 1, version_section,
                               versions_sections, articles, version_texte, cid,
                               format, nouv_sections, dossier, cache)

        texte = creer_articles_section(texte, niveau + 1, version_section,
                                       articles, version_texte, cid, format,
                                       nouv_sections, dossier, cache)

    if len(versions_section) == 0:

        texte = creer_articles_section(texte, niveau + 1, None, articles,
                                       version_texte, cid, format, sections,
                                       dossier, cache)

    return texte
示例#4
0
def creer_articles_section(texte, niveau, version_section_parente, articles,
                           version_texte, cid, format, sections, dossier,
                           cache):

    marque_niveau = ''
    for i in range(niveau):
        marque_niveau = marque_niveau + '#'

    # Champ Article
    articles_section = articles.select().where(
        Article.version_section == version_section_parente)

    # Itérer sur les articles de cette section
    for article in articles_section:

        if comp_infini_strict(version_texte.debut,
                              article.debut) or comp_infini_strict(
                                  article.fin, version_texte.fin):
            raise Exception(
                'article non valide (version texte de {} à {}, version article de {} à {})'
                .format(version_texte.debut, version_texte.fin, article.debut,
                        article.fin))
            continue

        chemin_markdown = os.path.join(cache, 'markdown', cid,
                                       article.id + '.md')
        f_article = open(chemin_markdown, 'r')
        texte_article = f_article.read().decode('utf-8')
        f_article.close()

        texte = texte                                                      \
                + marque_niveau + ' Article ' + article.num.strip() + '\n' \
                + '\n'                                                     \
                + texte_article + '\n'                                     \
                + '\n'                                                     \
                + '\n'

        # Format « 1 dossier = 1 article »
        fichier = os.path.join(dossier, article.num.strip() + '.md')
        if format['organisation'] == 'repertoires-simple':
            texte_article = texte_article + '\n'
            f_texte = open(fichier, 'w')
            f_texte.write(texte_article.encode('utf-8'))
            f_texte.close()

    return texte
示例#5
0
def creer_articles_section(texte, niveau, version_section_parente, articles,
                           version_texte, cid, cache):

    marque_niveau = ''
    for i in range(niveau):
        marque_niveau = marque_niveau + '#'

    # Champ Article
    articles_section = articles.select().where(
        Article.version_section == version_section_parente)

    # Itérer sur les articles de cette section
    for article in articles_section:

        if comp_infini_strict(version_texte.debut,
                              article.debut) or comp_infini_strict(
                                  article.fin, version_texte.fin):
            raise Exception(
                'article non valide (version texte de {} à {}, version article de {} à {})'
                .format(version_texte.debut, version_texte.fin, article.debut,
                        article.fin))
            continue

        chemin_markdown = os.path.join(cache, 'markdown', cid,
                                       article.id + '.md')
        f_article = open(chemin_markdown, 'r')
        texte_article = f_article.read().decode('utf-8')
        f_article.close()

        texte = texte                                                      \
                + marque_niveau + ' Article ' + article.num.strip() + '\n' \
                + '\n'                                                     \
                + texte_article + '\n'                                     \
                + '\n'                                                     \
                + '\n'

    return texte
示例#6
0
def creer_sections(texte, niveau, parent, version_texte, sql, arborescence,
                   format, dossier, db, cache):

    marque_niveau = ''
    for i in range(niveau):
        marque_niveau = marque_niveau + '#'

    sql_section_parente = "parent = '{0}'".format(parent)
    if parent == None:
        sql_section_parente = "parent IS NULL OR parent = ''"

    sections = db.all("""
        SELECT *
        FROM sommaires
        WHERE ({0})
          AND ({1})
        ORDER BY position
    """.format(sql_section_parente, sql))

    # Itérer sur les sections de cette section
    for section in sections:

        rcid, rparent, relement, rdebut, rfin, retat, rnum, rposition, r_source = section
        #print('Article '+rnum+' : '+relement)

        if comp_infini_strict(version_texte[0], rdebut) or comp_infini_strict(
                rfin, version_texte[1]):
            raise Exception(
                u'section non valide (version texte de {} a {}, version section de {} à {})'
                .format(version_texte[0], version_texte[1], rdebut, rfin))
            return texte

        # L’élément est un titre de sommaire, rechercher son texte et l’ajouter à la liste
        if relement[4:8] == 'SCTA':
            tsection = db.one("""
                SELECT titre_ta, commentaire
                FROM sections
                WHERE id='{0}'
            """.format(relement))
            rarborescence = arborescence
            rarborescence.append(tsection[0].strip())
            texte = texte                                  \
                    + marque_niveau + ' ' + tsection[0].strip() + '\n' \
                    + '\n'
            texte = creer_sections(texte, niveau + 1, relement, version_texte,
                                   sql, rarborescence, format, dossier, db,
                                   cache)

        # L’élément est un article, l’ajouter à la liste
        elif relement[4:8] == 'ARTI':

            article = db.one("""
                SELECT id, section, num, date_debut, date_fin, bloc_textuel, cid
                FROM articles
                WHERE id = '{0}'
            """.format(relement))
            id, section, num, date_debut, date_fin, bloc_textuel, cid = article
            if comp_infini_strict(version_texte[0],
                                  date_debut) or comp_infini_strict(
                                      date_fin, version_texte[1]):
                continue
            chemin_markdown = os.path.join(cache, 'markdown', cid, id + '.md')
            f_article = open(chemin_markdown, 'r')
            texte_article = f_article.read().decode('utf-8')
            f_article.close()

            texte = texte                                                        \
                    + marque_niveau + ' Article ' + num.strip() + '\n' \
                    + '\n'                                                       \
                    + texte_article + '\n'                                       \
                    + '\n'                                                       \
                    + '\n'

            # Format « 1 dossier = 1 article »
            fichier = os.path.join(dossier, id + '.md')
            if format['organisation'] == 'repertoires-simple':
                texte_article = texte_article + '\n'
                f_texte = open(fichier, 'w')
                f_texte.write(texte_article.encode('utf-8'))
                f_texte.close()

    return texte
示例#7
0
    def obtenir_texte_section( self, id, hierarchie, cid, debut_vigueur_texte, fin_vigueur_texte ):

        """
        Obtenir le texte d’une section donnée par un id.

        :param id:
            string - ID de la section.
        :param hierarchie:
            [(str, str)] - Liste de couples (id, titre_ta) donnant le contexte dans la hiérarchie des titres.
        :param cid:
            string - CID du texte.
        :param debut_vigueur_texte:
            datetime.date - date de début de vigueur demandée.
        :param fin_vigueur_texte:
            datetime.date - date de fin de vigueur autorisée par la requête.
        :returns:
            (string, datetime.date) - (texte, fin_vigueur) Texte de l’article, date de fin de vigueur interne (plus proche future modification de la section).
        """

        texte = ''
        fins_vigueur = set()

        if 'texte' not in self.sections or self.sections['texte'] != cid:

            self.sections = {}

            sections = self.db.all("""
                SELECT sommaires.parent,
                       sommaires.element,
                       sommaires.debut,
                       sommaires.fin,
                       sommaires.num,
                       sommaires.position,
                       sections.titre_ta,
                       sections.commentaire,
                       sections.mtime
                FROM sommaires
                LEFT JOIN sections
                       ON sommaires.element = sections.id
                WHERE sommaires.cid = '{0}'
                  AND (    sommaires.debut < sommaires.fin
                        OR sommaires.debut = '2999-01-01'
                      )
            """.format( cid ) )

            for section in sections:

                sparent, selement, sdebut, sfin, snum, sposition, stitre_ta, scommentaire, smtime = section

                sparent = sparent if sparent else None
                sdebut = datetime.date(*(time.strptime(sdebut, '%Y-%m-%d')[0:3])) if sdebut != '2999-01-01' else None
                sfin = datetime.date(*(time.strptime(sfin, '%Y-%m-%d')[0:3])) if sfin != '2999-01-01' else None

                if selement not in self.sections:
                    self.sections[selement] = {}
                self.sections[selement][sparent] = (sposition, snum, stitre_ta, sdebut, sfin, None, None, None)

            # Marquage de ce cache comme complet : il n’y a plus à le re-calculer
            self.sections['texte'] = cid

        sections = {}

        # Itérer sur les sections de cette section, le dictionnaire final servira ensuite à itérer dans l’ordre d’affichage des sections
        for section in self.sections:

            if section == 'texte' or id not in self.sections[section]:
                continue

            sfin = self.sections[section][id][4]
            sposition = self.sections[section][id][0]

            # La période de vigueur de cette section est expirée ou expire : ne pas l’ajouter au texte (sfin <= debut_vigueur_texte)
            # Le cas quasi-erroné où le texte n’a pas de début de vigueur est écarté ici, mais devrait probablement renvoyer une erreur ailleurs
            # TODO gérer le cas où debut_vigueur_texte == None (2 dans la base LEGI, à voir si AL trouve quand même des intervalles de vigueur)
            if debut_vigueur_texte and comp_infini_large( sfin, debut_vigueur_texte ):
                continue

            sections[sposition] = section

        # Itérer sur les sections non-expirées dans l’ordre d’affichage
        position = 0
        for i, section in sorted( sections.items() ):

            sposition, snum, stitre_ta, sdebut, sfin, cdebut, cfin, ctexte = self.sections[section][id]

            # Enregistrer la date de fin de vigueur de la section
            if sdebut != None and comp_infini_strict( debut_vigueur_texte, sdebut ):
                fins_vigueur.add( sdebut )
            if sfin != None and comp_infini_strict( debut_vigueur_texte, sfin ):
                fins_vigueur.add( sfin )

            # La période de vigueur de cette section n’est pas encore commencée (fin_vigueur_texte <= sdebut) 
            # Les sections intemporelles (= sans date de début de vigueur (et normalement sans date de fin de vigueur)) sont considérées comme toujours en vigueur
            if sdebut and comp_infini_large( fin_vigueur_texte, sdebut ):
                continue

            # Une des bornes de la période de vigueur de la section est strictement comprise dans l’intervalle courant de vigueur du texte : ce n’est pas censé arriver, les dates de changement de vigueur du texte sont censées être minimales
            if ( sdebut and comp_infini_strict( debut_vigueur_texte, sdebut ) ) or comp_infini_strict( sfin, fin_vigueur_texte ):
                raise Exception( 'Erreur interne : les intervalles de vigueur du texte sont être minimaux et il ne devrait donc pas exister une section avec une des bornes de vigueur strictement comprise dans l’intervalle courant de vigueur du texte' )

            position += 1
            # L’élément est un titre de sommaire, rechercher son texte et l’ajouter à la liste
            if section[4:8] == 'SCTA':

                chierarchie = hierarchie.copy()
                chierarchie.append( (position, section, stitre_ta) )

                # Le cache de section est valide et peut être utilisé pour ajouter le texte de la section
                # L’intervalle de vigueur du cache de sections comprend l’intervalle courant de vigueur du texte (cdebut <= debut_vigueur_texte and fin_vigueur_texte < cfin)
                # FIXME: pour les formats "articles" ou "sections", il faut désactiver ce "if" sinon certains fichier manquent, ajouter un paramètre ou autre mécanisme
                if not self.desactiver_cache and comp_infini_large( cdebut, debut_vigueur_texte ) and comp_infini_large( fin_vigueur_texte, cfin ):

                    texte = texte + ctexte

                    self.stockage.ecrire_ressource( section, chierarchie, snum, stitre_ta, ctexte )

                    # Si la section a une fin de vigueur, celle-ci devient une borne maximale de fin de vigueur des sections parentes
                    if cfin:
                        fins_vigueur.add( cfin )

                else:

                    if stitre_ta == None:
                        stitre_ta = '(sans titre)'

                    titre_formate = self.syntaxe.obtenir_titre( chierarchie, stitre_ta )
                    texte_section, fin_vigueur_section = self.obtenir_texte_section( section, chierarchie, cid, debut_vigueur_texte, fin_vigueur_texte )

                    snum = snum.strip() if snum else ''
                    texte_section = titre_formate + texte_section
                    texte = texte + texte_section

                    self.stockage.ecrire_ressource( section, chierarchie, snum, stitre_ta, texte_section )

                    self.sections[section][id] = (sposition, snum, stitre_ta, sdebut, sfin, debut_vigueur_texte, fin_vigueur_section, texte_section)

                    # Si la section a une fin de vigueur, celle-ci devient une borne maximale de fin de vigueur des sections parentes
                    if fin_vigueur_section:
                        fins_vigueur.add( fin_vigueur_section )

            # L’élément est un article, l’ajouter à la liste
            elif section[4:8] == 'ARTI':

                chierarchie = hierarchie.copy()
                chierarchie.append( (position, section, None) )

                valeur_article = self.fabrique_article.obtenir_texte_article( section, chierarchie, debut_vigueur_texte, fin_vigueur_texte )

                num, texte_article, debut_vigueur_article, fin_vigueur_article = valeur_article

                # L’article a une période de vigueur comprise dans l’intervalle courant de vigueur du texte : ajouter le texte
                if texte_article != None:
                    
                    texte = texte + texte_article

                    # Si l’article a une fin de vigueur, celle-ci devient une borne maximale de fin de vigueur des sections parentes
                    if fin_vigueur_article:
                        fins_vigueur.add( fin_vigueur_article )

                # Si l’article a un début de vigueur après l’intervalle courant de vigueur du texte,
                #   celle-ci devient une borne maximale de vigueur des sections parentes (debut_vigueur_texte < debut_vigueur_article)
                if comp_infini_strict( debut_vigueur_texte, debut_vigueur_article ) and debut_vigueur_article:
                    fins_vigueur.add( debut_vigueur_article )

        fin_vigueur = None
        if len( fins_vigueur ):
            fin_vigueur = min( fins_vigueur )

        return texte, fin_vigueur
示例#8
0
def enregistrer_versions_texte(version, livraison, dates, autres_sections, autres_articles, entree_texte, nouvelles_sections, nouveaux_articles, chemin_base, arbre):
    
    # Chercher les versions de textes de cette livraison
    dates = list(dates)
    dates.sort(cmp=comp_infini)

    def obtenir_sections(sections):
        for section in sections:
            yield {'id': section[0],
                   'nom': section[1],
                   'etat_juridique': section[2],
                   'niveau': section[3],
                   'numero': section[4],
                   'vigueur_debut': section[5],
                   'vigueur_fin': section[6],
                   'texte': section[7]}
    
    def obtenir_articles(articles):
        for article in articles:
            yield {'id': article[0],
                   'nom': article[1],
                   'etat_juridique': article[2],
                   'numero': article[3],
                   'vigueur_debut': article[4],
                   'vigueur_fin': article[5],
                   'condensat': article[6],
                   'texte': article[7]}
    
    def obtenir_travaux_articles(articles, chemin_base):
        for article in articles:
            yield {'version_article': article[0],
                   'texte': article[7],
                   'chemin': os.path.join(chemin_base, 'article', decompose_cid(article[0]+'.xml'))}
    
    # Import des enregistrements sections et articles
    # Il ne semble pas possible d’ajouter plus de 500 enregistrements
    #  par appel à insert_many, dont acte
    nouvelles_sections = list(nouvelles_sections)
    nouveaux_articles = list(nouveaux_articles)
    for i in range(0,int(math.ceil(float(len(nouvelles_sections))/tranches_bdd))):
        Version_section.insert_many(obtenir_sections(nouvelles_sections[i*tranches_bdd:(i+1)*tranches_bdd])).execute()
    for i in range(0,int(math.ceil(float(len(nouveaux_articles))/tranches_bdd))):
        Version_article.insert_many(obtenir_articles(nouveaux_articles[i*tranches_bdd:(i+1)*tranches_bdd])).execute()
    #for i in range(0,int(math.ceil(float(len(nouveaux_articles))/tranches_bdd))):
        #Travaux_articles.insert_many(obtenir_travaux_articles(nouveaux_articles[i*tranches_bdd:(i+1)*tranches_bdd], chemin_base)).execute()
    #Version_section.insert_many(obtenir_sections(nouvelles_sections)).execute()
    #Version_article.insert_many(obtenir_articles(nouveaux_articles)).execute()
    #Travaux_articles.insert_many(obtenir_travaux_articles(nouveaux_articles, chemin_base)).execute()
    
    # Remonter la dernière livraison (branche) jusqu’à la première
    # version commune avec cette nouvelle livraison
    entree_version_texte = None
    nouvelles_versions = set()
    if entree_texte.livraison:
        livraison_texte = Livraison_texte.select().where(
            Livraison_texte.livraison == entree_texte.livraison &
            Livraison_texte.texte == entree_texte
        ).order_by(Livraison_texte.version_texte.desc()).get()
        entree_version_texte = livraison_texte.version_texte
        
        # Cette boucle représente la première date de vigueur de la
        # nouvelle livraison. Réfléchir avec le croquis ci-dessous
        # en faisant varier N1 (N=nouveau) entre avant V1 et V3
        #    V1---------V2-----------V3-------V4-------V5
        #           N1-----------N2                   
        while not(entree_version_texte.vigueur_debut <= dates[0] and \
              comp_infini_strict(dates[0], entree_version_texte.vigueur_fin)):
            if entree_version_texte.version_prec == None:
                entree_version_texte = None
                break
            
            entree_version_texte = Version_texte.select().where(
                Version_texte.id == entree_version_texte.version_prec
            ).get()
        # TODO décider quoi faire si le titre ou une autre donnée
        #      mineure change -> nouvelle branche ? je dirais oui
        #      mais réfléchir finement, e.g. à etat_juridique
        if entree_version_texte != None and entree_version_texte.version_prec != None:
            entree_version_texte = Version_texte.select().where(
                Version_texte.id == entree_version_texte.version_prec
            ).get()
        
        # La première nouvelle version est à cheval entre deux
        # versions précédentes, il faut compléter l’intervalle VX-N1
        # J’imagine que ce cas ne doit jamais apparaître
        if entree_version_texte.vigueur_debut < dates[0] and \
           comp_infini_strict(dates[0], entree_version_texte.vigueur_fin):
            
            entree_version_texte = Version_texte.create(
                titre = version['TITRE'],
                titre_long = version['TITREFULL'],
                nature=version['NATURE'].lower(),
                date_texte=version['DATE_TEXTE'],
                date_publi=version['DATE_PUBLI'],
                date_modif=version['DERNIERE_MODIFICATION'],
                etat_juridique = version['ETAT'].lower(),
                vigueur_debut = entree_version_texte.vigueur_debut,
                vigueur_fin = dates[0],
                texte = entree_texte,
                version_prec=entree_version_texte
            )
            #nouvelles_versions |= {entree_version_texte}
            
            Livraison_texte.create(
                livraison = livraison,
                version_texte = entree_version_texte,
                texte = entree_texte
            )
            
            # TODO recopier les sections et articles de VX
            raise NonImplementeException()
    
    compteur_recursif(0)
    
    for i in range(len(dates) - 1):
        
        compteur_recursif(i+1, len(dates)-1)
        
        # Enregistrement de cette version de texte #OK
        entree_version_texte = Version_texte.create(
            titre = version['TITRE'],
            titre_long = version['TITREFULL'],
            nature=version['NATURE'].lower(),
            date_texte=version['DATE_TEXTE'],
            date_publi=version['DATE_PUBLI'],
            date_modif=version['DERNIERE_MODIFICATION'],
            etat_juridique = version['ETAT'].lower(),
            vigueur_debut = dates[i],
            vigueur_fin = dates[i+1],
            texte = entree_texte,
            version_prec=entree_version_texte
        )
        nouvelles_versions |= {entree_version_texte}
        
        # Inscription du lien entre texte, livraison et version de texte #OK
        Livraison_texte.create(
            livraison = livraison,
            version_texte = entree_version_texte,
            texte = entree_texte
        )
        
        # Inscription du lien entre livraison et sections
        sections = list(set(nouvelles_sections) | autres_sections)
        sections = [section for section in sections if (section[5] <= entree_version_texte.vigueur_debut) and comp_infini_large(entree_version_texte.vigueur_fin, section[6])]
        
        def liste_sections(sections, arbre, version_texte):
            for section in sections:
                yield {'version_section': section[0],
                       'version_texte': version_texte,
                       'id_parent': arbre[section[0]]}
        
        #print('tranches sections={} {} {} {}'.format(len(sections), float(len(sections))/tranches_bdd, math.ceil(float(len(sections))/tranches_bdd), int(math.ceil(float(len(sections))/tranches_bdd))))
        for i in range(0,int(math.ceil(len(sections)/tranches_bdd))):
            #print('{}'.format(len(sections[i*tranches_bdd:(i+1)*tranches_bdd])))
            Liste_sections.insert_many(liste_sections(sections[i*tranches_bdd:(i+1)*tranches_bdd], arbre, entree_version_texte)).execute()
        
        # Inscription du lien entre livraison et articles
        articles = list(set(nouveaux_articles) | autres_articles)
        articles = [a for a in articles if (a[4] <= entree_version_texte.vigueur_debut) and comp_infini_large(entree_version_texte.vigueur_fin, a[5])]
        
        def liste_articles(articles, arbre, version_texte):
            for article in articles:
                yield {'version_article': article[0],
                       'version_texte': version_texte,
                       'id_parent': arbre[article[0]]}
        
        #print('tranches articles={} {} {} {}'.format(len(articles), float(len(articles))/tranches_bdd, math.ceil(float(len(articles))/tranches_bdd), int(math.ceil(float(len(articles))/tranches_bdd))))
        for i in range(0,int(math.ceil(len(articles)/tranches_bdd))):
            #print('{}'.format(len(articles[i*tranches_bdd:(i+1)*tranches_bdd])))
            Liste_articles.insert_many(liste_articles(articles[i*tranches_bdd:(i+1)*tranches_bdd], arbre, entree_version_texte)).execute()
        
        compteur_recursif()
    
    # Enregistrer cette livraison du texte comme étant calculée
    entree_texte.livraison = livraison
    entree_texte.save()
示例#9
0
def ranger_articles_xml(chemin_base, coll_articles, entree_texte, dates, \
                        autres_articles, nouveaux_articles, \
                        date_codification, id_parent, arbre):
    
    # Si pas d’article dans cette section
    if coll_articles == None:
        return dates, autres_articles, nouveaux_articles, arbre
    
    # Sinon itérer sur les articles
    for i, article in enumerate(coll_articles):
        
        # Affichage de l’avancement
        compteur_recursif(i+1, len(coll_articles), True)
        
        # Lecture brute des attributs XML
        id = article['id']
        nom = article['num']
        etat_juridique = article['etat']
        vigueur_debut = normalise_date(article['debut'])
        vigueur_fin = normalise_date(article['fin'])
        numero = i+1
        
        # HACK - il ne devrait pas y avoir de date antérieure à la codification mais il y en a
        if date_codification and comp_infini_strict(vigueur_debut, date_codification):
            print('vigueur_debut article defectueuse {} < {}'.format(vigueur_debut,date_codification))
            vigueur_debut = date_codification
        if date_codification and comp_infini_large(vigueur_fin, date_codification):
            print('vigueur_fin article defectueuse {} <= {}'.format(vigueur_fin,date_codification))
            raise Exception()
            compteur_recursif()
            continue
        
        # Prise en compte de cette version d’article        
        try:
            entree_article = Version_article.select().where(
                (Version_article.id == id) &
                #(Version_article.version_section == entree_version_section) &
                (Version_article.nom == nom) &
                (Version_article.etat_juridique == etat_juridique) &
                (Version_article.numero == numero) &
                (Version_article.vigueur_debut == vigueur_debut) &
                (Version_article.vigueur_fin == vigueur_fin) &
                (Version_article.condensat == None) &
                (Version_article.texte == entree_texte)
            ).get()
            autres_articles |= {(id,  nom, etat_juridique, numero, \
                                 vigueur_debut, vigueur_fin, None, \
                                 entree_texte.cid)}
        except Version_article.DoesNotExist:
            nouveaux_articles |= {(id,  nom, etat_juridique, numero, \
                                   vigueur_debut, vigueur_fin, None, \
                                   entree_texte.cid)}
            dates |= {vigueur_debut, vigueur_fin}
        
        arbre[id] = id_parent
        
        # Prise en compte des dates de vigueur
        #dates |= {vigueur_debut, vigueur_fin}
        
        # Affichage de l’avancement
        compteur_recursif()
    
    return dates, autres_articles, nouveaux_articles, arbre
示例#10
0
def ranger_sections_xml(chemin_base, coll_sections, coll_articles, \
                        entree_texte, version_section_parente, dates, \
                        autres_sections, autres_articles, niv, \
                        nouvelles_sections, nouveaux_articles, date_codification, arbre):
    
    # Prévenir les récursions infinies - les specs indiquent un max de 10
    if niv == 11:
        raise Exception()
    
    # Traiter les articles à ce niveau
    dates, autres_articles, nouveaux_articles, arbre = ranger_articles_xml( \
        chemin_base, coll_articles, entree_texte, dates, autres_articles, \
        nouveaux_articles, date_codification, version_section_parente, arbre)
    
    for i, section in enumerate(coll_sections):
        
        # Affichage de l’avancement
        compteur_recursif(i+1, len(coll_sections), False)
        
        cid = section['cid']
        id = section['id']
        nom = section.text
        etat_juridique = section['etat']
        niveau = section['niv']
        vigueur_debut = normalise_date(section['debut'])
        vigueur_fin = normalise_date(section['fin'])
        url = section['url'][1:]
        numero = i+1
        
        # HACK - il ne devrait pas y avoir de date antérieure à la codification mais il y en a
        if date_codification and comp_infini_strict(vigueur_debut, date_codification):
            print('vigueur_debut section defectueuse {} < {}'.format(vigueur_debut,date_codification))
            vigueur_debut = date_codification
        if date_codification and comp_infini_large(vigueur_fin, date_codification):
            print('vigueur_fin section defectueuse {} <= {}'.format(vigueur_fin,date_codification))
            raise Exception()
            compteur_recursif()
            continue
        
        # Prise en compte de cette version de section
        try:
            entree_version_section = Version_section.select().where(
                (Version_section.id == id) &
                #(Version_section.id_parent == version_section_parente) &
                (Version_section.nom == nom) &
                (Version_section.etat_juridique == etat_juridique) &
                (Version_section.niveau == niveau) &
                (Version_section.numero == numero) &
                (Version_section.vigueur_debut == vigueur_debut) &
                (Version_section.vigueur_fin == vigueur_fin) &
                (Version_section.texte == entree_texte)
            ).get()
            autres_sections |= {(id, nom, etat_juridique, niveau, numero, \
                                 vigueur_debut, vigueur_fin, entree_texte.cid)}
        except Version_section.DoesNotExist:
            nouvelles_sections |= {(id, nom, etat_juridique, niveau, \
                                    numero, vigueur_debut, vigueur_fin, \
                                    entree_texte.cid)}
            dates |= {vigueur_debut, vigueur_fin}
        
        arbre[id] = version_section_parente
        
        # Prise en compte des dates de vigueur
        #dates |= {vigueur_debut, vigueur_fin}
        
        # Continuer récursivement
        section_ta = lire_base_section_ta(chemin_base, url)
        
        dates, autres_sections, autres_articles, nouvelles_sections, \
            nouveaux_articles, arbre = ranger_sections_xml(chemin_base, \
            section_ta['LIEN_SECTION_TA'], section_ta['LIEN_ART'], \
            entree_texte, id, dates, autres_sections, autres_articles, \
            niv+1, nouvelles_sections, nouveaux_articles, date_codification, arbre)
        
        # Affichage de l’avancement
        compteur_recursif()
    
    return dates, autres_sections, autres_articles, nouvelles_sections, \
           nouveaux_articles, arbre