@@ -104,6 +104,64 @@ def lookup_person_atttribute_date(lookup_tuple):
104104 return date_string [:10 ]
105105 else :
106106 return None
107+
108+ def find_current_positions (metadata_dict , date ):
109+ current_positions = {}
110+ for person in metadata_dict :
111+ current_position_list = []
112+ for position in metadata_dict [person ]['positions' ]:
113+ if 'startTime' in position and 'endTime' in position :
114+ try :
115+ date_range = (datetime .strptime (position ['startTime' ][:10 ], "%Y-%m-%d" ),
116+ datetime .strptime (position ['endTime' ][:10 ], "%Y-%m-%d" ))
117+ except ValueError :
118+ continue #disregard missing dates
119+ if date_range [0 ] < datetime .strptime (date , "%Y-%m-%d" ) < date_range [1 ]:
120+ current_position_list .append (position )
121+ elif 'startTime' in position :
122+ current_position_list .append (position )
123+ current_positions [person ] = current_position_list
124+ return current_positions
125+
126+
127+ def lookup_current_ministerial_position (lookup_tuple ):
128+ positions_dict , id , name = lookup_tuple
129+ id = id .split ('/' )[- 1 ] if id else None
130+ if id in positions_dict :
131+ for position in positions_dict [id ]:
132+ if position ['minister' ]:
133+ return position ['positionLabel' ]
134+ return None
135+
136+ def get_current_positions (positions_dict , id ):
137+ id = id .split ('/' )[- 1 ] if id else None
138+ if id and id in positions_dict :
139+ return positions_dict [id ]
140+ else :
141+ return []
142+
143+
144+ def lookup_current_parliamentary_position (lookup_tuple ):
145+ positions_dict , id , name = lookup_tuple
146+ current_positions = get_current_positions (positions_dict , id )
147+ for position in current_positions :
148+ if position ['member_parliament' ]:
149+ return position ['positionLabel' ]
150+ return None
151+
152+ def lookup_current_party (lookup_tuple ):
153+ positions_dict , id , name = lookup_tuple
154+ current_positions = get_current_positions (positions_dict , id )
155+ if current_positions :
156+ for position in current_positions :
157+ if 'partyLabel' in position :
158+ return position ['partyLabel' ]
159+ elif 'partyBackupLabel' in position :
160+ return position ['partyBackupLabel' ]
161+ else :
162+ continue
163+ else :
164+ return None
107165
108166class ParliamentUKNew (Parliament , XMLCorpusDefinition ):
109167 title = 'Talking Empire (UK 2022-2025)'
@@ -124,7 +182,7 @@ class ParliamentUKNew(Parliament, XMLCorpusDefinition):
124182
125183 def sources (self , start : datetime , end : datetime ):
126184 metadata = {}
127- with open (os .path .join (self .data_directory , 'all_person_metadata_twfy_keys .json' ), 'r' , encoding = 'utf-8' ) as file :
185+ with open (os .path .join (self .data_directory , 'merged_metadata_twfy_keys .json' ), 'r' , encoding = 'utf-8' ) as file :
128186 all_person_metadata = json .load (file )
129187
130188 for directory in [dir for dir in Path (self .data_directory ).iterdir () if dir .is_dir ()]:
@@ -140,6 +198,8 @@ def sources(self, start: datetime, end: datetime):
140198 for id in metadata ['speaker_ids' ]:
141199 if id in all_person_metadata :
142200 metadata ['speaker_metadata' ][id ] = all_person_metadata [id ]
201+ metadata ['current_positions' ] = find_current_positions (metadata ['speaker_metadata' ], metadata ['date' ])
202+
143203 yield str (full_path ), metadata
144204
145205 _speech_id_extractor = Cache (XML (attribute = 'id' ))
@@ -255,7 +315,32 @@ def sources(self, start: datetime, end: datetime):
255315 Constant ('wikidata_uri' ),
256316 transform = lookup_person_attribute
257317 )
258-
318+
319+ ministerial_role = field_defaults .ministerial_role ()
320+ ministerial_role .extractor = Combined (
321+ Metadata ('current_positions' ),
322+ XML (attribute = 'person_id' ),
323+ XML (attribute = 'speakername' ),
324+ transform = lookup_current_ministerial_position
325+ )
326+ ministerial_role .search_filter .option_count = 45
327+
328+ parliamentary_role = field_defaults .parliamentary_role ()
329+ parliamentary_role .extractor = Combined (
330+ Metadata ('current_positions' ),
331+ XML (attribute = 'person_id' ),
332+ XML (attribute = 'speakername' ),
333+ transform = lookup_current_parliamentary_position
334+ )
335+
336+ party = field_defaults .party ()
337+ party .extractor = Combined (
338+ Metadata ('current_positions' ),
339+ XML (attribute = 'person_id' ),
340+ XML (attribute = 'speakername' ),
341+ transform = lookup_current_party
342+ )
343+
259344 topic = field_defaults .topic ()
260345 topic .extractor = Combined (
261346 _speech_id_extractor ,
@@ -286,5 +371,6 @@ def __init__(self):
286371 self .speaker , self .speaker_id ,
287372 self .speaker_gender , self .speaker_birthdate ,
288373 self .speaker_deathdate , self .speaker_birthplace ,
289- self .speaker_wikidata ,
374+ self .speaker_wikidata , self .ministerial_role ,
375+ self .parliamentary_role , self .party
290376 ]
0 commit comments