Beispiel #1
0
class ExtentsSerializerMixin(serializers.ModelSerializer):
    center = fields.GeometryField(
        help_text='Assign a GeoJSON string',
        required=False,
        style={'base_template': 'json.html', 'rows': 5}
    )
    field_list = ('center',)
class MapSerializerList(NamedSerializerMixin, ProjectSerializerMixin,
                        BaseSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='map-detail', )
    sharing_url = serializers.SerializerMethodField()
    # project_id = serializers.SerializerMethodField()
    center = fields.GeometryField(help_text='Assign a GeoJSON string',
                                  required=True,
                                  style={
                                      'base_template': 'json.html',
                                      'rows': 5
                                  })
    panel_styles = fields.JSONField(style={
        'base_template': 'json.html',
        'rows': 5
    },
                                    required=False)
    metadata = fields.JSONField(style={
        'base_template': 'json.html',
        'rows': 5
    },
                                required=False,
                                validators=[MetadataValidator()])
    last_updated_by = serializers.SerializerMethodField(read_only=True)
    thumb_url = serializers.SerializerMethodField(read_only=True)
    basemap = serializers.PrimaryKeyRelatedField(
        queryset=models.TileSet.objects.all())
    zoom = serializers.IntegerField(min_value=1, max_value=20, default=17)
    layers = serializers.SerializerMethodField()
    layers_url = serializers.SerializerMethodField()

    field_list = ('sharing_url', 'center', 'basemap', 'zoom', 'project_id')

    def get_sharing_url(self, obj):
        return '{0}/maps/{1}'.format(settings.SERVER_URL, obj.slug)

    def get_thumb_url(self, obj):
        return obj.get_thumb_url()

    def get_last_updated_by(self, obj):
        return obj.last_updated_by.username

    def get_layers(self, obj):
        layers = models.Layer.objects.filter(styled_map=obj)
        return LayerSerializer(layers, many=True, context={'request': {}}).data

    def get_layers_url(self, obj):
        return '%s/api/0/maps/%s/layers/' % (settings.SERVER_URL, obj.id)

    class Meta:
        model = models.StyledMap
        read_only_fields = ('time_stamp', 'date_created', 'last_updated_by',
                            'thumb_url')
        fields = BaseSerializer.field_list + \
            NamedSerializerMixin.field_list + \
            ProjectSerializerMixin.field_list + (
                'sharing_url', 'thumb_url', 'center',  'basemap', 'zoom',
                'time_stamp', 'date_created', 'last_updated_by', 'slug',
                'panel_styles', 'layers', 'layers_url', 'metadata'
            )
        depth = 0
class MapImageOverlayUpdateSerializer(AuditSerializerMixin,
                                      serializers.ModelSerializer):
    file_path = serializers.SerializerMethodField()
    url = serializers.SerializerMethodField()
    geometry = fields.GeometryField(help_text='Assign a GeoJSON string',
                                    allow_null=True,
                                    required=False,
                                    read_only=False,
                                    style={'base_template': 'json.html'},
                                    source='extents')

    def get_url(self, obj):
        model_name_plural = models.MapImage.model_name_plural
        return '%s/api/0/%s/%s/overlays/%s/' % (settings.SERVER_URL,
                                                model_name_plural,
                                                obj.source_mapimage.id, obj.id)

    def get_file_path(self, obj):
        return obj.encrypt_url(obj.file_name_orig)

    class Meta:
        model = models.ImageOpts
        read_only_fields = ('file_path', 'file_name_orig')
        fields = ('id', 'url', 'geometry', 'file_path', 'file_name_orig',
                  'opacity', 'name')
        depth = 0
Beispiel #4
0
class GeometrySerializerMixin(serializers.ModelSerializer):
    geometry = fields.GeometryField(
        help_text='Assign a GeoJSON string',
        allow_null=True,
        required=False,
        style={'base_template': 'json.html', 'rows': 5},
        source='point'
    )
    field_list = ('geometry',)
class UserProfileMixin(AuditSerializerMixin,
                       serializers.HyperlinkedModelSerializer):
    class Meta:
        fields = ('url', 'id', 'first_name', 'last_name', 'email', 'username',
                  'email_announcements', 'default_view_authority',
                  'default_location', 'contacts', 'date_created', 'time_stamp',
                  'user')
        read_only_fields = ('date_created', 'time_stamp')

    user = serializers.HyperlinkedRelatedField(label='user',
                                               view_name='user-detail',
                                               read_only=True)

    email = serializers.CharField(required=False,
                                  allow_blank=True,
                                  label='email',
                                  source='user.email')

    email_announcements = serializers.BooleanField(
        required=True, style={'base_template': 'checkbox.html'})

    default_location = fields.GeometryField(required=False,
                                            allow_null=True,
                                            style={
                                                'base_template': 'json.html',
                                                'rows': 5
                                            })

    first_name = serializers.CharField(required=False,
                                       allow_blank=True,
                                       label='first_name',
                                       source='user.first_name')

    last_name = serializers.CharField(required=False,
                                      allow_blank=True,
                                      label='last_name',
                                      source='user.last_name')

    username = serializers.CharField(read_only=True,
                                     label='username',
                                     source='user.username')

    contacts = serializers.RelatedField(many=True,
                                        label='contacts',
                                        read_only=True)

    default_view_authority = serializers.PrimaryKeyRelatedField(
        required=False, queryset=ObjectAuthority.objects.all())
class PrintSerializerDetail(PrintSerializerMixin):
    center = fields.GeometryField(
                help_text='Assign a GeoJSON center point',
                style={'base_template': 'json.html', 'rows': 5},
                read_only=True
            )
    zoom = serializers.IntegerField(
        min_value=1, max_value=20, default=17, read_only=True)
    layout = serializers.SerializerMethodField()
    map_provider = serializers.SerializerMethodField()

    class Meta:
        model = models.Print
        fields = PrintSerializerMixin.Meta.fields
        depth = 0

    def get_map_provider(self, obj):
        return obj.map_provider.id

    def get_layout(self, obj):
        return obj.layout.id
class PrintSerializer(PrintSerializerMixin):

    class Meta:
        model = models.Print
        fields = PrintSerializerMixin.Meta.fields
        fields_read_only = ('id', 'uuid')
        depth = 0

    center = fields.GeometryField(
        help_text='Assign a GeoJSON string',
        required=True,
        style={'base_template': 'json.html', 'rows': 5}
    )

    def create(self, validated_data):
        from django.contrib.gis.geos import GEOSGeometry
        point = GEOSGeometry(validated_data.get('center'))
        # Do some extra work to generate the PDF and calculate the map extents:
        instance = models.Print.insert_print_record(
            self.context.get('request').user,
            validated_data.get('project'),
            validated_data.get('layout'),
            validated_data.get('map_provider'),
            validated_data.get('zoom'),
            validated_data.get('center'),
            self.context.get('request').get_host(),
            map_title=validated_data.get('name'),
            instructions=validated_data.get('description'),
            do_save=False
        )
        d = {
            'uuid': instance.uuid,
            'virtual_path': instance.virtual_path,
            'layout': validated_data.get('layout'),
            'name': validated_data.get('name'),
            'description': validated_data.get('description'),
            'map_provider': validated_data.get('map_provider'),
            'zoom': validated_data.get('zoom'),
            'center': validated_data.get('center'),
            'project': validated_data.get('project'),
            'northeast': instance.northeast,
            'southwest': instance.southwest,
            'extents': instance.extents,
            'host': instance.host,
            'map_image_path': instance.map_image_path,
            'pdf_path': instance.pdf_path,
            'preview_image_path': instance.preview_image_path,
            'map_width': instance.map_width,
            'map_height': instance.map_height
        }
        d.update(self.get_presave_create_dictionary())
        self.instance = self.Meta.model.objects.create(**d)
        pdf_report = instance.generate_pdf()
        pdf_file_path = pdf_report.path + '/' + pdf_report.file_name
        thumb_file_path = pdf_report.path + '/' + 'thumbnail.jpg'

        # Transfer the PDF from file system to Amazon S3
        self.instance.pdf_path_S3.save(
            pdf_report.file_name, File(open(pdf_file_path)))
        self.instance.map_image_path_S3.save(
            'thumbnail_' + instance.uuid + '.jpg', File(open(thumb_file_path)))
        # serializer.save(**d)
        return self.instance
Beispiel #8
0
class MapImageSerializerCreate(NamedSerializerMixin, ProjectSerializerMixin,
                               BaseSerializer):
    def __init__(self, *args, **kwargs):
        super(MapImageSerializerCreate, self).__init__(*args, **kwargs)
        if not self.instance:
            return
        try:
            model = self.instance[0]
        except Exception:
            model = self.instance
        # Sets the storage location upon initialization:
        model.media_file_thumb.storage.location = model.get_storage_location()

    ext_whitelist = ['jpg', 'jpeg', 'gif', 'png']
    media_file = serializers.CharField(source='file_name_orig',
                                       required=True,
                                       style={'base_template': 'file.html'},
                                       help_text='Valid file types are: ' +
                                       ', '.join(ext_whitelist))
    status = serializers.PrimaryKeyRelatedField(
        read_only=False,
        required=False,
        default=1,
        queryset=models.StatusCode.objects.all())
    source_print = serializers.PrimaryKeyRelatedField(
        queryset=models.Print.objects.all(), required=False, allow_null=True)
    geometry = fields.GeometryField(help_text='Assign a GeoJSON string',
                                    allow_null=True,
                                    required=False,
                                    read_only=True,
                                    style={'base_template': 'json.html'},
                                    source='processed_image.extents')
    overlay_path = serializers.SerializerMethodField()
    file_path = serializers.SerializerMethodField()
    file_name = serializers.SerializerMethodField()
    media_thumb_url = serializers.SerializerMethodField()
    media_scaled_url = serializers.SerializerMethodField()

    class Meta:
        model = models.MapImage
        fields = BaseSerializer.field_list + \
            NamedSerializerMixin.field_list + \
            ProjectSerializerMixin.field_list + (
                'overlay_type', 'source_print', 'geometry',
                'overlay_path', 'media_file', 'file_path', 'file_name',
                'uuid', 'status', 'media_thumb_url', 'media_scaled_url'
            )
        read_only_fields = ('uuid', )

    def create(self, validated_data):
        # Overriding the create method to handle file processing
        # owner = self.context.get('request').user
        f = self.initial_data.get('media_file')

        # ensure filetype is valid:
        upload_helpers.validate_file(f, self.ext_whitelist)

        owner = self.context.get('request').user
        validated_data = {}
        validated_data.update(self.validated_data)
        validated_data.update(self.get_presave_create_dictionary())
        validated_data.update({
            'uuid':
            generic.generateID(),
            'status':
            models.StatusCode.objects.get(
                id=models.StatusCode.READY_FOR_PROCESSING),
            'upload_source':
            models.UploadSource.objects.get(id=models.UploadSource.WEB_FORM),
            'attribution':
            validated_data.get('attribution') or owner.username,
            'host':
            settings.SERVER_HOST
        })
        self.instance = self.Meta.model.objects.create(**validated_data)

        # process map onto the instance
        # from localground.apps.tasks import process_map
        # result = process_map.delay(self.instance)

        # now save the map_image to S3
        self.instance.process_mapImage_to_S3(f)
        return self.instance

    def get_file_path(self, obj):
        try:
            return obj.media_file_thumb.url
        except Exception:
            return None

    def get_file_name(self, obj):
        try:
            return obj.media_file_thumb.name
        except Exception:
            return None

    def get_overlay_path(self, obj):
        return obj.processed_map_url_path()

    def get_media_thumb_url(self, obj):
        try:
            return obj.media_file_thumb.url
        except Exception:
            return None

    def get_media_scaled_url(self, obj):
        try:
            return obj.media_file_scaled.url
        except Exception:
            return None