diff --git a/VIPSWeb/static/js/forecastmap.js b/VIPSWeb/static/js/forecastmap.js index 1da1118a7b6a29c2768e9d198b8e699a8c863246..ead65187770a3691e0d4ce7be875a0dbed1812c6 100644 --- a/VIPSWeb/static/js/forecastmap.js +++ b/VIPSWeb/static/js/forecastmap.js @@ -67,7 +67,7 @@ function initForecastMap(lonLat, zoomLevel, mapAttribution) forecastLayer = new ol.layer.Vector({ source: new ol.source.Vector({ - url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + buildPathParamString("cropOrganismId", getSelectedCropIds()), + url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + buildPathParamString("cropCategoryId", getSelectedCropCategoryIds()), format: new ol.format.KML({"extractAttributes":true}), projection: ol.proj.get('EPSG:3857') }) @@ -191,7 +191,7 @@ function initForecastMap(lonLat, zoomLevel, mapAttribution) + "</ul>"; } - console.log(feature); + //console.log(feature); poiDetails.popover({ animation: true, trigger: 'manual', @@ -334,11 +334,11 @@ function getCurrentMapZoomLevel() function updateForecastLayers() { map.removeLayer(forecastLayer); - var cropOrganismIdStr = buildPathParamString("cropOrganismId", getSelectedCropIds()); + var cropCategoryIdStr = buildPathParamString("cropCategoryId", getSelectedCropCategoryIds()); // If empty, make sure we send a number anyway - if(cropOrganismIdStr === "") + if(cropCategoryIdStr === "") { - cropOrganismIdStr = "&cropOrganismId=-1"; + cropCategoryIdStr = "&cropCategoryId=-1"; } /*forecastLayer = new ol.layer.Vector({ source: new ol.source.KML({ @@ -348,7 +348,7 @@ function updateForecastLayers() });*/ forecastLayer = new ol.layer.Vector({ source: new ol.source.Vector({ - url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + cropOrganismIdStr, + url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + cropCategoryIdStr, format: new ol.format.KML(), projection: ol.proj.get('EPSG:3857') }) diff --git a/VIPSWeb/static/js/frontpage.js b/VIPSWeb/static/js/frontpage.js index 487cd4dee4dc0b256ea15aadea4b20da6b836a74..983b3d62dbde8bb50775a0efc746d8e775999687 100644 --- a/VIPSWeb/static/js/frontpage.js +++ b/VIPSWeb/static/js/frontpage.js @@ -31,18 +31,33 @@ * Which crops have been selected? Checks the form * @returns */ -function getSelectedCropIds() +function getSelectedCropCategoryIds() { - selectedCropIds = []; - formFields = document.getElementsByName("cropIds"); + selectedCropCategoryIds = []; + formFields = document.getElementsByName("cropCategoryIds"); for(var i=0;i<formFields.length;i++) { if(formFields[i].checked) { - selectedCropIds = selectedCropIds.concat(eval(formFields[i].value)); + selectedCropCategoryIds.push(parseInt(formFields[i].value)); } } - return selectedCropIds; + return selectedCropCategoryIds; +} + +function getSelectedCropIds() +{ + var selectedCropCategoryIds = getSelectedCropCategoryIds(); + var selectedCropIdsTemp = []; + for(var i in settings.cropCategories) + { + if(selectedCropCategoryIds.indexOf(settings.cropCategories[i]["cropCategoryId"]) >= 0) + { + selectedCropIdsTemp = selectedCropIdsTemp.concat(settings.cropCategories[i]["cropOrganismIds"]); + } + } + // This trick ensures all elements in array are unique + return selectedCropIdsTemp.filter(function(value,index,self){return self.indexOf(value) === index;}); } var allObservations; @@ -54,8 +69,8 @@ function cacheObservations() allObservations = json; //console.log(allObservations); filterObservations(); - } -); + } + ); } /** @@ -90,7 +105,6 @@ function renderObservationMessages() messagesLeftColTBody.innerHTML += '<tr>\n<td class="dateCell">' + getStandardFormattedDate(observation["timeOfObservation"]) + '</td><td><a href="/observations/' + observation["observationId"] + '">' + observation["observationHeading"] + '</a></td>\n</tr>'; } - } var allMessages; @@ -113,20 +127,6 @@ function cacheMessages() */ function renderMessages() { - /*for(var i in settings.frontpageMessageTagIds) - { - var tagId = settings.frontpageMessageTagIds[i]; - document.getElementById("tbody_messageTag_" + tagId).innerHTML = ""; - tagMessages = filteredMessages[tagId]; - //console.log(tagMessages); - for(var j in tagMessages) - { - var tagMessage = tagMessages[j]; - document.getElementById("tbody_messageTag_" + tagId).innerHTML += - '<tr><td class="dateCell">' + tagMessage["datePub"] + '</td><td><a href="/messages/' + tagMessage["messageId"] + '">' + getMessageLocale(tagMessage, settings.currentLanguage,settings.languageCode)["heading"] + '</a></td></tr>'; - - } - }*/ var messagesRightColTBody = document.getElementById("messagesRightColTBody"); messagesRightColTBody.innerHTML = ""; @@ -147,7 +147,6 @@ function renderMessages() function filterMessages() { var selectedCropIds = getSelectedCropIds(); - //console.log(selectedCropIds); filteredMessages = []; for(var tagI in allMessages) { @@ -156,23 +155,23 @@ function filterMessages() for(var mI in allMessages[tagI]) { var message = allMessages[tagI][mI]; - var messageCropOrganismIds = message["messageCropOrganismIds"]; - if(messageCropOrganismIds.length == 0) + var cropCategoryIds = message["cropCategoryIds"]; + if(cropCategoryIds.length == 0) { //filteredForTag.push(message); filteredMessages.push(message); } else { - for(var mCOI in messageCropOrganismIds) + for(var cci in cropCategoryIds) { //console.log(messageCropOrganismIds[mCOI]); - if(selectedCropIds.indexOf(messageCropOrganismIds[mCOI]) >= 0) + /*if(selectedCropIds.indexOf(messageCropOrganismIds[mCOI]) >= 0) { //filteredForTag.push(message); filteredMessages.push(message); break; - } + }*/ } } } @@ -235,6 +234,7 @@ function renderForecastConfigurationSummaries(forecastConfigurations) forecastSummariesTable.innerHTML = summariesHTML; forecastSummariesTable.style.display="block"; //document.getElementById("emptyForecastSummariesTableInfo").style.display="none"; + } /** @@ -283,8 +283,6 @@ function renderMyForecastConfigurationSummaries() return; } - console.log(myForecastConfigurations); - var mySummariesHTML = getforecastSummariesTableHTML(myForecastConfigurations,false, true); myForecastSummariesTable.innerHTML = mySummariesHTML; //document.getElementById("myForecastSummariesContainer").style.display = "block"; @@ -570,17 +568,15 @@ function updateForecastSummaries() // Iterate all forecast summaries, filter by crop (must be among the selected crops) // and location on the map (must be visible on the map) var selectedCropIds = getSelectedCropIds(); - var filteredForecastSummaries = []; for(var i in cachedForecastSummaries) { var forecastSummary = cachedForecastSummaries[i]; - //console.log(forecastSummary); // Filter by crop var isASelectedCrop = false; for(var j in selectedCropIds) { - if(selectedCropIds[j] === forecastSummary.cropOrganismId.organismId) + if(selectedCropIds.indexOf(forecastSummary.cropOrganismId.organismId) > 0) { isASelectedCrop = true; } @@ -615,7 +611,18 @@ function updateForecastSummaries() renderForecastConfigurationSummaries(filteredForecastSummaries); - +} + +function getOrganismIdsForCropCategory(cropCategoryId) +{ + for(var i in settings.cropCategories) + { + if(settings.cropCategories[i]["crop_group_id"] == cropCategoryId) + { + return settings.cropCategories[i]["crop_ids"]; + } + } + return []; } /** @@ -696,9 +703,9 @@ function getExternalResourcesForPoi(poiId) * TODO: If user logged in, store in user session on server for * global access on clients where the user is logged in */ -function storeSelectedCropIds() +function storeSelectedCropCategoryIds() { - storeLocalSettings({"selectedCropIds":getSelectedCropIds()}); + storeLocalSettings({"selectedCropCategoryIds":getSelectedCropCategoryIds()}); } /** @@ -706,16 +713,16 @@ function storeSelectedCropIds() * TODO: Add server as persistence layer when login system is * implemented */ -function restoreSelectedCropIds() +function restoreSelectedCropCategoryIds() { // localStorage only stores strings, so we must recreate as array - var selectedCropIds = getLocalSettings(["selectedCropIds"]) != null ? - getLocalSettings(["selectedCropIds"])["selectedCropIds"].split(",") + var selectedCropCategoryIds = getLocalSettings(["selectedCropCategoryIds"]) != null ? + getLocalSettings(["selectedCropCategoryIds"])["selectedCropCategoryIds"].split(",") : null; - if(selectedCropIds != null) + if(selectedCropCategoryIds != null) { // Loop through existing crops, set as checked/unchecked - formFields = document.getElementsByName("cropIds"); + formFields = document.getElementsByName("cropCategoryIds"); for(i in formFields) { if(formFields[i].value == undefined) @@ -723,10 +730,10 @@ function restoreSelectedCropIds() continue; } var previouslySelected = false; - for(var j in selectedCropIds) + for(var j in selectedCropCategoryIds) { // Need to use eval() as values are strings with [] representing arrays - if(eval(formFields[i].value).indexOf(parseInt(selectedCropIds[j])) >=0) + if(parseInt(formFields[i].value) == parseInt(selectedCropCategoryIds[j])) { previouslySelected = true; } @@ -756,7 +763,6 @@ function removeFromMyForecastConfigurations(forecastConfigurationId) { myForecastConfigurationIds.splice(spliceIndex,1); } - console.log(myForecastConfigurationIds); storeLocalSettings({"myForecastConfigurationIds":myForecastConfigurationIds}); updateForecastSummaries(); } diff --git a/VIPSWeb/templates/index.html b/VIPSWeb/templates/index.html index 621ff771eb3431b25e893aa4975770bec2e3be0a..abe99296d3faef6bc5cfb6aa9476399facb361af 100644 --- a/VIPSWeb/templates/index.html +++ b/VIPSWeb/templates/index.html @@ -47,10 +47,11 @@ latitude = parseFloat(storedMapSettings["latitude"]); zoomLevel = parseInt(storedMapSettings["zoomLevel"]); } + restoreSelectedCropCategoryIds(); // Init frontpage map. Depending on forecastmap.js. initForecastMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}"); cachePois(); - restoreSelectedCropIds(); + cacheMessages(); cacheObservations(); cachePrivateForecastSummaries(); @@ -83,10 +84,11 @@ <div id="cropList" class="mapBoxPlacement_{{settings.MAP_CROP_LIST_PLACEMENT}}"> <h3>{% trans "Crops" %}</h3> <ul class="cropList single"> - {% for crop_group in crop_groups %} + <!--ul--> + {% for crop_category in crop_categories %} <li> - <input type="checkbox" name="cropIds" id="cropIds_{{crop_group.crop_ids|slugify}}" value="{{crop_group.crop_ids}}" checked="checked" onchange="refreshForecasts({{settings.VIPS_ORGANIZATION_ID}},'{{settings.VIPSLOGIC_SERVER_NAME}}');storeSelectedCropIds();filterMessages();filterObservations();"/> - <label for="cropIds_{{crop_group.crop_ids|slugify}}"><span></span>{{ crop_group.name|safe }}</label> + <input type="checkbox" name="cropCategoryIds" id="cropCategoryIds_{{crop_category.crop_category_id}}" value="{{crop_category.crop_category_id}}" checked="checked" onchange="refreshForecasts({{settings.VIPS_ORGANIZATION_ID}},'{{settings.VIPSLOGIC_SERVER_NAME}}');storeSelectedCropCategoryIds();filterMessages();filterObservations();"/> + <label for="cropCategoryIds_{{crop_category.crop_category_id}}"><span></span>{{ crop_category.name|safe }}</label> </li> {% endfor %} </ul> diff --git a/VIPSWeb/templates/settings.js b/VIPSWeb/templates/settings.js index 87b2d20e537f3053dd6879dcb56f4f3bf27a12fc..93b7265b9489c4705dc79f79aa2e17115a66278c 100644 --- a/VIPSWeb/templates/settings.js +++ b/VIPSWeb/templates/settings.js @@ -19,5 +19,7 @@ var settings = { frontpageMessageTagIds: {{settings.FRONTPAGE_MESSAGE_TAG_IDS}}, - userUuid: {% if request.session.vips_logic_user == None %}null{% else %}"{{request.session.user_uuid}}"{% endif %} + userUuid: {% if request.session.vips_logic_user == None %}null{% else %}"{{request.session.user_uuid}}"{% endif %}, + + cropCategories : {{crop_categories|safe}} }; diff --git a/VIPSWeb/views.py b/VIPSWeb/views.py index 20c66b93545d4f8b4b6f0a029108e370ac00510a..9d9aa2c9dcca54ddd81e8650ebb647ff49eb5412 100644 --- a/VIPSWeb/views.py +++ b/VIPSWeb/views.py @@ -21,7 +21,7 @@ from django.http import HttpResponse, JsonResponse from django.conf import settings from django.utils import translation from vips_messages.models import Message, MessageTag -from organisms.models import CropGroup +from organisms.models import CropCategory def index(request): # Get front page categories. This is defined in local_settings.py @@ -29,13 +29,13 @@ def index(request): # Last 10 messages context = { 'message_tags': message_tags, - 'crop_groups': CropGroup.get_crop_groups(translation.get_language()) + 'crop_categories': CropCategory.get_crop_categories(translation.get_language()) } return render(request, 'index.html', context) # Serving settings for JavaScript def settings_js(request): - context = {} + context = {'crop_categories': CropCategory.get_crop_categories_from_vipslogic_as_text()} return render(request,'settings.js', context, content_type="application/javascript;charset=UTF-8") ## TODO: Is this being used??? diff --git a/organisms/models.py b/organisms/models.py index 40bf8e770574640807768601701e066ebf49c799..9f47030a25c3a1810e90707a714d4ed599282f16 100644 --- a/organisms/models.py +++ b/organisms/models.py @@ -20,28 +20,45 @@ import requests from django.conf import settings from django.utils import translation -class CropGroup: +class CropCategory: def __init__(self, - crop_group_id, + crop_category_id, name, crop_ids ): - self.crop_group_id = crop_group_id + self.crop_category_id = crop_category_id self.name = name self.crop_ids = crop_ids @staticmethod - def get_crop_groups(language): - crop_groups = [] - for item in settings.CROP_GROUPS: - crop_groups.append(CropGroup.get_instance_from_dict(item,language)) - return crop_groups + def get_crop_categories(language): + crop_categories = [] + for item in CropCategory.get_crop_categories_from_vipslogic_as_json(): + crop_categories.append(CropCategory.get_instance_from_dict(item,language)) + return crop_categories + + @staticmethod + def get_crop_categories_from_vipslogic(): + request_result = requests.get("http://%s/rest/organism/cropcategory/%s" % (settings.VIPSLOGIC_SERVER_NAME, settings.VIPS_ORGANIZATION_ID)) + return request_result + + @staticmethod + def get_crop_categories_from_vipslogic_as_json(): + return CropCategory.get_crop_categories_from_vipslogic().json() + + @staticmethod + def get_crop_categories_from_vipslogic_as_text(): + return CropCategory.get_crop_categories_from_vipslogic().text @staticmethod def get_instance_from_dict(dict,language): - return CropGroup(dict["crop_group_id"], - dict["name"].get(language,dict["name"]["en"]), - dict["crop_ids"] + local_name = dict["defaultName"] + for crop_category_local in dict["cropCategoryLocalSet"]: + if crop_category_local["cropCategoryLocalPK"]["locale"] == language: + local_name = crop_category_local["localName"] + return CropCategory(dict["cropCategoryId"], + local_name, + dict["cropOrganismIds"] )