def test_invalidtype(self):

        p = Popolo()
        t = "hello this is a string, an invalid type!"
        try:
            p.add(t)
        except NotAValidType:
            pass
def csv_to_popolo(organisation, membership_file, term_dates_file):
    """
    given a organisation name, a csv file with membership information
    and a file with the relevant term dates - creates a popolo.
    """
    unique = lambda x: list(set(x))

    if isinstance(organisation, tuple):
        org_id, org_name = organisation
    else:
        org_name = organisation
        org_id = get_hash(org_name)

    qg = QuickGrid().open(membership_file)
    dates = QuickGrid().open(term_dates_file)

    pop = Popolo()
    #create legislature
    org = Organization(classification="legislature", id=org_id, name=org_name)

    pop.add(org)

    #create periods
    for d in dates:
        e = Event()
        e.classification = "legislative period"
        e.id = "term/{0}".format(d["term"])
        if d["start_date"]:
            e.start_date = d["start_date"]
        if d["end_date"]:
            e.end_date = d["end_date"]
        e.organization = org
        pop.add(e)

    groups = unique(qg.get_column("group"))
    areas = unique(qg.get_column("area"))

    #create parties
    for g in groups:
        o = Organization(classification="party", name=g, id=get_hash(g))
        pop.add(o)

    #create constituencies
    for a in areas:
        n = Area(name=a, id=get_hash(a), type="constituency")
        pop.add(n)

    qg.generate_col("l_name",
                    lambda x: x["name"].strip().lower().replace(" ", ""))

    #create people
    for k, nqg in qg.split_on_unique("l_name"):
        sources = unique([x["source"] for x in nqg])
        alternates = []
        if "other_names" in qg.header:
            alt_names = [x["other_names"] for x in nqg]
            alternates = []
            for al in alt_names:
                if al:
                    for a in al.split(";"):
                        alternates.append({
                            "name": a,
                            "lang": "en",
                            "note": "altname"
                        })

        p = Person(name=nqg[0]["name"], id=get_hash(k), sources=sources)

        if "gender" in nqg.header:
            p.gender = nqg[0]["gender"]

        if alternates:
            p.other_names = alternates
        pop.add(p)

    #create memberships
    for r in qg:
        m = Membership()
        m.person = pop.persons.lookup_from_key[get_hash(r["l_name"])]
        m.area = pop.areas.lookup_from_key[get_hash(r["area"])]
        m.on_behalf_of = pop.organizations.lookup_from_key[get_hash(
            r["group"])]
        m.legislative_period = pop.events.lookup_from_key["term/{0}".format(
            r["term"])]
        m.organization = org
        m.role = "member"

        if r["start_date"]:
            m.start_date = r["start_date"]

        if r["end_date"]:
            m.end_date = r["end_date"]

        pop.add(m)

    return pop
    def test_populate_from_scratch(self):
        """
        test person
        """
        pop = Popolo()
        """
        test person
        """
        person_attributes = {
            "id": "person1",
            "email": "*****@*****.**",
            "gender": "male",
            "honorific_prefix": "Dr",
            "honorific_suffix": "MBe",
            "image": "blahblah.jpg",
            "name": "Indiana Jones",
            "sort_name": "jones, indiana",
            "national_identity": "american",
            "biography": "steals things",
            "birth_date": datetime(1899, 7, 1).date(),
            "death_date": datetime(1999, 7, 1).date(),
            "family_name": "Jones",
            "given_name": "Indiana",
            "summary": "archaeologist",
            "wikidata": "Q174284",
            "phone": "9906753",
            "fax": "5559906753",
            "property": "123 fake street",
            "facebook": "https://www.facebook.com/indianajones/",
            "other_names": [{
                "name": "Indiana Walton Jones"
            }],
            "sources": ["TV", "Movies"],
            "twitter": "indianajones",
        }

        p = Person()

        for k, v in six.iteritems(person_attributes):
            setattr(p, k, v)
            assert getattr(p, k) == v

        pop.add([p])
        """
        test organisation
        """
        org_attributes = {
            "id": "org1",
            "name": "made up organisation",
            "wikidata": "Q20136634",
            "classification": "Parliament",
            "image": "parliament.jpg",
            "founding_date": datetime(1894, 7, 1).date(),
            "dissolution_date": datetime(1923, 7, 1).date(),
            "seat": 50,
            "other_names": ["banana republic"]
        }

        o = Organization()

        for k, v in six.iteritems(org_attributes):
            setattr(o, k, v)
            assert getattr(o, k) == v

        pop.add(o)
        """
        test area
        """
        area_attributes = {
            "id": "area1",
            "name": "Brighton",
            "type": "City",
            "wikidata": "Q131491"
        }

        a = Area()

        for k, v in six.iteritems(area_attributes):
            setattr(a, k, v)
            assert getattr(a, k) == v

        pop.add(a)
        """
        test post
        """
        post_attribute = {
            "id": "post1",
            "label": "Leader",
            "organization_id": "org1",
        }

        p = Post()

        for k, v in six.iteritems(post_attribute):
            setattr(p, k, v)
            assert getattr(p, k) == v

        pop.add(p)
        """
        test event
        """
        event_attributes = {
            "id": "event1",
            "classification": "legislative-term",
            "start_date": datetime(1900, 1, 1).date(),
            "end_date": datetime(1905, 1, 1).date(),
            "organization_id": "org1",
        }
        e = Event()
        for k, v in six.iteritems(event_attributes):
            setattr(e, k, v)
            assert getattr(e, k) == v
        pop.add(e)

        membership_attributes = {
            "role": "MP",
            "person_id": "person1",
            "organisation_id": "org1",
            "area_id": "area1",
            "post_id": "post1",
            "legislative_period_id": "event1",
            "start_date": datetime(1900, 5, 1).date(),
            "end_date": datetime(1903, 1, 1).date(),
        }

        m = Membership()
        for k, v in six.iteritems(membership_attributes):
            setattr(m, k, v)
            assert getattr(m, k) == v
        pop.add(m)
        """
        can we save and reload this intact?
        """

        j = pop.to_json()
        pop2 = Popolo(json.loads(j))
        assert pop2.to_json() == pop.to_json()

        assert pop.memberships[0].id == pop2.memberships[0].id
        """
        save to temp file
        """
        filename = mktemp()
        pop.to_filename(filename)
        os.remove(filename)