Beispiel #1
0
    def import_data(self, metadata, output):
        "Imports places data from OxPoints"

        self.entity_types = self._get_entity_types()

        data = simplejson.load(urllib.urlopen(self.ALL_OXPOINTS))
        source = self._get_source()

        entities, parents = {}, []

        for datum in data:
            oxpoints_id = datum['uri'].rsplit('/')[-1]
            oxpoints_type = datum['type'].rsplit('#')[-1]

            if not oxpoints_type in self.OXPOINTS_TYPES:
                continue

            try:
                entity = Entity.objects.get(source=source, _identifiers__scheme='oxpoints', _identifiers__value=oxpoints_id)
            except Entity.DoesNotExist:
                entity = Entity(source=source)
            except Entity.MultipleObjectsReturned:
                Entity.objects.filter(source=source, _identifiers__scheme='oxpoints', _identifiers__value=oxpoints_id).delete()
                entity = Entity(source=source)

            entity.title = datum.get('oxp_fullyQualifiedTitle', datum.get('dc_title', ''))
            entity.primary_type = self.entity_types[self.OXPOINTS_TYPES[oxpoints_type][0]]

            if 'geo_lat' in datum and 'geo_long' in datum:
                entity.location = Point(datum['geo_long'], datum['geo_lat'], srid=4326)
            else:
                entity.location = None

            if 'dct_isPartOf' in datum:
                parent_id = datum['dct_isPartOf']['uri'].rsplit('/')[-1]
                if parent_id in entities:
                    entity.parent = entities[parent_id]
                else:
                    parents.append((oxpoints_id, parent_id))
            else:
                entity.parent = None

            entity.metadata['oxpoints'] = datum

            identifiers = {
                'oxpoints': oxpoints_id,
                'uri': datum['uri'],
            }

            if 'oxp_hasOUCSCode' in datum:
                identifiers['oucs'] = datum['oxp_hasOUCSCode']
            if 'oxp_hasOLISCode' in datum:
                identifiers['olis'] = datum['oxp_hasOLISCode']

            entity.save(identifiers=identifiers)
            entity.all_types = [self.entity_types[t] for t in self.OXPOINTS_TYPES[oxpoints_type]]
            entity.update_all_types_completion()

            entities[oxpoints_id] = entity

        for oxpoints_id, parent_id in parents:
            try:
                entities[oxpoints_id].parent = entities[parent_id]
                entities[oxpoints_id].save()
            except KeyError:
                pass

        return metadata