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