def add_pcc_areas(self, mapit_area_id, mapit_area_data): org_name = mapit_area_data['name'] area_type, _ = AreaType.objects.update_or_create( name=self.base_election_info['mapit_code'], defaults={'source': 'MapIt'} ) if not self.election.area_types.filter(name=area_type.name).exists(): self.election.area_types.add(area_type) area, _ = Area.objects.update_or_create( identifier=mapit.format_code_from_area(mapit_area_data), defaults={'name': mapit_area_data['name']} ) # Now make sure that the MapIt codes are present as identifiers: for scheme, identifier in mapit_area_data['codes'].items(): area.other_identifiers.update_or_create( scheme=scheme, defaults={'identifier': identifier}, ) AreaExtra.objects.get_or_create(base=area, type=area_type) post, _ = Post.objects.update_or_create( organization=self.organizations[org_name], area=area, role='Police and Crime Commissioner for {area_name}'.format( area_name=org_name ), defaults={ 'label': self.base_election_info['label_format'].format( area_name=area.name ) }) post_extra, _ = PostExtra.objects.update_or_create( base=post, defaults={ 'slug': mapit.format_code_from_area(mapit_area_data), 'party_set': self.gb_parties, }, ) PostExtraElection.objects.update_or_create( postextra=post_extra, election=self.election, )
def get(self, request, **kwargs): latitude = kwargs['latitude'] longitude = kwargs['longitude'] generation_with_types = defaultdict(list) for t in AreaType.objects.filter(election__current=True) \ .values_list('election__area_generation', 'name'): generation_with_types[t[0]].append(t[1]) mapit_base_url = urljoin( settings.MAPIT_BASE_URL, 'point/4326/{lon},{lat}'.format( lon=longitude, lat=latitude, )) mapit_json = [] for generation, types in generation_with_types.items(): lookup_url = mapit_base_url + '?type=' \ + ','.join(types) lookup_url += '&generation={0}'.format(generation) mapit_result = requests.get(lookup_url) mapit_result = mapit_result.json() if 'error' in mapit_result: message = _("The area lookup returned an error: '{0}'") \ .format(mapit_result['error']) return HttpResponse( json.dumps({'error': message}), content_type='application/json', ) mapit_json += mapit_result.items() if len(mapit_json) == 0: message = _( "Your location does not seem to be covered by this site") return HttpResponse( json.dumps({'error': message}), content_type='application/json', ) ids_and_areas = [ "{0}-{1}".format(area[1]['type'], mapit.format_code_from_area(area[1])) for area in mapit_json ] url = reverse( 'areas-view', kwargs={'type_and_area_ids': ','.join(sorted(ids_and_areas))}) return HttpResponse( json.dumps({'url': url}), content_type='application/json', )
def get(self, request, **kwargs): latitude = kwargs['latitude'] longitude = kwargs['longitude'] generation_with_types = defaultdict(list) for t in AreaType.objects.filter(election__current=True) \ .values_list('election__area_generation', 'name'): generation_with_types[t[0]].append(t[1]) mapit_base_url = urljoin(settings.MAPIT_BASE_URL, 'point/4326/{lon},{lat}'.format( lon=longitude, lat=latitude, )) mapit_json = [] for generation, types in generation_with_types.items(): lookup_url = mapit_base_url + '?type=' \ + ','.join(sorted(types)) lookup_url += '&generation={0}'.format(generation) mapit_result = requests.get(lookup_url) mapit_result = mapit_result.json() if 'error' in mapit_result: message = _("The area lookup returned an error: '{0}'") \ .format(mapit_result['error']) return HttpResponse( json.dumps({'error': message}), content_type='application/json', ) mapit_json += mapit_result.items() if len(mapit_json) == 0: message = _("Your location does not seem to be covered by this site") return HttpResponse( json.dumps({'error': message}), content_type='application/json', ) ids_and_areas = [ "{0}-{1}".format( area[1]['type'], mapit.format_code_from_area(area[1])) for area in mapit_json ] url = reverse('areas-view', kwargs={ 'type_and_area_ids': ','.join(sorted(ids_and_areas)) }) return HttpResponse( json.dumps({'url': url}), content_type='application/json', )
def mapit_ids_to_gss(apps, schema_editor): Area = apps.get_model("popolo", "Area") mapit_data = get_mapit_data() for area in Area.objects.all(): old_id = area.identifier try: mapit_area = mapit_data[area.identifier] new_id = mapit.format_code_from_area(mapit_area) if old_id != new_id: area.identifier = new_id area.save() except KeyError: print("No GSS code found for {}".format(area.identifier))
def handle(self, **options): mapit_url = settings.MAPIT_BASE_URL gb_parties, _ = PartySet.objects.get_or_create( slug='gb', defaults={'name': 'Great Britain'} ) ni_parties, _ = PartySet.objects.get_or_create( slug='ni', defaults={'name': 'Northern Ireland'} ) elections = { 'gb-sp-2016-05-05-r': { 'name': '2016 Scottish Parliament Election (Regions)', 'for_post_role': 'Member of the Scottish Parliament', 'label_format': 'Member of the Scottish Parliament for {area_name}', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': True, 'mapit_code': 'SPE', 'area_type_description': 'Scottish Parliament region', 'organization_slug': 'scottish-parliament', 'organization_name': 'Scottish Parliament', }, 'gb-sp-2016-05-05-c': { 'name': '2016 Scottish Parliament Election (Constituencies)', 'for_post_role': 'Member of the Scottish Parliament', 'label_format': 'Member of the Scottish Parliament for {area_name}', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': False, 'mapit_code': 'SPC', 'area_type_description': 'Scottish Parliament constituency', 'organization_slug': 'scottish-parliament', 'organization_name': 'Scottish Parliament', }, 'gb-naw-2016-05-05-r': { 'name': '2016 Welsh Assembly Election (Regions)', 'for_post_role': 'Member of the National Assembly for Wales', 'label_format': 'Assembly Member for {area_name}', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': True, 'mapit_code': 'WAE', 'area_type_description': 'Welsh Assembly region', 'organization_slug': 'welsh-assembly', 'organization_name': 'National Assembly for Wales', }, 'gb-naw-2016-05-05-c': { 'name': '2016 Welsh Assembly Election (Constituencies)', 'for_post_role': 'Member of the National Assembly for Wales', 'label_format': 'Assembly Member for {area_name}', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': False, 'mapit_code': 'WAC', 'area_type_description': 'Welsh Assembly constituency', 'organization_slug': 'welsh-assembly', 'organization_name': 'National Assembly for Wales', }, 'gb-nia-2016-05-05': { 'name': '2016 Northern Ireland Assembly Election', 'for_post_role': 'Member of the Legislative Assembly', 'label_format': 'Member of the Legislative Assembly for {area_name}', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': False, 'mapit_code': 'NIE', 'area_type_description': 'Northern Ireland Assembly constituency', 'organization_slug': 'northern-ireland-assembly', 'organization_name': 'Northern Ireland Assembly', }, 'gb-gla-2016-05-05-c': { 'name': '2016 London Assembly Election (Constituencies)', 'for_post_role': 'Member of the London Assembly', 'label_format': 'Assembly Member for {area_name}', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': False, 'mapit_code': 'LAC', 'area_type_description': 'London Assembly constituency', 'organization_slug': 'london-assembly', 'organization_name': 'London Assembly', }, 'gb-gla-2016-05-05-a': { 'name': '2016 London Assembly Election (Additional)', 'for_post_role': 'Member of the London Assembly', 'label_format': 'Assembly Member', 'area_generation': 22, 'election_date': date(2016, 5, 5), 'party_lists_in_use': False, 'mapit_code': 'GLA', 'area_type_description': 'London Assembly constituency', 'organization_slug': 'london-assembly', 'organization_name': 'London Assembly', }, } for election_slug, data in elections.items(): # Make sure the parliament Organization and # OrganizationExtra objects exist: try: organization_extra = OrganizationExtra.objects.get( slug=data['organization_slug'] ) organization = organization_extra.base except OrganizationExtra.DoesNotExist: organization = Organization.objects.create( name=data['organization_name'] ) organization_extra = OrganizationExtra.objects.create( base=organization, slug=data['organization_slug'] ) # Make sure the Election object exists: election_defaults = { k: data[k] for k in [ 'name', 'for_post_role', 'area_generation', 'election_date', 'party_lists_in_use', ] } election_defaults['current'] = True election_defaults['candidate_membership_role'] = 'Candidate' print('Creating:', election_defaults['name'], '...',) election, created = Election.objects.update_or_create( slug=election_slug, defaults=election_defaults ) if created: print('[created]') else: print('[already existed]') area_type, _ = AreaType.objects.update_or_create( name=data['mapit_code'], defaults={'source': 'MapIt'} ) if not election.area_types.filter(name=area_type.name).exists(): election.area_types.add(area_type) url_path = '/areas/' + data['mapit_code'] url = urljoin(mapit_url, url_path) r = requests.get(url) for mapit_area_id, mapit_area_data in r.json().items(): area, _ = Area.objects.update_or_create( identifier=str(mapit.format_code_from_area(mapit_area_data)), defaults={'name': mapit_area_data['name']} ) # Now make sure that the MapIt codes are present as identifiers: for scheme, identifier in mapit_area_data['codes'].items(): area.other_identifiers.update_or_create( scheme=scheme, defaults={'identifier': identifier}, ) AreaExtra.objects.get_or_create(base=area, type=area_type) post, _ = Post.objects.update_or_create( organization=organization, area=area, role='Member of the Scottish Parliament', defaults={ 'label': data['label_format'].format( area_name=area.name ) } ) post_extra, _ = PostExtra.objects.update_or_create( base=post, defaults={ 'slug': str(mapit.format_code_from_area(mapit_area_data)), 'party_set': gb_parties, }, ) post_extra.elections.add(election)
def handle(self, **options): mapit_url = settings.MAPIT_BASE_URL gb_parties, _ = PartySet.objects.get_or_create(slug="gb", defaults={"name": "Great Britain"}) ni_parties, _ = PartySet.objects.get_or_create(slug="ni", defaults={"name": "Northern Ireland"}) elections = { "sp-2016-05-05-r": { "name": "2016 Scottish Parliament Election (Regions)", "for_post_role": "Member of the Scottish Parliament", "label_format": "Member of the Scottish Parliament for {area_name}", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": True, "mapit_code": "SPE", "area_type_description": "Scottish Parliament region", "organization_slug": "scottish-parliament", "organization_name": "Scottish Parliament", }, "sp-2016-05-05-c": { "name": "2016 Scottish Parliament Election (Constituencies)", "for_post_role": "Member of the Scottish Parliament", "label_format": "Member of the Scottish Parliament for {area_name}", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": False, "mapit_code": "SPC", "area_type_description": "Scottish Parliament constituency", "organization_slug": "scottish-parliament", "organization_name": "Scottish Parliament", }, "naw-2016-05-05-r": { "name": "2016 Welsh Assembly Election (Regions)", "for_post_role": "Member of the National Assembly for Wales", "label_format": "Assembly Member for {area_name}", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": True, "mapit_code": "WAE", "area_type_description": "Welsh Assembly region", "organization_slug": "welsh-assembly", "organization_name": "National Assembly for Wales", }, "naw-2016-05-05-c": { "name": "2016 Welsh Assembly Election (Constituencies)", "for_post_role": "Member of the National Assembly for Wales", "label_format": "Assembly Member for {area_name}", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": False, "mapit_code": "WAC", "area_type_description": "Welsh Assembly constituency", "organization_slug": "welsh-assembly", "organization_name": "National Assembly for Wales", }, "nia-2016-05-05": { "name": "2016 Northern Ireland Assembly Election", "for_post_role": "Member of the Legislative Assembly", "label_format": "Member of the Legislative Assembly for {area_name}", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": False, "mapit_code": "NIE", "area_type_description": "Northern Ireland Assembly constituency", "organization_slug": "northern-ireland-assembly", "organization_name": "Northern Ireland Assembly", }, "gla-2016-05-05-c": { "name": "2016 London Assembly Election (Constituencies)", "for_post_role": "Member of the London Assembly", "label_format": "Assembly Member for {area_name}", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": False, "mapit_code": "LAC", "area_type_description": "London Assembly constituency", "organization_slug": "london-assembly", "organization_name": "London Assembly", }, "gla-2016-05-05-a": { "name": "2016 London Assembly Election (Additional)", "for_post_role": "Member of the London Assembly", "label_format": "Assembly Member", "area_generation": 22, "election_date": date(2016, 5, 5), "party_lists_in_use": False, "mapit_code": "GLA", "area_type_description": "London Assembly constituency", "organization_slug": "london-assembly", "organization_name": "London Assembly", }, } for election_slug, data in elections.items(): # Make sure the parliament Organization and # OrganizationExtra objects exist: try: organization_extra = OrganizationExtra.objects.get(slug=data["organization_slug"]) organization = organization_extra.base except OrganizationExtra.DoesNotExist: organization = Organization.objects.create(name=data["organization_name"]) organization_extra = OrganizationExtra.objects.create(base=organization, slug=data["organization_slug"]) # Make sure the Election object exists: election_defaults = { k: data[k] for k in ["name", "for_post_role", "area_generation", "election_date", "party_lists_in_use"] } election_defaults["current"] = True election_defaults["candidate_membership_role"] = "Candidate" print("Creating:", election_defaults["name"], "...") election, created = Election.objects.update_or_create(slug=election_slug, defaults=election_defaults) if created: print("[created]") else: print("[already existed]") area_type, _ = AreaType.objects.update_or_create(name=data["mapit_code"], defaults={"source": "MapIt"}) if not election.area_types.filter(name=area_type.name).exists(): election.area_types.add(area_type) url_path = "/areas/" + data["mapit_code"] url = urljoin(mapit_url, url_path) r = requests.get(url) for mapit_area_id, mapit_area_data in r.json().items(): area, _ = Area.objects.update_or_create( identifier=str(mapit.format_code_from_area(mapit_area_data)), defaults={"name": mapit_area_data["name"]}, ) # Now make sure that the MapIt codes are present as identifiers: for scheme, identifier in mapit_area_data["codes"].items(): area.other_identifiers.update_or_create(scheme=scheme, defaults={"identifier": identifier}) AreaExtra.objects.get_or_create(base=area, type=area_type) post, _ = Post.objects.update_or_create( organization=organization, area=area, role="Member of the Scottish Parliament", defaults={"label": data["label_format"].format(area_name=area.name)}, ) if mapit_area_data["country_name"] == "Northern Ireland": party_set = ni_parties else: party_set = gb_parties post_extra, _ = PostExtra.objects.update_or_create( base=post, defaults={"slug": str(mapit.format_code_from_area(mapit_area_data)), "party_set": party_set}, ) PostExtraElection.objects.update_or_create(postextra=post_extra, election=election)
def handle(self, **options): mapit_url = "https://mapit.mysociety.org/" gb_parties, _ = PartySet.objects.get_or_create( slug='gb', defaults={'name': 'Great Britain'}) ni_parties, _ = PartySet.objects.get_or_create( slug='ni', defaults={'name': 'Northern Ireland'}) elections = { 'nia.2017-03-02': { 'name': '2017 Northern Ireland Assembly Election', 'for_post_role': 'Member of the Legislative Assembly', 'label_format': 'Member of the Legislative Assembly for {area_name}', 'area_generation': 22, 'election_date': date(2017, 3, 2), 'party_lists_in_use': False, 'mapit_code': 'NIE', 'area_type_description': 'Northern Ireland Assembly constituency', 'organization_slug': 'northern-ireland-assembly', 'organization_name': 'Northern Ireland Assembly', }, } for election_slug, data in elections.items(): # Make sure the parliament Organization and # OrganizationExtra objects exist: try: organization_extra = OrganizationExtra.objects.get( slug=data['organization_slug']) organization = organization_extra.base except OrganizationExtra.DoesNotExist: organization = Organization.objects.create( name=data['organization_name']) organization_extra = OrganizationExtra.objects.create( base=organization, slug=data['organization_slug']) # Make sure the Election object exists: election_defaults = { k: data[k] for k in [ 'name', 'for_post_role', 'area_generation', 'election_date', 'party_lists_in_use', ] } election_defaults['current'] = True election_defaults['candidate_membership_role'] = 'Candidate' print( 'Creating:', election_defaults['name'], '...', ) election, created = Election.objects.update_or_create( slug=election_slug, defaults=election_defaults) if created: print('[created]') else: print('[already existed]') area_type, _ = AreaType.objects.update_or_create( name=data['mapit_code'], defaults={'source': 'MapIt'}) if not election.area_types.filter(name=area_type.name).exists(): election.area_types.add(area_type) url_path = '/areas/' + data['mapit_code'] url = urljoin(mapit_url, url_path) r = requests.get(url) for mapit_area_id, mapit_area_data in r.json().items(): area, _ = Area.objects.update_or_create( identifier=str( mapit.format_code_from_area(mapit_area_data)), defaults={'name': mapit_area_data['name']}) # Now make sure that the MapIt codes are present as identifiers: for scheme, identifier in mapit_area_data['codes'].items(): area.other_identifiers.update_or_create( scheme=scheme, defaults={'identifier': identifier}, ) AreaExtra.objects.get_or_create(base=area, type=area_type) post, _ = Post.objects.update_or_create( organization=organization, area=area, role=election_defaults['for_post_role'], defaults={ 'label': data['label_format'].format(area_name=area.name) }) if mapit_area_data['country_name'] == 'Northern Ireland': party_set = ni_parties else: party_set = gb_parties post_extra, _ = PostExtra.objects.update_or_create( base=post, defaults={ 'slug': str(mapit.format_code_from_area(mapit_area_data)), 'party_set': party_set, }, ) PostExtraElection.objects.update_or_create( postextra=post_extra, election=election)