diff --git a/src/mmw/apps/bigcz/clients/cuahsi/search.py b/src/mmw/apps/bigcz/clients/cuahsi/search.py index ba2a6f79a..c0f1dc229 100644 --- a/src/mmw/apps/bigcz/clients/cuahsi/search.py +++ b/src/mmw/apps/bigcz/clients/cuahsi/search.py @@ -29,10 +29,35 @@ DATE_MAX = date(2100, 1, 1) DATE_FORMAT = '%m/%d/%Y' +GRIDDED = [ + 'NWS-WGRFC_Hourly_MPE', + 'NWS_WGRFC_Daily_MPE_Recent_Values', + 'LMRFC_Data', + 'GLDAS_NOAH', + 'NLDAS_FORA', + 'NLDAS_NOAH', + 'TRMM_3B42_7', +] client = Client(CATALOG_URL, timeout=settings.BIGCZ_CLIENT_TIMEOUT) +def filter_networkIDs(services, gridded=False): + """ + Transforms list of services to list of ServiceIDs, with respect to + given options. + + If gridded=False, then GRIDDED services will not be included. + + If no filters apply, we return an empty list to disable filtering. + """ + if not gridded: + return [str(s.ServiceID) for s in services + if s.NetworkName not in GRIDDED] + + return [] + + def parse_geom(record): lat = record['latitude'] lng = record['longitude'] @@ -173,7 +198,7 @@ def get_services_in_box(box): return [] -def get_series_catalog_in_box(box, from_date, to_date): +def get_series_catalog_in_box(box, from_date, to_date, networkIDs): from_date = from_date or DATE_MIN to_date = to_date or DATE_MAX @@ -183,7 +208,7 @@ def get_series_catalog_in_box(box, from_date, to_date): ymin=box.ymin, ymax=box.ymax, conceptKeyword='', - networkIDs='', + networkIDs=','.join(networkIDs), beginDate=from_date.strftime(DATE_FORMAT), endDate=to_date.strftime(DATE_FORMAT)) @@ -201,6 +226,7 @@ def search(**kwargs): bbox = kwargs.get('bbox') to_date = kwargs.get('to_date') from_date = kwargs.get('from_date') + gridded = 'gridded' in kwargs.get('options') if not bbox: raise ValidationError({ @@ -209,9 +235,10 @@ def search(**kwargs): box = BBox(bbox) world = BBox('-180,-90,180,90') - series = get_series_catalog_in_box(box, from_date, to_date) - series = group_series_by_location(series) services = get_services_in_box(world) + networkIDs = filter_networkIDs(services, gridded) + series = get_series_catalog_in_box(box, from_date, to_date, networkIDs) + series = group_series_by_location(series) results = sorted(parse_records(series, services), key=attrgetter('end_date'), reverse=True) diff --git a/src/mmw/apps/bigcz/views.py b/src/mmw/apps/bigcz/views.py index 41f5a26d5..52512dd9b 100644 --- a/src/mmw/apps/bigcz/views.py +++ b/src/mmw/apps/bigcz/views.py @@ -32,6 +32,7 @@ def _do_search(request): 'to_date': parse_date(request.query_params.get('to_date')), 'from_date': parse_date(request.query_params.get('from_date')), 'bbox': request.query_params.get('bbox'), + 'options': request.query_params.get('options', ''), 'page': page, } diff --git a/src/mmw/js/src/data_catalog/controllers.js b/src/mmw/js/src/data_catalog/controllers.js index 6d404734e..d29cb9146 100644 --- a/src/mmw/js/src/data_catalog/controllers.js +++ b/src/mmw/js/src/data_catalog/controllers.js @@ -38,7 +38,8 @@ var DataCatalogController = { new models.Catalog({ id: 'cuahsi', name: 'WDC', - description: 'Optional catalog description here...', + has_filters: true, + options: new models.SearchOptions([{ id: 'gridded' }]), is_pageable: false, results: new models.Results(null, { catalog: 'cuahsi' }), }) diff --git a/src/mmw/js/src/data_catalog/models.js b/src/mmw/js/src/data_catalog/models.js index b3a281ef6..8633e5836 100644 --- a/src/mmw/js/src/data_catalog/models.js +++ b/src/mmw/js/src/data_catalog/models.js @@ -1,7 +1,7 @@ "use strict"; var $ = require('jquery'), - _ = require('underscore'), + _ = require('lodash'), Backbone = require('../../shim/backbone'), turfIntersect = require('turf-intersect'), App = require('../app'), @@ -11,6 +11,17 @@ var REQUEST_TIMED_OUT_CODE = 408; var DESCRIPTION_MAX_LENGTH = 100; var PAGE_SIZE = settings.get('data_catalog_page_size'); +var SearchOption = Backbone.Model.extend({ + defaults: { + id: '', + active: false, + }, +}); + +var SearchOptions = Backbone.Collection.extend({ + model: SearchOption, +}); + var Catalog = Backbone.Model.extend({ defaults: { id: '', @@ -24,6 +35,8 @@ var Catalog = Backbone.Model.extend({ active: false, results: null, // Results collection resultCount: 0, + has_filters: false, // If local filters apply + options: null, // SearchOptions collection is_pageable: true, page: 1, error: '', @@ -35,6 +48,14 @@ var Catalog = Backbone.Model.extend({ this.get('results').on('change:show_detail', function() { self.set('detail_result', self.get('results').getDetail()); }); + + // Initialize and listen to options for changes + if (this.get('options') === null) { + this.set({ options: new SearchOptions() }); + } + this.get('options').on('change:active', function() { + self.startSearch(1); + }); }, searchIfNeeded: function(query, fromDate, toDate, bbox) { @@ -76,6 +97,9 @@ var Catalog = Backbone.Model.extend({ startSearch: function(page) { var lastPage = Math.ceil(this.get('resultCount') / PAGE_SIZE), thisPage = parseInt(page) || 1, + has_filters = this.get('has_filters'), + options = this.get('options'), + id = function(option) { return option.id; }, data = { catalog: this.id, query: this.get('query'), @@ -88,6 +112,12 @@ var Catalog = Backbone.Model.extend({ _.assign(data, { page: thisPage }); } + if (has_filters && options) { + _.assign(data, { + options: options.where({ active: true }).map(id).join(',') + }); + } + this.set('loading', true); this.set('error', false); @@ -160,8 +190,8 @@ var Result = Backbone.Model.extend({ description: '', geom: null, // GeoJSON links: null, // Array - created: '', - updated: '', + created_at: '', + updated_at: '', show_detail: false // Show this result as the detail view? }, @@ -260,6 +290,8 @@ var SearchForm = Backbone.Model.extend({ }); module.exports = { + SearchOption: SearchOption, + SearchOptions: SearchOptions, Catalog: Catalog, Catalogs: Catalogs, Result: Result, diff --git a/src/mmw/js/src/data_catalog/templates/tabContent.html b/src/mmw/js/src/data_catalog/templates/tabContent.html index d372b4c47..d03183299 100644 --- a/src/mmw/js/src/data_catalog/templates/tabContent.html +++ b/src/mmw/js/src/data_catalog/templates/tabContent.html @@ -1,3 +1,16 @@ +{% if has_filters %} +
+ {% if id == 'cuahsi' %} +
+ +
+ {% endif %} +
+{% endif %} + {% if description %}
{{ description }} diff --git a/src/mmw/js/src/data_catalog/views.js b/src/mmw/js/src/data_catalog/views.js index fa0d7c968..52ed15f46 100644 --- a/src/mmw/js/src/data_catalog/views.js +++ b/src/mmw/js/src/data_catalog/views.js @@ -331,22 +331,35 @@ var TabContentView = Marionette.LayoutView.extend({ }, onShow: function() { + var model = this.model; + this.toggleActiveClass(); this.resultRegion.show(new ResultsView({ - collection: this.model.get('results'), - catalog: this.model.id, + collection: model.get('results'), + catalog: model.id, })); this.errorRegion.show(new ErrorView({ - model: this.model, + model: model, })); - if (this.model.get('is_pageable')) { + if (model.get('is_pageable')) { this.pagerRegion.show(new PagerView({ - model: this.model, + model: model, })); } + + if (model.get('has_filters')) { + // TODO Generalize for different types of filters + if (model.id === 'cuahsi') { + $('input#gridded').change(function() { + model.get('options') + .findWhere({ id: 'gridded' }) + .set({ active: this.checked }); + }); + } + } }, toggleActiveClass: function() { diff --git a/src/mmw/sass/pages/_data-catalog.scss b/src/mmw/sass/pages/_data-catalog.scss index 75f8c568b..6e11a0eb6 100644 --- a/src/mmw/sass/pages/_data-catalog.scss +++ b/src/mmw/sass/pages/_data-catalog.scss @@ -40,6 +40,10 @@ } } + .filters-region { + padding: 6px 10px 0 10px; + } + .result-region { height: auto !important; width: auto !important;