Ejemplo n.º 1
0
 def get_text_info():
     from models import USCSection
     from billtext import load_bill_text
     from search import parse_slip_law_number
     import re
     try:
         metadata = load_bill_text(bill, None, mods_only=True)
         
         # do interesting stuff with citations
         if "citations" in metadata:
             slip_laws = []
             statutes = []
             usc = { }
             other = []
             usc_other = USCSection(name="Other Citations", ordering=99999)
             for cite in metadata["citations"]:
                 if cite["type"] == "slip_law":
                     slip_laws.append(cite)
                     cite["bill"] = parse_slip_law_number(cite["text"])
                 elif cite["type"] == "statutes_at_large":
                     statutes.append(cite)
                 elif cite["type"] == "usc":
                     # build a normalized citation and a link to LII
                     cite_norm = "usc/" + cite["title"]
                     cite_link = "http://www.law.cornell.edu/uscode/text/" + cite["title"]
                     if cite["section"]:
                         cite_link += "/" + cite["section"]
                         cite_norm += "/" + cite["section"]
                     if cite["paragraph"]: cite_link += "#" + "_".join(re.findall(r"\(([^)]+)\)", cite["paragraph"]))
                     
                     # Build a tree of title-chapter-...-section nodes so we can
                     # display the citations in context.
                     try:
                         sec_obj = USCSection.objects.get(citation=cite_norm)
                     except: # USCSection.DoesNotExist and MultipleObjectsReturned both possible
                         # the 'id' field is set to make these objects properly hashable
                         sec_obj = USCSection(id=cite["text"], name=cite["text"], parent_section=usc_other)
                     
                     sec_obj.link = cite_link
                     
                     if "range_to_section" in cite:
                         sec_obj.range_to_section = cite["range_to_section"]
                     
                     # recursively go up to the title
                     path = [sec_obj]
                     while sec_obj.parent_section:
                         sec_obj = sec_obj.parent_section
                         path.append(sec_obj)
                         
                     # now pop off from the path to put the node at the right point in a tree
                     container = usc
                     while path:
                         p = path.pop(-1)
                         if p not in container: container[p] = { }
                         container = container[p]
                     
                 else:
                     other.append(cite)
                     
             slip_laws.sort(key = lambda x : (x["congress"], x["number"]))
             
             # restructure data format
             def ucfirst(s): return s[0].upper() + s[1:]
             def rebuild_usc_sec(seclist, indent=0):
                 ret = []
                 seclist = sorted(seclist.items(), key=lambda x : x[0].ordering)
                 for sec, subparts in seclist:
                     ret.append({
                         "text": (ucfirst(sec.level_type + ((" " + sec.number) if sec.number else "") + (": " if sec.name else "")) if sec.level_type else "") + (sec.name if sec.name else ""),
                         "link": getattr(sec, "link", None),
                         "range_to_section": getattr(sec, "range_to_section", None),
                         "indent": indent,
                     })
                     ret.extend(rebuild_usc_sec(subparts, indent=indent+1))
                 return ret
             usc = rebuild_usc_sec(usc)
             
             metadata["citations"] = {
                 "slip_laws": slip_laws, "statutes": statutes, "usc": usc, "other": other,
                 "count": len(slip_laws)+len(statutes)+len(usc)+len(other) }
         return metadata
     except IOError:
         return None
Ejemplo n.º 2
0
def load_citation_info(metadata):
    if "citations" not in metadata: return

    from models import USCSection
    from search import parse_slip_law_number
    import re

    # gather the citations listed in the MODS file

    slip_laws = []
    statutes = []
    usc_sections = []
    other = []

    usc_other = USCSection(id="_make_this_instance_hashable",
                           name="Other Citations",
                           ordering=99999)

    for cite in metadata["citations"]:
        if cite["type"] == "slip_law":
            slip_laws.append(cite)
            cite["bill"] = parse_slip_law_number(cite["text"])
        elif cite["type"] == "statutes_at_large":
            statutes.append(cite)
        elif cite["type"] in ("usc-section", "usc-chapter"):
            # Build a tree of title-chapter-...-section nodes so we can
            # display the citations in context.
            try:
                sec_obj = USCSection.objects.get(citation=cite["key"])
            except:  # USCSection.DoesNotExist and MultipleObjectsReturned both possible
                # create a fake entry for the sake of output
                # the 'id' field is set to make these objects properly hashable
                sec_obj = USCSection(id=cite["text"],
                                     name=cite["text"],
                                     parent_section=usc_other)

            if "range_to_section" in cite:
                sec_obj.range_to_section = cite["range_to_section"]

            sec_obj.link = sec_obj.get_cornell_lii_link(cite.get("paragraph"))

            usc_sections.append(sec_obj)
        else:
            other.append(cite)

    # sort slip laws
    slip_laws.sort(key=lambda x: (x["congress"], x["number"]))

    # build a tree for USC citations

    usc = {}
    for sec_obj in usc_sections:
        # recursively go up to the title to find the path from title to this section
        path = [sec_obj]
        so = sec_obj
        while so.parent_section:
            so = so.parent_section
            so.link = so.get_cornell_lii_link()
            path.append(so)

        # now create a tree from the path
        container = usc
        for p in reversed(path):
            container["_count"] = container.get("_count", 0) + 1
            if p not in container: container[p] = {}
            container = container[p]

    # restructure the tree into a flattened list with indentation attributes on each row
    def ucfirst(s):
        return s[0].upper() + s[1:]

    def rebuild_usc_sec(seclist, indent=0):
        ret = []
        seclist = [kv for kv in seclist.items() if kv[0] != "_count"]
        seclist = sorted(seclist, key=lambda x: x[0].ordering)
        for sec, subparts in seclist:
            ret.append({
                "text":
                (ucfirst(sec.level_type +
                         ((" " + sec.number) if sec.number else "") +
                         (": " if sec.name else "")) if sec.level_type else "")
                + (sec.name_recased if sec.name else ""),
                "link":
                getattr(sec, "link", None),
                "range_to_section":
                getattr(sec, "range_to_section", None),
                "indent":
                indent,
            })
            ret.extend(rebuild_usc_sec(subparts, indent=indent + 1))
        return ret

    usc = rebuild_usc_sec(usc)

    metadata["citations"] = {
        "slip_laws": slip_laws,
        "statutes": statutes,
        "usc": usc,
        "other": other,
        "count": len(slip_laws) + len(statutes) + len(usc) + len(other)
    }
Ejemplo n.º 3
0
def load_citation_info(metadata):
    if "citations" not in metadata: return

    from models import USCSection
    from search import parse_slip_law_number
    import re

    # gather the citations listed in the MODS file

    slip_laws = []
    statutes = []
    usc_sections = []
    other = []

    usc_other = USCSection(id="_make_this_instance_hashable", name="Other Citations", ordering=99999)

    for cite in metadata["citations"]:
        if cite["type"] == "slip_law":
            slip_laws.append(cite)
            cite["bill"] = parse_slip_law_number(cite["text"])
        elif cite["type"] == "statutes_at_large":
            statutes.append(cite)
        elif cite["type"] in ("usc-section", "usc-chapter"):
            # Build a tree of title-chapter-...-section nodes so we can
            # display the citations in context.
            try:
                sec_obj = USCSection.objects.get(citation=cite["key"])
            except: # USCSection.DoesNotExist and MultipleObjectsReturned both possible
                # create a fake entry for the sake of output
                # the 'id' field is set to make these objects properly hashable
                sec_obj = USCSection(id=cite["text"], name=cite["text"], parent_section=usc_other)

            if "range_to_section" in cite:
                sec_obj.range_to_section = cite["range_to_section"]

            sec_obj.link = sec_obj.get_cornell_lii_link(cite.get("paragraph"))

            usc_sections.append(sec_obj)
        else:
            other.append(cite)

    # sort slip laws
    slip_laws.sort(key = lambda x : (x["congress"], x["number"]))

    # build a tree for USC citations

    usc = { }
    for sec_obj in usc_sections:
            # recursively go up to the title to find the path from title to this section
            path = [sec_obj]
            so = sec_obj
            while so.parent_section:
                so = so.parent_section
                so.link = so.get_cornell_lii_link()
                path.append(so)

            # now create a tree from the path
            container = usc
            for p in reversed(path):
                container["_count"] = container.get("_count", 0) + 1
                if p not in container: container[p] = { }
                container = container[p]

    # restructure the tree into a flattened list with indentation attributes on each row
    def ucfirst(s): return s[0].upper() + s[1:]
    def rebuild_usc_sec(seclist, indent=0):
        ret = []
        seclist = [kv for kv in seclist.items() if kv[0] != "_count"]
        seclist = sorted(seclist, key=lambda x : x[0].ordering)
        for sec, subparts in seclist:
            ret.append({
                "text": (ucfirst(sec.level_type + ((" " + sec.number) if sec.number else "") + (": " if sec.name else "")) if sec.level_type else "") + (sec.name_recased if sec.name else ""),
                "link": getattr(sec, "link", None),
                "range_to_section": getattr(sec, "range_to_section", None),
                "indent": indent,
            })
            ret.extend(rebuild_usc_sec(subparts, indent=indent+1))
        return ret
    usc = rebuild_usc_sec(usc)

    metadata["citations"] = {
        "slip_laws": slip_laws,
        "statutes": statutes,
        "usc": usc,
        "other": other,
        "count": len(slip_laws)+len(statutes)+len(usc)+len(other)
    }
Ejemplo n.º 4
0
    def get_text_info():
        from models import USCSection
        from billtext import load_bill_text
        from search import parse_slip_law_number
        import re
        try:
            metadata = load_bill_text(bill, None, mods_only=True)

            # do interesting stuff with citations
            if "citations" in metadata and not settings.DEBUG:
                slip_laws = []
                statutes = []
                usc = { }
                other = []
                usc_other = USCSection(name="Other Citations", ordering=99999)
                for cite in metadata["citations"]:
                    if cite["type"] == "slip_law":
                        slip_laws.append(cite)
                        cite["bill"] = parse_slip_law_number(cite["text"])
                    elif cite["type"] == "statutes_at_large":
                        statutes.append(cite)
                    elif cite["type"] in ("usc-section", "usc-chapter"):
                        # Build a tree of title-chapter-...-section nodes so we can
                        # display the citations in context.
                        try:
                            sec_obj = USCSection.objects.get(citation=cite["key"])
                        except: # USCSection.DoesNotExist and MultipleObjectsReturned both possible
                            # create a fake entry for the sake of output
                            # the 'id' field is set to make these objects properly hashable
                            sec_obj = USCSection(id=cite["text"], name=cite["text"], parent_section=usc_other)

                        if "range_to_section" in cite:
                            sec_obj.range_to_section = cite["range_to_section"]

                        # recursively go up to the title
                        path = [sec_obj]
                        so = sec_obj
                        while so.parent_section:
                            so = so.parent_section
                            path.append(so)

                        # build a link to LII
                        if cite["type"] == "usc-section":
                            cite_link = "http://www.law.cornell.edu/uscode/text/" + cite["title"]
                            if cite["section"]:
                                cite_link += "/" + cite["section"]
                            if cite["paragraph"]: cite_link += "#" + "_".join(re.findall(r"\(([^)]+)\)", cite["paragraph"]))
                        elif cite["type"] == "usc-chapter":
                            cite_link = "http://www.law.cornell.edu/uscode/text/" + cite["title"] + "/" + "/".join(
                                (so.level_type + "-" + so.number) for so in reversed(path[:-1])
                                )
                        sec_obj.link = cite_link

                        # now pop off from the path to put the node at the right point in a tree
                        container = usc
                        while path:
                            p = path.pop(-1)
                            if p not in container: container[p] = { }
                            container = container[p]

                    else:
                        other.append(cite)

                slip_laws.sort(key = lambda x : (x["congress"], x["number"]))

                # restructure data format
                def ucfirst(s): return s[0].upper() + s[1:]
                def rebuild_usc_sec(seclist, indent=0):
                    ret = []
                    seclist = sorted(seclist.items(), key=lambda x : x[0].ordering)
                    for sec, subparts in seclist:
                        ret.append({
                            "text": (ucfirst(sec.level_type + ((" " + sec.number) if sec.number else "") + (": " if sec.name else "")) if sec.level_type else "") + (sec.name_recased if sec.name else ""),
                            "link": getattr(sec, "link", None),
                            "range_to_section": getattr(sec, "range_to_section", None),
                            "indent": indent,
                        })
                        ret.extend(rebuild_usc_sec(subparts, indent=indent+1))
                    return ret
                usc = rebuild_usc_sec(usc)

                metadata["citations"] = {
                    "slip_laws": slip_laws, "statutes": statutes, "usc": usc, "other": other,
                    "count": len(slip_laws)+len(statutes)+len(usc)+len(other) }
            return metadata
        except IOError:
            return None