Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tethys Platform 4 Upgrade #17

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
115 changes: 8 additions & 107 deletions tethysapp/geoglows_hydroviewer/app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from tethys_sdk.app_settings import CustomSetting
from tethys_sdk.base import TethysAppBase, url_map_maker

from tethys_apps.base.workspace import _get_app_workspace

class GeoglowsHydroviewer(TethysAppBase):
"""
Expand All @@ -9,117 +9,18 @@ class GeoglowsHydroviewer(TethysAppBase):
name = 'GEOGloWS Hydroviewer'
package = 'geoglows_hydroviewer'
root_url = 'geoglows-hydroviewer'
index = 'geoglows_hydroviewer:home'
index = 'home'
icon = 'geoglows_hydroviewer/images/water.jpeg'
color = '#2980b9'
description = 'A tool for viewing the GEOGloWS ECMWF Hydrologic Model and creating subset shapefiles.',
tags = 'geoglows, streamflow, discharge, time series, hydrograph, geoprocessing, esri'
enable_feedback = False
feedback_emails = []

def url_maps(self):
UrlMap = url_map_maker(self.root_url)
return (
# the geoglows hydroviewer page (home page)
UrlMap(name='home',
url=f'{self.root_url}',
controller=f'{self.package}.controllers.home'),
UrlMap(name='hydroshare_view',
url=f'{self.root_url}/hydroshare',
controller=f'{self.package}.controllers.hydroshare_view'),

# handles the requests to get the various plots in the app modals
UrlMap(name='getAvailableDates',
url=f'{self.root_url}/hydroviewer/getAvailableDates',
controller=f'{self.package}.controllers.get_available_dates'),
UrlMap(name='getForecastData',
url=f'{self.root_url}/hydroviewer/getForecastData',
controller=f'{self.package}.controllers.get_forecast_data'),
UrlMap(name='getHistoricalData',
url=f'{self.root_url}/hydroviewer/getHistoricalData',
controller=f'{self.package}.controllers.get_historical_data'),
UrlMap(name='getBiasAdjusted',
url=f'{self.root_url}/hydroviewer/getBiasAdjusted',
controller=f'{self.package}.controllers.get_bias_adjusted'),
UrlMap(name='upload_new_observations',
url=f'{self.root_url}/hydroviewer/upload_new_observations',
controller=f'{self.package}.manage_uploaded_observations.upload_new_observations'),

# some other utilities
UrlMap(name='find_reach_id',
url=f'{self.root_url}/findReachID',
controller=f'{self.package}.controllers.find_reach_id'),

# Gauge Networks
UrlMap(name='get_gauge_geojson',
url=f'{self.root_url}/getGaugeGeoJSON',
controller=f'{self.package}.controllers.get_gauge_geojson'),

# geoglows hydroviewer creator main pages (navigable)
UrlMap(name='geoglows_hydroviewer_creator',
url=f'{self.root_url}/creator',
controller=f'{self.package}.controllers_creator.home'),
UrlMap(name='project_overview',
url=f'{self.root_url}/creator/project',
controller=f'{self.package}.controllers_creator.project_overview'),
UrlMap(name='render_hydroviewer',
url=f'{self.root_url}/creator/render',
controller=f'{self.package}.controllers_creator.render_hydroviewer'),

# urls for adding/deleting projects (non-navigable)
UrlMap(name='add_new_project',
url=f'{self.root_url}/creator/add-new-project',
controller=f'{self.package}.controllers_creator.add_new_project'),
UrlMap(name='delete_existing_project',
url=f'{self.root_url}/creator/delete_existing_project',
controller=f'{self.package}.controllers_creator.delete_existing_project'),

# geoprocessing shapefiles urls (non-navigable)
UrlMap(name='geoprocess_idregion',
url=f'{self.root_url}/creator/project/geoprocessing/geoprocess_idregion',
controller=f'{self.package}.controllers_creator_geoprocess.geoprocess_hydroviewer_idregion'),
UrlMap(name='geoprocess_clip',
url=f'{self.root_url}/creator/project/geoprocessing/geoprocess_clip',
controller=f'{self.package}.controllers_creator_geoprocess.geoprocess_hydroviewer_clip'),
UrlMap(name='geoprocess_zip_shapefiles',
url=f'{self.root_url}/creator/project/geoprocessing/geoprocess_zip_shapefiles',
controller=f'{self.package}.controllers_creator_geoprocess.geoprocess_zip_shapefiles'),

# project boundary editing pages (navigable)
UrlMap(name='draw_boundaries',
url=f'{self.root_url}/creator/project/edit/draw_boundaries',
controller=f'{self.package}.controllers_creator.draw_boundaries'),
UrlMap(name='choose_boundary_country',
url=f'{self.root_url}/creator/project/edit/choose_boundary_country',
controller=f'{self.package}.controllers_creator.choose_boundary_country'),
UrlMap(name='boundary_by_outlet',
url=f'{self.root_url}/creator/project/edit/boundary_by_outlet',
controller=f'{self.package}.controllers_creator.boundary_by_outlet'),
# project boundary save/retrieve urls (non-navigable)
UrlMap(name='save_boundaries',
url=f'{self.root_url}/creator/project/edit/save_boundaries',
controller=f'{self.package}.controllers_creator.save_boundaries'),
UrlMap(name='find_upstream_boundaries',
url=f'{self.root_url}/creator/project/edit/find_upstream_boundaries',
controller=f'{self.package}.controllers_creator.find_upstream_boundaries'),
UrlMap(name='retrieve_boundaries',
url=f'{self.root_url}/creator/project/edit/retrieve_boundaries',
controller=f'{self.package}.controllers_creator.retrieve_hydroviewer_boundaries'),

# project and shapefile exporting options (non-navigable)
UrlMap(name='export_zipfile',
url=f'{self.root_url}/creator/project/export/zipfile',
controller=f'{self.package}.controllers_creator_export.export_zipfile'),
UrlMap(name='export_geoserver',
url=f'{self.root_url}/creator/project/export/geoserver',
controller=f'{self.package}.controllers_creator_export.export_geoserver'),
UrlMap(name='export_hydroshare',
url=f'{self.root_url}/creator/project/export/hydroshare',
controller=f'{self.package}.controllers_creator_export.export_hydroshare'),
UrlMap(name='export_html',
url=f'{self.root_url}/creator/project/export/html',
controller=f'{self.package}.controllers_creator_export.export_html'),
)

controller_modules = [
'controllers_creator_export', 'controllers_creator_geoprocess', 'controllers_creator',
'hydroviewer_creator_tools', 'manage_gauge_networks', 'manage_uploaded_observations'
]

def custom_settings(self):
return (
Expand All @@ -128,6 +29,6 @@ def custom_settings(self):
type=CustomSetting.TYPE_STRING,
description="Absolute file path to a directory containing geoglows shapefiles (see app documentation)",
required=False,
default=self.get_app_workspace().path,
default=_get_app_workspace(GeoglowsHydroviewer)
),
)
63 changes: 47 additions & 16 deletions tethysapp/geoglows_hydroviewer/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from django.http import JsonResponse
from django.shortcuts import render
from tethys_sdk.gizmos import SelectInput, Button
from tethys_sdk.routing import controller

from .app import GeoglowsHydroviewer as App
from .manage_gauge_networks import get_observed_station_flow
Expand All @@ -35,25 +36,28 @@
)


def home(request):
@controller(
app_workspace=True,
)
def home(request, app_workspace):
"""
Controller for the app home page.
"""
delete_old_observations()
delete_old_observations(app_workspace)

uploaded_observations = SelectInput(
display_text='Uploaded Observational Data',
name='uploaded_observations',
multiple=False,
original=True,
options=list_uploaded_observations(),
options=list_uploaded_observations(app_workspace),
)
gauge_networks = SelectInput(
display_text='Stream Gauge Networks',
name='gauge_networks',
multiple=False,
original=True,
options=list_gauge_networks(),
options=list_gauge_networks(app_workspace),
)
upload_new_observation = Button(
name='Upload New Observation',
Expand All @@ -72,8 +76,11 @@ def home(request):

return render(request, 'geoglows_hydroviewer/geoglows_hydroviewer.html', context)


def hydroshare_view(request):
@controller(
url='hydroshare',
app_workspace=True,
)
def hydroshare_view(request, app_workspace):
"""
Controller for the Hydroshare view page.
"""
Expand All @@ -99,21 +106,21 @@ def hydroshare_view(request):
initial=''
)

delete_old_observations()
delete_old_observations(app_workspace)

uploaded_observations = SelectInput(
display_text='Uploaded Observational Data',
name='uploaded_observations',
multiple=False,
original=True,
options=list_uploaded_observations(),
options=list_uploaded_observations(app_workspace),
)
gauge_networks = SelectInput(
display_text='Stream Gauge Networks',
name='gauge_networks',
multiple=False,
original=True,
options=list_gauge_networks(),
options=list_gauge_networks(app_workspace),
)
upload_new_observation = Button(
name='Upload New Observation',
Expand All @@ -134,7 +141,10 @@ def hydroshare_view(request):

return render(request, 'geoglows_hydroviewer/geoglows_hydroviewer.html', context)


@controller(
name='getAvailableDates',
url='hydroviewer/getAvailableDates',
)
def get_available_dates(request):
reach_id = request.GET['reach_id']
s = requests.Session()
Expand All @@ -146,6 +156,10 @@ def get_available_dates(request):
))


@controller(
name='getForecastData',
url='hydroviewer/getForecastData',
)
def get_forecast_data(request):
# get data
s = requests.Session()
Expand All @@ -167,6 +181,10 @@ def get_forecast_data(request):
))


@controller(
name='getHistoricalData',
url='hydroviewer/getHistoricalData',
)
def get_historical_data(request):
# get data
s = requests.Session()
Expand All @@ -188,7 +206,12 @@ def get_historical_data(request):
))


def get_bias_adjusted(request):
@controller(
name='getBiasAdjusted',
url='hydroviewer/getBiasAdjusted',
app_workspace=True,
)
def get_bias_adjusted(request, app_workspace):
# accept the parameters from the user
data = request.GET.dict()
network = data.get('gauge_network', False)
Expand All @@ -198,7 +221,7 @@ def get_bias_adjusted(request):
else:
reach_id = data['reach_id']
csv = data['observation']
workspace_path = App.get_app_workspace().path
workspace_path = app_workspace.path
obs_path = os.path.join(workspace_path, 'observations', csv)
obs_data = pd.read_csv(obs_path, index_col=0)
obs_data.index = pd.to_datetime(obs_data.index)
Expand Down Expand Up @@ -230,15 +253,23 @@ def get_bias_adjusted(request):
scatters=gpp.corrected_scatterplots(fixed_hist, sim_data, obs_data, titles=titles, outformat='plotly_html'),
stats_table=gbc.statistics_tables(fixed_hist, sim_data, obs_data),
))



@controller(
url='findReachID',
)
def find_reach_id(request):
reach_id = request.GET['reach_id']
lat, lon = gsf.reach_to_latlon(int(reach_id))
return JsonResponse({'lat': lat, 'lon': lon})


def get_gauge_geojson(request):
workspace_path = App.get_app_workspace().path
with open(os.path.join(workspace_path, 'gauge_networks', request.GET['network'])) as geojson:
@controller(
name='get_gauge_geojson',
url='getGaugeGeoJSON',
app_workspace=True,
)
def get_gauge_geojson(request, app_workspace):
workspace_path = app_workspace
with open(os.path.join(workspace_path.path, 'gauge_networks', request.GET['network'])) as geojson:
return JsonResponse(json.load(geojson))
Loading