Skip to content

Commit 741d7ca

Browse files
committed
popit exporter scripts
1 parent ffe56d0 commit 741d7ca

File tree

2 files changed

+147
-41
lines changed

2 files changed

+147
-41
lines changed

_scripts/popit_create_posts.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import sys
2+
import requests
3+
import json
4+
import yaml
5+
6+
from local_settings import POPIT_USERNAME, POPIT_PASSWORD, POPIT_APIKEY
7+
8+
instance = "http://yournextmep.popit.mysociety.org/api/v0.1/"
9+
10+
instance_meta = requests.get(instance).json()
11+
12+
organizations_api_url = instance_meta['meta']['organizations_api_url']
13+
posts_api_url = instance_meta['meta']['posts_api_url']
14+
15+
headers = {'content-type': 'application/json',
16+
'Apikey': POPIT_APIKEY}
17+
18+
def get_or_create_eup():
19+
url = instance + "search/organizations?q=name:\"European Parliament\""
20+
21+
resp = requests.get(url).json()
22+
23+
if resp['result']:
24+
return resp['result'][0]
25+
26+
eup = {u'name': u'European Parliament',
27+
u'classification': u'Parliament'}
28+
29+
resp = requests.post(organizations_api_url,
30+
data=json.dumps(eup),
31+
auth=(POPIT_USERNAME, POPIT_PASSWORD),
32+
headers=headers)
33+
34+
return resp.json()['result']
35+
36+
def get_or_create_post(post):
37+
url = instance + "search/posts?q=label:\"{}\"".format(post['label'])
38+
resp = requests.get(url).json()
39+
40+
if resp['result']:
41+
return resp['result'][0]
42+
else:
43+
resp = requests.post(posts_api_url,
44+
data=json.dumps(post),
45+
auth=(POPIT_USERNAME, POPIT_PASSWORD),
46+
headers=headers)
47+
48+
return resp.json()['result']
49+
50+
eup = get_or_create_eup()
51+
52+
regions = yaml.load(open('_data/regions.yaml'))
53+
54+
for _, region in regions.items():
55+
print region['name']
56+
57+
post = {'organization_id': eup['id'],
58+
'role': 'Member of the European Parliament',
59+
'label': 'Member of the European Parliament for {}'.format(region['name']),
60+
"area": {
61+
"identifier": "http://mapit.mysociety.org/area/{}".format(region['identifiers'][0]['identifier']),
62+
"id": "mapit:{}".format(region['identifiers'][0]['identifier']),
63+
"name": region['name']
64+
},
65+
}
66+
67+
post = get_or_create_post(post)
68+
69+
print post
70+

_scripts/popit_export_people.py

Lines changed: 77 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,55 +3,79 @@
33
import json
44
import yaml
55

6-
from local_settings import POPIT_USERNAME, POPIT_PASSWORD
6+
from local_settings import POPIT_USERNAME, POPIT_PASSWORD, POPIT_APIKEY
77

88
instance = "http://yournextmep.popit.mysociety.org/api/v0.1/"
99

1010
instance_meta = requests.get(instance).json()
1111

1212
people_api_url = instance_meta['meta']['persons_api_url']
13+
posts_api_url = instance_meta['meta']['posts_api_url']
1314
memberships_api_url = instance_meta['meta']['memberships_api_url']
1415

16+
headers = {'content-type': 'application/json',
17+
'Apikey': POPIT_APIKEY}
18+
1519
def add_person(person):
16-
print person
1720
return requests.post(people_api_url,
1821
data=json.dumps(person),
1922
auth=(POPIT_USERNAME, POPIT_PASSWORD),
20-
headers={'content-type': 'application/json'})
23+
headers=headers)
2124

2225
def update_person(person):
2326
return requests.put(person['url'],
2427
data=json.dumps(person),
2528
auth=(POPIT_USERNAME, POPIT_PASSWORD),
26-
headers={'content-type': 'application/json'})
29+
headers=headers)
2730

31+
def delete_person(person):
32+
return requests.delete(person['url'],
33+
auth=(POPIT_USERNAME, POPIT_PASSWORD),
34+
headers=headers)
2835

2936
def add_membership(membership):
3037
return requests.post(memberships_api_url,
3138
data=json.dumps(membership),
3239
auth=(POPIT_USERNAME, POPIT_PASSWORD),
33-
headers={'content-type': 'application/json'})
40+
headers=headers)
3441

3542
def update_membership(membership):
3643
return requests.put(membership['url'],
3744
data=json.dumps(membership),
3845
auth=(POPIT_USERNAME, POPIT_PASSWORD),
39-
headers={'content-type': 'application/json'})
46+
headers=headers)
4047

4148
def delete_membership(membership):
4249
return requests.delete(membership['url'],
4350
auth=(POPIT_USERNAME, POPIT_PASSWORD),
44-
headers={'content-type': 'application/json'})
51+
headers=headers)
4552

4653
def popitize(person, party_id, party):
4754
person = dict(person)
4855

4956
person['identifiers'] = []
5057
person['identifiers'].append({'identifier': party_id + "/" + person['id'],
51-
'scheme': 'yournextmep'})
58+
'scheme': 'yournextmep-candidate'})
59+
60+
person['contact_details'] = []
61+
62+
if 'email' in person:
63+
person['contact_details'].append({'type': 'email',
64+
'value': person['email'],})
65+
del person['email']
66+
67+
if 'links' in person:
68+
for link in person['links']:
69+
if 'twitter' in link['url']:
70+
twitter_id = link['url'].split('/')[-1]
71+
72+
person['contact_details'].append({'type': 'twitter',
73+
'value': twitter_id})
5274

5375
if 'image' in person:
54-
person['image'] = "http://yournextmep.com" + person['image']
76+
image = {'url': "http://yournextmep.com" + person['image']}
77+
78+
person['images'] = [image]
5579

5680
del person['id']
5781

@@ -70,26 +94,23 @@ def find_org_id(org_id):
7094

7195
return None
7296

73-
def find_person_id(person_id):
97+
def find_persons_id(person_id):
7498
url = instance + "search/persons?q=identifiers.identifier:\"{}\"".format(person_id)
7599

76100
resp = requests.get(url).json()
77101

78-
print url
79-
80102
if len(resp['result']) > 1:
81-
print "MULTIPLE HITS", url
103+
print "MULTIPLE PEOPLE HITS", url
82104

83105
if resp['result']:
84-
for org in resp['result']:
85-
for ident in org['identifiers']:
86-
if ident['scheme'] == "yournextmep" and ident['identifier'] == person_id:
87-
return org
106+
for person in resp['result']:
107+
for ident in person['identifiers']:
108+
if ident['scheme'] == "yournextmep-candidate" and ident['identifier'] == person_id:
109+
yield person
88110

89-
return None
90-
111+
return
91112

92-
def find_membership_id(person_id, org_id):
113+
def find_memberships_id(person_id, org_id):
93114
url = instance + "search/memberships?q=(person_id:\"{}\") AND (organization_id:\"{}\")".format(person_id, org_id)
94115

95116
resp = requests.get(url).json()
@@ -98,10 +119,17 @@ def find_membership_id(person_id, org_id):
98119
print "MULTIPLE HITS", url
99120

100121
if resp['result']:
101-
return resp['result'][0]
122+
return resp['result']
102123

103124
return None
104125

126+
def find_post(region_name):
127+
url = instance + "search/posts?q=label:\"Member of the European Parliament for {}\"".format(region_name)
128+
129+
resp = requests.get(url).json()
130+
131+
return resp['result'][0]
132+
105133
if __name__ == "__main__":
106134
party_id = sys.argv[1]
107135
candidates = yaml.load(open("_data/{}_candidates.yaml".format(party_id)))
@@ -111,50 +139,58 @@ def find_membership_id(person_id, org_id):
111139
party = find_org_id(party_id)
112140

113141
for region_id, region_candidates in candidates.items():
142+
popit_post = find_post(regions[region_id]['name'])
143+
114144
for candidate in region_candidates:
115145
person_id = candidate['id']
116146

117147
person = people[person_id]
118148
person = popitize(person, party_id, party)
119149

120-
popit_person = find_person_id(party_id + "/" + person_id)
150+
print person_id
151+
152+
popit_persons = list(find_persons_id(party_id + "/" + person_id))
121153

122-
if popit_person is None:
154+
if not popit_persons:
123155
print " Adding"
124156
resp = add_person(person)
125-
print resp.status_code, resp.text
126157
else:
127-
print " Already up", popit_person['url']
128-
#resp = update_person(popit_person)
129-
130-
131-
popit_person = find_person_id(party_id + "/" + person_id)
132-
133-
popit_membership = find_membership_id(popit_person['id'], party_id)
158+
for popit_person in popit_persons[1:]:
159+
print "Deleting duplicate person"
160+
delete_person(popit_person)
134161

135-
if popit_membership is not None:
136-
delete_membership(popit_membership)
162+
popit_person = popit_persons[0]
163+
print " Updating", popit_person['url']
164+
popit_person.update(person)
165+
resp = update_person(popit_person)
137166

138-
popit_membership = find_membership_id(popit_person['id'], party['id'])
167+
#popit_person = find_person_id(party_id + "/" + person_id)
168+
popit_person = resp.json()['result']
169+
170+
popit_memberships = find_memberships_id(popit_person['id'], party['id'])
139171

140-
print popit_membership
172+
if popit_memberships:
173+
for popit_membership in popit_memberships[1:]:
174+
print "Deleting membership"
175+
delete_membership(popit_membership)
141176

142177
membership = {
143178
"label": "European electoral candidate for {}".format(regions[region_id]['name']),
144-
"role": "European electoral candidate",
179+
"role": "candidate",
180+
"post_id": popit_post['id'],
145181
"person_id": popit_person['id'],
146182
"organization_id": party['id'],
147-
"area": {"name": regions[region_id]['name'],
148-
"classification": "EUR",
149-
"id": "mapit.mysociety.org/area/{}".format(regions[region_id]['identifiers'][0]['identifier'])}
150183
}
151184

152-
if popit_membership is None:
185+
if popit_memberships is None:
186+
print "Adding membership"
153187
resp = add_membership(membership)
154188
else:
189+
print "Updating membership"
190+
popit_membership = popit_memberships[0]
155191
membership['id'] = popit_membership['id']
156192
membership['url'] = popit_membership['url']
157193
resp = update_membership(membership)
158194

159-
print resp.status_code, resp.text
195+
print resp.status_code
160196

0 commit comments

Comments
 (0)