class AshGeoJsonSerializer(GeoFeatureModelSerializer): location = GeometrySerializerMethodField() volcano = VolcanoSerializer(many=False, read_only=True, write_only=False) def get_location(self, obj): return obj.volcano.location class Meta: model = Ash geo_field = 'location' id = 'id', fields = ( 'id', 'event_id_formatted', 'volcano', 'hazard_file', 'impact_files', 'event_time', 'event_time_zone_offset', 'event_time_zone_string', 'alert_level', 'task_status', 'eruption_height', )
class OrganisationGeoSerializer(GeoFeatureModelSerializer): geography_model = GeometrySerializerMethodField() def get_geography_model(self, obj): return obj.geography.geography.simplify(0.0009) class Meta: model = Organisation extra_kwargs = { 'url': { 'view_name': 'organisation-geo', 'lookup_field': 'pk' } } geo_field = 'geography_model' fields = ( 'official_identifier', 'organisation_type', 'organisation_subtype', 'official_name', 'common_name', 'gss', 'slug', 'territory_code', 'election_name' )
class GeoOccurrenceSerializer(GeoFeatureModelSerializer): resource_uri = serializers.HyperlinkedIdentityField( view_name='api:occurrence-detail', read_only=True) # a field which contains a geometry value and can be used as geo_field location = GeometrySerializerMethodField() class Meta: model = Occurrence geo_field = 'location' id_field = False fields = ( 'id', 'resource_uri', 'title', 'description', 'start', 'end', 'location', ) def get_location(self, obj): try: # Get the location from relation return obj.location.location except AttributeError: return None
class CountrySerializer(GeoFeatureModelSerializer): current_total = serializers.SerializerMethodField("get_current_total") location = GeometrySerializerMethodField( ) # allows to compute value during serialization def get_current_total( self, country ): # SerializerMethodField automatically infers callback from variable name try: items = Confirmed.objects.filter(country=country.pk).latest('date') except Confirmed.DoesNotExist: items = Confirmed(country=country, date=None, total=None) serializer = CovidConfirmedSerializer(instance=items) return serializer.data def get_location(self, obj): return Point(obj.lon, obj.lat) class Meta: model = WorldBorder geo_field = 'location' fields = ( 'name', 'pop2005', 'current_total', )
class BoundaryGeojsonSerializer(GeoFeatureModelSerializer): geometry = GeometrySerializerMethodField() class Meta: model = Boundary geo_field = 'geometry' fields = [] def get_geometry(self, obj): return obj.geometry
class UserBondarySerializer(GeoFeatureModelSerializer): geometry = GeometrySerializerMethodField() class Meta: model = UserBoundary geo_field = 'geometry' fields = ['id', 'name'] def get_geometry(self, obj): return obj.geometry
class placeSerializer(GeoFeatureModelSerializer): point = GeometrySerializerMethodField() def get_point(self, obj): return Point(obj.lat, obj.lon) class Meta: model = place geo_field = "point" fields = ('city', 'district', 'street', 'house')
class AssetGeoJsonSerializer(GeoFeatureModelSerializer): geom = GeometrySerializerMethodField() asset_types = AssetTypeSerializer(many=True) def get_geom(self, obj): return obj.location.geom class Meta: model = Asset geo_field = 'geom' fields = ['name', 'asset_types']
class ClusterSerializer(GeoFeatureModelSerializer): """A class to serialize locations as GeoJSON compatible data.""" point = GeometrySerializerMethodField() point_geohash = CharField() cluster_count = IntegerField() def get_point(self, obj): """Parse a geohashed point to Geometry.""" y, x = geohash.decode(obj['point_geohash']) return Point(x, y)
class DeliverySerializer(geo_serializers.GeoFeatureModelSerializer): def get_path(self, obj): print obj return LineString(obj.destination, obj.origin) path = GeometrySerializerMethodField() class Meta: model = Delivery geo_field = "path" fields = ("by", "date")
class kazpostSerializer(GeoFeatureModelSerializer): point = GeometrySerializerMethodField() def get_point(self, obj): return Point(obj.lat, obj.lon) class Meta: model = kazpost geo_field = "point" fields = ('region', 'area', 'locality', 'district', 'street', 'house')
class LocationSerializer(GeoFeatureModelSerializer): """ A class to serialize locations as GeoJSON compatible data """ point = GeometrySerializerMethodField() def get_point(self, obj): return obj.get_point class Meta: model = Location geo_field = "point" fields = ('id', 'street', 'city', 'state')
class BioCollectionGeojsonSerializer(GeoFeatureModelSerializer): geometry = GeometrySerializerMethodField() location_site = serializers.SerializerMethodField() species_name = serializers.SerializerMethodField() notes = serializers.SerializerMethodField() category = serializers.SerializerMethodField() date = serializers.SerializerMethodField() collector = serializers.SerializerMethodField() def get_location_site(self, obj): if obj.site: return obj.site.name return '' def get_species_name(self, obj): return obj.original_species_name def get_notes(self, obj): return obj.notes def get_category(self, obj): return obj.category def get_date(self, obj): if obj.collection_date: return obj.collection_date.strftime('%Y-%m-%d') def get_collector(self, obj): return obj.collector def get_geometry(self, obj): if obj.site: return obj.site.get_geometry() return None class Meta: model = BiologicalCollectionRecord geo_field = 'geometry' fields = [ 'location_site', 'species_name', 'notes', 'category', 'date', 'collector' ] def to_representation(self, instance): result = super(BioCollectionGeojsonSerializer, self).to_representation(instance) try: taxonomy = TaxonExportSerializer(instance.taxonomy).data result['properties'].update(taxonomy) except KeyError: pass return result
class OrganisationGeoSerializer(GeoFeatureModelSerializer): geography_model = GeometrySerializerMethodField() url = OrganisationHyperlinkedIdentityField( view_name="api:organisation-geo", read_only=True) def get_geography_model(self, obj): return obj.geographies.latest().geography class Meta: model = Organisation geo_field = "geography_model" fields = org_fields
class ParkingAreaSerializer(GeoFeatureModelSerializer): wgs84_areas = GeometrySerializerMethodField() def get_wgs84_areas(self, area): return area.geom.transform(4326, clone=True) class Meta: model = ParkingArea geo_field = 'wgs84_areas' fields = ( 'id', 'capacity_estimate', )
class ElectionGeoSerializer(GeoFeatureModelSerializer, BaseElectionSerializer): geography_model = GeometrySerializerMethodField() def get_geography_model(self, obj): if obj.geography is None: return None return obj.geography.geography class Meta: model = Election extra_kwargs = {"url": {"view_name": "election-geo", "lookup_field": "pk"}} geo_field = "geography_model" fields = election_fields depth = 1
class ConferenceGeoSerializer(GeoFeatureModelSerializer): name = serializers.SerializerMethodField('is_named_bar') def is_named_bar(self, available_layer): return available_layer.__unicode__() geometry = GeometrySerializerMethodField() def get_geometry(self, obj): return None class Meta: model = Conference geo_field = 'location' exclude = [] def to_representation(self, instance): result = super(ConferenceGeoSerializer, self).to_representation(instance) return result
class ElectionGeoSerializer(GeoFeatureModelSerializer, BaseElectionSerializer): geography_model = GeometrySerializerMethodField() def get_geography_model(self, obj): if obj.geography is None: return None return obj.geography.geography class Meta: model = Election extra_kwargs = { 'url': { 'view_name': 'election-geo', 'lookup_field': 'pk' } } geo_field = 'geography_model' fields = election_fields depth = 1
class PendingReviewGeoSerializer(GeoFeatureModelSerializer): geom = GeometrySerializerMethodField() centroid = SerializerMethodField() attributes = SerializerMethodField() osm_id = SerializerMethodField() osm_type = SerializerMethodField() reason = SerializerMethodField() class Meta: model = PendingReview geo_field = 'geom' fields = ['centroid', 'attributes', 'osm_id', 'osm_type', 'reason'] def get_payload(self, obj): payload = ast.literal_eval(obj.payload) payload['type'] = 'node' return payload def get_geom(self, obj): payload = self.get_payload(obj) return Point(payload.get('lon', None), payload.get('lat', None)) def get_centroid(self, obj): return json.loads(self.get_geom(obj).geojson) def get_attributes(self, obj): payload = self.get_payload(obj) return payload.get('tag', {}) def get_osm_id(self, obj): payload = self.get_payload(obj) return payload.get('id', None) def get_osm_type(self, obj): payload = self.get_payload(obj) return payload.get('type', 'node') def get_reason(self, obj): return obj.reason
class ShellfishAreaListSerializer(GeoFeatureModelSerializer): simplified_geom = GeometrySerializerMethodField() class Meta: model = ShellfishArea geo_field = "simplified_geom" fields = [ "id", "name", "state", "acres", "area_description", "geom_center_point", "simplified_geom", ] def get_simplified_geom(self, obj): # Returns a new GEOSGeometry, simplified to the specified tolerance # using the Douglas-Peucker algorithm. A higher tolerance value implies # fewer points in the output. If no tolerance is provided, it # defaults to 0. return obj.geom.simplify(tolerance=0.001, preserve_topology=True)
class AshGeoJsonSerializer(GeoFeatureModelSerializer): location = GeometrySerializerMethodField() volcano = VolcanoSerializer(many=False, read_only=True, write_only=False) def get_location(self, obj): return obj.volcano.location def get_event_id_formatted(self, serializer_field, obj): """ :param serializer_field: :type serializer_field: CustomSerializerMethodField :param obj: :type obj: Ash :return: """ dateformat = '%Y%m%d%H%M%S%z' return '%s-%s' % (obj.event_time.strftime(dateformat), obj.volcano.volcano_name) # auto bind to get_url method event_id_formatted = CustomSerializerMethodField() class Meta: model = Ash geo_field = 'location' id = 'id', fields = ( 'id', 'event_id_formatted', 'volcano', 'hazard_file', 'impact_files', 'event_time', 'alert_level', 'task_status', 'eruption_height', )
class FeatureSerializer(GeoFeatureModelSerializer): geom = GeometrySerializerMethodField('get_geom') def get_geom(self, obj): print('obj', obj.__dict__) s = json.dumps(obj.jsonb) g1 = geojson.loads(s) g2 = shape(g1) djgeo = GEOSGeometry(g2.wkt) print('geom', djgeo.geojson) return GEOSGeometry(g2.wkt) # title = serializers.SerializerMethodField('get_title') def get_title(self, obj): return obj.place.title class Meta: model = PlaceGeom geo_field = 'geom' id_field = False fields = ('place_id', 'src_id', 'title')
class OperationalPresenceLocationListSerializer(GeoFeatureModelSerializer): partners = serializers.SerializerMethodField() point = GeometrySerializerMethodField() geom = AnnotatedGeometryField(source="*") def get_point(self, obj): return obj.geo_point or None def get_partners(self, obj): partners = Partner.objects.filter( clusters__response_plan__workspace__countries__gateway_types__locations=obj) \ .distinct() \ .values_list('title', flat=True) partner_data = { cluster: partners.filter(clusters__type=cluster) for cluster in set( partners.values_list('clusters__type', flat=True)) } partner_data["all"] = partners return partner_data class Meta: model = Location geo_field = 'geom' fields = ( 'id', 'title', 'latitude', 'longitude', 'p_code', 'geom', 'point', 'partners', )
class HouseSerializer(GeoFeatureModelSerializer): images = ImageSerializer(many=True, required=False) date = RentalDateSerializer(required=False) description = DescriptionSerializer(required=False) contact = ContactSerializer(required=False) base = BasicInfoSerializer(required=False) requirement = RequirementSerializer(required=False) uuid = serializers.CharField(required=True) category = serializers.CharField(required=False, default='Lease') fulladdress = serializers.CharField(required=False, default='') address = serializers.CharField(required=False, default='') city = serializers.CharField(required=False, default='') state = serializers.CharField(required=False, default='') zipcode = serializers.CharField(required=False, default='') longitude = serializers.CharField(required=False, default='41.8781') latitude = serializers.CharField(required=False, default='87.6298') location = GeometrySerializerMethodField(required=False) submittime = serializers.CharField(required=False, default='') videos = serializers.CharField(required=False, default='') def get_location(self, obj): return obj.location def create(self, validated_data): uuid = validated_data.get('uuid') category = validated_data.get('category') print(validated_data) fulladdress = validated_data.get('fulladdress') address = validated_data.get('address') city = validated_data.get('city') state = validated_data.get('state') zipcode = validated_data.get('zipcode') submittime = validated_data.get('submittime') longitude = validated_data.get('longitude') latitude = validated_data.get('latitude') location = Point(float(longitude), float(latitude)) # Date rental_date = validated_data.get('date') # print(rental_date) # Description house_description = validated_data.get('description') # Contact contact_info = validated_data.get('contact') # Base basic_info = validated_data.get('base') # Requirement rental_requirement = validated_data.get('requirement') images_data = validated_data.get('images') videos = validated_data.get('videos') if rental_date: # print(rental_date) date = HouseRentalDate() date.starttime = rental_date.get('starttime') date.endtime = rental_date.get('endtime') date.save() if house_description: # print(house_description) description = HouseDescription() description.title = house_description.get('title') description.description = house_description.get('description') description.save() if contact_info: # print(contact_info) contact = HouseContact() contact.phonenumber = contact_info.get('phonenumber') contact.email = contact_info.get('email') contact.wechat = contact_info.get('wechat') contact.save() if basic_info: # print(basic_info) base = HouseBasicInfo() base.price = basic_info.get('price') base.housetype = basic_info.get('housetype') base.roomtype = basic_info.get('roomtype') base.bathroom = basic_info.get('bathroom') base.parkinglot = basic_info.get('parkinglot') base.washingmachine = basic_info.get('washingmachine') base.save() includeds_data = basic_info.get('included') nearbys_data = basic_info.get('nearby') for included_data in includeds_data: included_instance = HouseIncluded(base=base) included_instance.included = included_data.get('included') included_instance.save() for nearby_data in nearbys_data: nearby_instance = HouseNearby(base=base) nearby_instance.nearby = nearby_data.get('nearby') nearby_instance.save() if rental_requirement: requirement = HouseRequirement() requirement.leaseperiod = rental_requirement.get('leaseperiod') requirement.gender = rental_requirement.get('gender') requirement.cooking = rental_requirement.get('cooking') requirement.smoking = rental_requirement.get('smoking') requirement.save() otherrequirements_data = rental_requirement.get( 'otherrequirements') for otherrequirement_data in otherrequirements_data: otherrequirement_instance = HouseOtherRequirement( requirement=requirement) otherrequirement_instance.otherrequirement = otherrequirement_data.get( 'otherrequirement') otherrequirement_instance.save() house = House(uuid=uuid) if date: house.date = date if description: house.description = description if contact: house.contact = contact if base: house.base = base if requirement: house.requirement = requirement house.category = category house.fulladdress = fulladdress house.address = address house.city = city house.state = state house.zipcode = zipcode house.longitude = longitude house.latitude = latitude house.location = location house.submittime = submittime house.videos = videos # print(house) house.save() # Image for image_data in images_data: print(image_data.get('image')) image_instance = HouseImage(house=house) image_instance.image = image_data.get('image') image_instance.save() return house def update(self, instance, validated_data): uuid = validated_data.get('uuid') category = validated_data.get('category') fulladdress = validated_data.get('fulladdress') address = validated_data.get('address') city = validated_data.get('city') state = validated_data.get('state') zipcode = validated_data.get('zipcode') submittime = validated_data.get('submittime') longitude = validated_data.get('longitude') latitude = validated_data.get('latitude') location = Point(float(longitude), float(latitude)) # Date rental_date = validated_data.get('date') # Description house_description = validated_data.get('description') # Contact contact_info = validated_data.get('contact') # Base basic_info = validated_data.get('base') # Requirement rental_requirement = validated_data.get('requirement') images_data = validated_data.get('images') videos = validated_data.get('videos') instance.uuid = uuid instance.category = category instance.fulladdress = fulladdress instance.address = address instance.city = city instance.state = state instance.zipcode = zipcode instance.submittime = submittime instance.videos = videos instance.longitude = longitude instance.latitude = latitude instance.location = location instance.save() if rental_date: date = HouseRentalDate(house=instance) date.starttime = rental_date.get('starttime') date.endtime = rental_date.get('endtime') date.save() if house_description: description = HouseDescription(house=instance) description.title = house_description.get('title') description.description = house_description.get('description') description.save() if contact_info: contact = HouseContact(house=instance) contact.phonenumber = contact_info.get('phonenumber') contact.email = contact_info.get('email') contact.wechat = contact_info.get('wechat') contact.save() if basic_info: base = HouseBasicInfo(house=instance) base.price = basic_info.get('price') base.housetype = basic_info.get('housetype') base.roomtype = basic_info.get('roomtype') base.bathroom = basic_info.get('bathroom') base.parkinglot = basic_info.get('parkinglot') base.washingmachine = basic_info.get('washingmachine') base.save() includeds_data = basic_info.get('included') nearbys_data = basic_info.get('nearby') for included_data in includeds_data: included_instance = HouseIncluded(base=base) included_instance.name = included_data included_instance.save() for nearby_data in nearbys_data: nearby_instance = HouseNearby(base=base) nearby_instance.name = nearby_data nearby_instance.save() if rental_requirement: requirement = HouseRequirement(house=instance) requirement.leaseperiod = rental_requirement.get('leaseperiod') requirement.gender = rental_requirement.get('gender') requirement.cooking = rental_requirement.get('cooking') requirement.smoking = rental_requirement.get('smoking') requirement.save() otherrequirements_data = rental_requirement.get( 'otherrequirements') for otherrequirement_data in otherrequirements_data: otherrequirement_instance = HouseOtherRequirement( requirement=requirement) otherrequirement_instance.name = otherrequirement_data otherrequirement_instance.save() # Image for image_data in images_data: image_instance = HouseImage(house=instance) image_instance.image = image_data image_instance.save() return instance class Meta: model = House geo_field = 'location' fields = ('id', 'uuid', 'category', 'fulladdress', 'address', 'city', 'state', 'zipcode', 'submittime', 'longitude', 'latitude', 'date', 'description', 'contact', 'base', 'requirement', 'images', 'videos')
class BMHouseSerializer(GeoFeatureModelSerializer): uuid = serializers.CharField(required=True) category = serializers.CharField(required=False, default='Lease') fulladdress = serializers.CharField(required=False, default='No Data') address = serializers.CharField(required=False, default='') city = serializers.CharField(required=False, default='No Data') state = serializers.CharField(required=False, default='No Data') zipcode = serializers.CharField(required=False, default='No Data') longitude = serializers.CharField(required=False, default='41.8781') latitude = serializers.CharField(required=False, default='87.6298') location = GeometrySerializerMethodField(required=False) submittime = serializers.CharField(required=False, default='No Data') date = RentalDateField(source='*') description = DescriptionField(source='*') contact = ContactField(source='*') base = BasicInfoField(source='*') requirement = RequirementField(source='*') images = ImagesField(source='*') videos = serializers.CharField(required=False, default='No Data') def get_location(self, obj): return obj.location def create(self, validated_data): uuid = validated_data.get('uuid') category = validated_data.get('category') fulladdress = validated_data.get('fulladdress') address = validated_data.get('address') city = validated_data.get('city') state = validated_data.get('state') zipcode = validated_data.get('zipcode') submittime = validated_data.get('submittime') longitude = validated_data.get('longitude') latitude = validated_data.get('latitude') location = Point(float(longitude), float(latitude)) starttime = validated_data.get('starttime') endtime = validated_data.get('endtime') title = validated_data.get('title') description = validated_data.get('description') phonenumber = validated_data.get('phonenumber') email = validated_data.get('email') wechat = validated_data.get('wechat') price = validated_data.get('price') housetype = validated_data.get('housetype') roomtype = validated_data.get('roomtype') bathroom = validated_data.get('bathroom') parkinglot = validated_data.get('parkinglot') washingmachine = validated_data.get('washingmachine') included = validated_data.get('included') nearby = validated_data.get('nearby') leaseperiod = validated_data.get('leaseperiod') gender = validated_data.get('gender') cooking = validated_data.get('cooking') smoking = validated_data.get('smoking') otherrequirements = validated_data.get('otherrequirements') images = validated_data.get('images') videos = validated_data.get('videos') house = BMHouse(uuid=uuid) house.category = category house.fulladdress = fulladdress house.address = address house.city = city house.state = state house.zipcode = zipcode house.longitude = longitude house.latitude = latitude house.location = location house.submittime = submittime house.starttime = starttime house.endtime = endtime house.title = title house.description = description house.phonenumber = phonenumber house.email = email house.wechat = wechat house.price = price house.housetype = housetype house.roomtype = roomtype house.bathroom = bathroom house.parkinglot = parkinglot house.washingmachine = washingmachine house.included = included house.nearby = nearby house.leaseperiod = leaseperiod house.gender = gender house.cooking = cooking house.smoking = smoking house.otherrequirements = otherrequirements house.images = images house.videos = videos # print(house) house.save() return house def update(self, instance, validated_data): uuid = validated_data.get('uuid') category = validated_data.get('category') fulladdress = validated_data.get('fulladdress') address = validated_data.get('address') city = validated_data.get('city') state = validated_data.get('state') zipcode = validated_data.get('zipcode') submittime = validated_data.get('submittime') longitude = validated_data.get('longitude') latitude = validated_data.get('latitude') location = Point(float(longitude), float(latitude)) starttime = validated_data.get('starttime') endtime = validated_data.get('endtime') title = validated_data.get('title') description = validated_data.get('description') phonenumber = validated_data.get('phonenumber') email = validated_data.get('email') wechat = validated_data.get('wechat') price = validated_data.get('price') housetype = validated_data.get('housetype') roomtype = validated_data.get('roomtype') bathroom = validated_data.get('bathroom') parkinglot = validated_data.get('parkinglot') washingmachine = validated_data.get('washingmachine') included = validated_data.get('included') nearby = validated_data.get('nearby') leaseperiod = validated_data.get('leaseperiod') gender = validated_data.get('gender') cooking = validated_data.get('cooking') smoking = validated_data.get('smoking') otherrequirements = validated_data.get('otherrequirements') images = validated_data.get('images') videos = validated_data.get('videos') instance.uuid = uuid instance.category = category instance.fulladdress = fulladdress instance.address = address instance.city = city instance.state = state instance.zipcode = zipcode instance.longitude = longitude instance.latitude = latitude instance.location = location instance.submittime = submittime instance.starttime = starttime instance.endtime = endtime instance.title = title instance.description = description instance.phonenumber = phonenumber instance.email = email instance.wechat = wechat instance.price = price instance.housetype = housetype instance.roomtype = roomtype instance.bathroom = bathroom instance.parkinglot = parkinglot instance.washingmachine = washingmachine instance.included = included instance.nearby = nearby instance.leaseperiod = leaseperiod instance.gender = gender instance.cooking = cooking instance.smoking = smoking instance.otherrequirements = otherrequirements instance.images = images instance.videos = videos instance.save() return instance class Meta: model = BMHouse geo_field = 'location' fields = ('id', 'uuid', 'category', 'fulladdress', 'address', 'city', 'state', 'zipcode', 'submittime', 'longitude', 'latitude', 'date', 'description', 'contact', 'base', 'requirement', 'images', 'videos')