コード例 #1
0
class ProjectSerializer(serializers.ModelSerializer):

    class Meta:
        model = Project
        depth = 1
        geo_field = 'area_of_interest'
        fields = ('id', 'name', 'area_of_interest', 'area_of_interest_name',
                  'scenarios', 'model_package', 'created_at', 'modified_at',
                  'is_private', 'is_activity', 'gis_data', 'mapshed_job_uuid',
                  'subbasin_mapshed_job_uuid', 'wkaoi', 'user', 'hydroshare',
                  'in_drb')

    user = UserSerializer(default=serializers.CurrentUserDefault())
    gis_data = JsonField(required=False, allow_null=True)
    mapshed_job_uuid = serializers.SlugRelatedField(
        slug_field='uuid',
        queryset=Job.objects.all(),
        required=False,
        allow_null=True)
    subbasin_mapshed_job_uuid = serializers.SlugRelatedField(
        slug_field='uuid',
        queryset=Job.objects.all(),
        required=False,
        allow_null=True)
    scenarios = ScenarioSerializer(many=True, read_only=True)
    hydroshare = HydroShareResourceSerializer(read_only=True)
コード例 #2
0
class ProjectListingSerializer(gis_serializers.GeoModelSerializer):
    class Meta:
        model = Project
        fields = ('id', 'name', 'area_of_interest_name', 'is_private',
                  'model_package', 'created_at', 'modified_at', 'user',
                  'hydroshare')

    hydroshare = HydroShareResourceSerializer(read_only=True)
コード例 #3
0
class ProjectSerializer(gis_serializers.GeoModelSerializer):
    class Meta:
        model = Project
        depth = 1
        geo_field = 'area_of_interest'

    user = UserSerializer(default=serializers.CurrentUserDefault())
    gis_data = JsonField(required=False, allow_null=True)
    scenarios = ScenarioSerializer(many=True, read_only=True)
    hydroshare = HydroShareResourceSerializer(read_only=True)
コード例 #4
0
def update_resource(user_id, project_id, params):
    hs = hss.get_client(user_id)
    hsresource = HydroShareResource.objects.get(project_id=project_id)

    if not hs.check_resource_exists(hsresource.resource):
        raise RuntimeError('HydroShare could not find requested resource')

    # Update files
    files = _hs_gather_client_files(params)

    hs.add_files(hsresource.resource, files)

    hsresource.exported_at = now()
    hsresource.save()

    serializer = HydroShareResourceSerializer(hsresource)
    return serializer.data
コード例 #5
0
class ProjectSerializer(gis_serializers.GeoModelSerializer):
    class Meta:
        model = Project
        depth = 1
        geo_field = 'area_of_interest'

    user = UserSerializer(default=serializers.CurrentUserDefault())
    gis_data = JsonField(required=False, allow_null=True)
    mapshed_job_uuid = serializers.SlugRelatedField(slug_field='uuid',
                                                    queryset=Job.objects.all(),
                                                    required=False,
                                                    allow_null=True)
    subbasin_mapshed_job_uuid = serializers.SlugRelatedField(
        slug_field='uuid',
        queryset=Job.objects.all(),
        required=False,
        allow_null=True)
    scenarios = ScenarioSerializer(many=True, read_only=True)
    hydroshare = HydroShareResourceSerializer(read_only=True)
コード例 #6
0
def hydroshare(request):
    # Get HydroShare client with user's credentials
    try:
        hs = hss.get_client(request.user.id)
    except ObjectDoesNotExist:
        return Response(
            data={'errors': ['User not connected to HydroShare']},
            status=status.HTTP_401_UNAUTHORIZED
        )

    project_id = request.GET.get('project')
    if not project_id:
        # No support for exporting without a project right now
        return Response(
            data={'errors': ['Cannot export to HydroShare without project']},
            status=status.HTTP_400_BAD_REQUEST
        )

    params = request.data
    project = get_object_or_404(Project, id=project_id,
                                user__id=request.user.id)

    try:
        hsresource = HydroShareResource.objects.get(project=project)
    except HydroShareResource.DoesNotExist:
        hsresource = None

    # GET existing resource simply returns it
    if hsresource and request.method == 'GET':
        if not hs.check_resource_exists(hsresource.resource):
            return Response(
                data={
                    'errors': ['HydroShare could not find requested resource']
                },
                status=status.HTTP_404_NOT_FOUND
            )
        serializer = HydroShareResourceSerializer(hsresource)
        return Response(serializer.data)

    # PATCH existing resource updates its autosync status
    if hsresource and request.method == 'PATCH':
        autosync = params.get('autosync', None)
        if autosync is None:
            return Response(
                data={'errors': ['Must specify autosync as true or false']},
                status=status.HTTP_400_BAD_REQUEST
            )
        hsresource.autosync = autosync
        hsresource.save()
        serializer = HydroShareResourceSerializer(hsresource)
        return Response(serializer.data)

    # DELETE existing resource removes it from MMW and HydroShare
    if hsresource and request.method == 'DELETE':
        if hs.check_resource_exists(hsresource.resource):
            hs.deleteResource(hsresource.resource)
        hsresource.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

    # Cannot GET, PATCH or DELETE non-existing resource
    if not hsresource and request.method in ['GET', 'PATCH', 'DELETE']:
        return Response(status=status.HTTP_404_NOT_FOUND)

    # POST existing resource updates it
    if hsresource and request.method == 'POST':
        return start_celery_job([
            update_resource.s(request.user.id, project_id, params)
        ], project_id, request.user)

    # POST new resource creates it in HydroShare
    return start_celery_job([
        create_resource.s(request.user.id, project_id, params)
    ], project_id, request.user)
コード例 #7
0
def create_resource(user_id, project_id, params):
    hs = hss.get_client(user_id)
    project = Project.objects.get(pk=project_id)

    # Convert keywords from array to set of values
    keywords = params.get('keywords')
    keywords = set(keywords) if keywords else set()

    # POST new resource creates it in HydroShare
    resource = hs.createResource(
        'CompositeResource',
        params.get('title', project.name),
        abstract=params.get('abstract', ''),
        keywords=tuple(DEFAULT_KEYWORDS | keywords),
        extra_metadata=MMW_APP_KEY_FLAG,
    )

    # Files sent from the client
    files = _hs_gather_client_files(params)

    # AoI GeoJSON
    aoi_geojson = GEOSGeometry(project.area_of_interest).geojson
    files.append({
        'name': 'area-of-interest.geojson',
        'contents': aoi_geojson,
    })

    # Add all files
    hs.add_files(resource, files)

    # AoI Shapefile
    aoi_json = json.loads(aoi_geojson)
    crs = {
        'no_defs': True,
        'proj': 'longlat',
        'ellps': 'WGS84',
        'datum': 'WGS84'
    }
    schema = {'geometry': aoi_json['type'], 'properties': {}}
    with fiona.open(f'/tmp/{resource}.shp',
                    'w',
                    driver='ESRI Shapefile',
                    crs=crs,
                    schema=schema) as shapefile:
        shapefile.write({'geometry': aoi_json, 'properties': {}})

    for ext in SHAPEFILE_EXTENSIONS:
        filename = f'/tmp/{resource}.{ext}'
        with open(filename, 'rb') as shapefile:
            hs.addResourceFile(resource, shapefile, f'area-of-interest.{ext}')
        os.remove(filename)

    # MapShed BMP Spreadsheet Tool
    if params.get('mapshed_data'):
        response = requests.get(BMP_SPREADSHEET_TOOL_URL,
                                allow_redirects=True,
                                stream=True)
        hs.addResourceFile(resource, io.BytesIO(response.content),
                           'MMW_BMP_Spreadsheet_Tool.xlsx')

    # Make resource public and shareable
    endpoint = hs.resource(resource)
    endpoint.public(True)
    endpoint.shareable(True)

    # Add geographic coverage
    endpoint.functions.set_file_type({
        'file_path': 'area-of-interest.shp',
        'hs_file_type': 'GeoFeature',
    })

    # Link HydroShareResource to Project and save
    hsresource = HydroShareResource.objects.create(
        project=project,
        resource=resource,
        title=params.get('title', project.name),
        autosync=params.get('autosync', False),
        exported_at=now())
    hsresource.save()

    # Make Project public and save
    project.is_private = False
    project.save()

    # Return newly created HydroShareResource
    serializer = HydroShareResourceSerializer(hsresource)
    return serializer.data