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 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)