Commit 1e85c92c authored by Renán Sosa Guillen's avatar Renán Sosa Guillen

GeoInt_SIDT

parent 17d13bec
......@@ -46,15 +46,14 @@ class Product_l2a(models.Model):
class CartProduct(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
add_date = models.DateTimeField(auto_now=True)
prod_uuid = models.CharField(max_length=50)
prod_num = models.IntegerField()
prod_l1c = models.ForeignKey(Product_l1c, on_delete=models.CASCADE, null=True)
purchased = models.NullBooleanField()
class Purchase(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
pur_date = models.DateTimeField(auto_now=True) ## transaction date
prod_list = models.ManyToManyField(Product_l1c)
user = models.ForeignKey(User, on_delete=models.CASCADE)
aggreg_date = models.DateTimeField(auto_now=True) ## date of product aggregation
uuid = models.CharField(max_length=50)
info = models.TextField(null=True)
purchased = models.NullBooleanField()
# class Purchase(models.Model):
# user = models.ForeignKey(User, on_delete=models.CASCADE)
# pur_date = models.DateTimeField(auto_now=True) ## transaction date
# prod_list = models.ManyToManyField(Product_l1c)
......@@ -330,9 +330,14 @@ div .menu-info h4 {
/*padding-left: 58%;*/
/*}*/
div #product-list-globe,
div #product-list-globe {
max-height: 773px;
overflow: auto;
}
div #product-list-cart-items {
max-height: 500px;
max-height: 700px;
max-width: 207px;
overflow: auto;
}
......
......@@ -2,11 +2,12 @@
// Script for managing data with javascript
// ------------------------------------------
var OPT_LIST_IS_HIDDEN = true;
var INPUT_ON_FOCUS = false;
var OPT_LIST_IS_HIDDEN = true;
var INPUT_ON_FOCUS = false;
var product_list = [];
var PRODUCT_COUNTER = 0;
var IS_PRODUCT_CONTAINER = false;
var polygonList;
var product_list = [];
var PRODUCT_COUNTER = 0;
var makeRequest = function (value) {
var pol_element = document.getElementById('polygon-list');
......@@ -60,16 +61,16 @@ function drawPolygon(element) {
osmap.removePolygon();
// draw wkt polygon
osmap.addWKTPolygon(polygon.wkt_polygon)
// osmap.addWKTPolygon(polygon.wkt_polygon);
// format coords to draw
// var coords = osmap.formatCoords(polygon.geojson.geometry.coordinates);
var coords = osmap.formatCoords(polygon.geojson.geometry.coordinates);
// get the biggest area
// var biggest = osmap.getBiggestPolygon(coords);
var biggest = osmap.getBiggestPolygon(coords);
// draw coordsR
// osmap.addPolygon(biggest);
osmap.addPolygon(biggest);
}
})
}
......@@ -83,7 +84,7 @@ $("#id_polygon").on('keyup', function (e) {
polygon = $('#id_polygon').val();
osmap.removePolygon();
osmap.addWKTPolygon(polygon)
osmap.addWKTPolygon(polygon);
}
});
......@@ -101,12 +102,28 @@ function erase_product_list_globe_by_id(element_id) {
var prevfeature = null;
function drawApiResponse(element) {
product_list.catalog.forEach(function (data) {
if (data.id === element.id.replace("-h4", '')) {
var list_globe = document.getElementById('product-list-globe').children;
for(var i=0; i<product_list.catalog.length; i++) {
var data = product_list.catalog[i];
list_globe[i].style.textDecoration = 'none';
if (data.uuid === element.id.replace("-h4", '')) {
// osmap.removePolygon();
prevfeature = osmap.addfootprint(data.product.footprint, prevfeature);
list_globe[i].style.textDecoration = 'underline';
prevfeature = osmap.addfootprint(data.product.footprint, prevfeature);
}
})
}
}
function createProductContainer() {
var temp_1 = document.querySelector('#product_cart_1');
// filling template
temp_1.content.querySelector('span').textContent = "Product";
var clone_1 = document.importNode(temp_1.content, true);
document.querySelector('#product-list-cart').appendChild(clone_1);
}
......@@ -148,10 +165,11 @@ $(document).ready(function () {
var pol_element = document.getElementById('polygon-list');
var typingTimer;
var typingInterval = 800; //milliseconds
var productListPrev = [];
var productListGlobe = [];
var productListCart = []; // this array represent DB where products will be stored
var typingInterval = 800; //milliseconds
var productListPrev = [];
var productListGlobe = [];
var cartProductList = []; // this array represent DB where products will be stored
var productUUIDListCart = [];
// On keyup, start the contdown
$('#ajax-input').on('input', function () {
......@@ -226,11 +244,11 @@ $(document).ready(function () {
var temp = document.querySelector('#product_list_template');
// filling template
temp.content.querySelector('li').id = data.id;
temp.content.querySelector('h4').id = data.id + "-h4";
temp.content.querySelector('li').id = data.uuid;
temp.content.querySelector('h4').id = data.uuid + "-h4";
temp.content.querySelector('h4').textContent = data.product.producttype + "_" + data.product.tileid;
temp.content.querySelector('p').textContent = data.product.beginposition;
temp.content.querySelector('input').value = data.id;
temp.content.querySelector('input').value = data.uuid;
temp.content.querySelector('img').src = "data:image/jpeg;base64, " + data.img;
temp.content.querySelectorAll('span')[1].textContent = data.product.identifier;
temp.content.querySelectorAll('span')[2].textContent = data.product.size;
......@@ -262,92 +280,187 @@ $(document).ready(function () {
// agrega producto al carrito
$('#product-to-cart-form').submit(function (event) {
var submit_data = $('#product-to-cart-form').serialize();
// $('#product-to-cart-form').submit(function (event) {
// var submit_data = $('#product-to-cart-form').serialize();
event.preventDefault();
// event.preventDefault();
// erase_product_list_globe();
// // erase_product_list_globe();
console.log("Submitted data:", typeof(submit_data));
console.log("Submitted data:", submit_data);
// console.log("Submitted data:", typeof(submit_data));
// console.log("Submitted data:", submit_data);
var submit_data_array = submit_data.split("&product_selected=");
// var submit_data_array = submit_data.split("&product_selected=");
PRODUCT_COUNTER += 1; // this variable counts the number of products in shopping cart
PRODUCT_COUNTER_STR = PRODUCT_COUNTER.toString();
// PRODUCT_COUNTER += 1; // this variable counts the number of products in shopping cart
// PRODUCT_COUNTER_STR = PRODUCT_COUNTER.toString();
var temp_1 = document.querySelector('#product_cart_1');
var prod_id = temp_1.content.querySelectorAll('ul')[1].id + "-" + PRODUCT_COUNTER_STR;
// var temp_1 = document.querySelector('#product_cart_1');
// var prod_id = temp_1.content.querySelectorAll('ul')[1].id + "-" + PRODUCT_COUNTER_STR;
// filling template
temp_1.content.querySelector('span').textContent = "Product " + PRODUCT_COUNTER_STR;
temp_1.content.querySelectorAll('ul')[1].id = prod_id;
// // filling template
// temp_1.content.querySelector('span').textContent = "Product " + PRODUCT_COUNTER_STR;
// temp_1.content.querySelectorAll('ul')[1].id = prod_id;
// var clone_1 = document.importNode(temp_1.content, true);
// document.querySelector('#product-list-cart').appendChild(clone_1);
// // var div_top = 148;
// console.log("djdj: ", productListGlobe);
// productListGlobe.forEach(function (data) {
// if (submit_data_array.indexOf(data.uuid) > -1) {
// console.log("DATA sí esta: ", data.uuid);
// console.log("SS: ", data.product.size);
// productListCart.push(data.product);
// // productListCart.push(data.id);
// erase_product_list_globe_by_id(data.uuid);
// var temp_2 = document.querySelector('#product_cart_2');
// // filling template
// temp_2.content.querySelector('li').id = data.uuid;
// temp_2.content.querySelector('h4').id = data.uuid + "-h4";
// temp_2.content.querySelector('h4').textContent = data.product.producttype + "_" + data.product.tileid;
// temp_2.content.querySelector('p').textContent = data.product.beginposition;
// temp_2.content.querySelector('img').src = "data:image/jpeg;base64, " + data.img;
// temp_2.content.querySelectorAll('span')[1].textContent = data.product.identifier;
// temp_2.content.querySelectorAll('span')[2].textContent = data.product.size;
// temp_2.content.querySelectorAll('span')[3].textContent = data.product.instrumentname;
// var clone_2 = document.importNode(temp_2.content, true);
// document.querySelector('#' + prod_id).appendChild(clone_2);
// // request para guardado de producto en carrito
// //variable prod_cart_url en map.html
// // $.ajax({
// // type : 'POST',
// // url : prod_cart_url,
// // data : {
// // 'csrfmiddlewaretoken' : document.getElementsByName('csrfmiddlewaretoken')[0].value,
// // 'product' : JSON.stringify(data.product),
// // 'product_num' : PRODUCT_COUNTER_STR
// // },
// // dataType : 'json'
// // });
// }
// });
// });
// agrega producto al carrito
$('#product-to-cart-form').submit(function (event) {
var submit_data = $('#product-to-cart-form').serialize();
var clone_1 = document.importNode(temp_1.content, true);
document.querySelector('#product-list-cart').appendChild(clone_1);
event.preventDefault();
// var div_top = 148;
console.log("Submitted data:", typeof(submit_data));
console.log("Submitted data:", submit_data);
var submit_data_array = submit_data.split("&product_selected=");
console.log("djdj: ", productListGlobe);
productListGlobe.forEach(function (data) {
if (submit_data_array.indexOf(data.id) > -1) {
console.log("DATA sí esta: ", data.id);
if (submit_data_array.indexOf(data.uuid) > -1) {
console.log("DATA sí esta: ", data.uuid);
console.log("SS: ", data.product.size);
productListCart.push(data.product);
// productListCart.push(data.id);
erase_product_list_globe_by_id(data.id);
var temp_2 = document.querySelector('#product_cart_2');
// filling template
temp_2.content.querySelector('li').id = data.id;
temp_2.content.querySelector('h4').id = data.id + "-h4";
temp_2.content.querySelector('h4').textContent = data.product.producttype + "_" + data.product.tileid;
temp_2.content.querySelector('p').textContent = data.product.beginposition;
temp_2.content.querySelector('img').src = "data:image/jpeg;base64, " + data.img;
temp_2.content.querySelectorAll('span')[1].textContent = data.product.identifier;
temp_2.content.querySelectorAll('span')[2].textContent = data.product.size;
temp_2.content.querySelectorAll('span')[3].textContent = data.product.instrumentname;
var clone_2 = document.importNode(temp_2.content, true);
document.querySelector('#' + prod_id).appendChild(clone_2);
// guardado de producto en carrito
//variable prod_cart_url en map.html
// $.ajax({
// type : 'POST',
// url : prod_cart_url,
// data : {
// 'csrfmiddlewaretoken' : document.getElementsByName('csrfmiddlewaretoken')[0].value,
// 'product' : JSON.stringify(data.product),
// 'product_num' : PRODUCT_COUNTER_STR
// },
// dataType : 'json'
// });
cartProductList.push({
'uuid' : data.uuid,
'info' : {
'producttype' : data.product.producttype,
'tileid' : data.product.tileid,
'beginposition' : data.product.beginposition,
'img' : data.img,
'identifier' : data.product.identifier,
'size' : data.product.size,
'instrumentname' : data.product.instrumentname
}
});
productUUIDListCart.push(data.uuid);
erase_product_list_globe_by_id(data.uuid);
}
});
});
// genera la compra del producto
$('#purchased-product-form').submit(function (event) {
var submit_data = $('#purchased-product-form').serialize();
event.preventDefault();
console.log("Submitted data:", typeof(submit_data));
console.log("Submitted data:", submit_data);
// request para guardado de producto en carrito
// variable prod_cart_url en map.html
$.ajax({
type : 'POST',
url : purch_prod_url,
url : prod_cart_url,
data : {
'csrfmiddlewaretoken' : document.getElementsByName('csrfmiddlewaretoken')[0].value,
'product_list' : JSON.stringify(productListCart)
'cart_product_list' : JSON.stringify(cartProductList)
},
dataType : 'json'
success: function () {
cartProductList = [];
// PRODUCT_COUNTER += 1; // this variable counts the number of products in shopping cart
// PRODUCT_COUNTER_STR = PRODUCT_COUNTER.toString();
// var temp_1 = document.querySelector('#product_cart_1');
// var prod_id = temp_1.content.querySelectorAll('ul')[1].id + "-" + PRODUCT_COUNTER_STR;
// // filling template
// temp_1.content.querySelector('span').textContent = "Product " + PRODUCT_COUNTER_STR;
// temp_1.content.querySelectorAll('ul')[1].id = prod_id;
// var clone_1 = document.importNode(temp_1.content, true);
// document.querySelector('#product-list-cart').appendChild(clone_1);
if (!IS_PRODUCT_CONTAINER) {
createProductContainer();
IS_PRODUCT_CONTAINER = true;
}
// request a DB para mostrar los productos en el carrito
// variable prod_from_cartDB_url en map.html
$.ajax({
type : 'POST',
url : prod_from_cartDB_url,
data : {
'csrfmiddlewaretoken' : document.getElementsByName('csrfmiddlewaretoken')[0].value,
'product_uuid_list' : productUUIDListCart.toString()
},
dataType : 'json',
success : function (data) {
productUUIDListCart = [];
data.product_list.forEach(function (product) {
var temp_2 = document.querySelector('#product_cart_2');
// filling template
temp_2.content.querySelector('li').id = product.uuid;
temp_2.content.querySelector('h4').id = product.uuid + "-h4";
temp_2.content.querySelector('h4').textContent = product.info.producttype + "_" + product.info.tileid;
temp_2.content.querySelector('p').textContent = product.info.beginposition;
temp_2.content.querySelector('img').src = "data:image/jpeg;base64, " + product.info.img;
temp_2.content.querySelectorAll('span')[1].textContent = product.info.identifier;
temp_2.content.querySelectorAll('span')[2].textContent = product.info.size;
temp_2.content.querySelectorAll('span')[3].textContent = product.info.instrumentname;
var clone_2 = document.importNode(temp_2.content, true);
document.querySelector('#product-list-cart-items').appendChild(clone_2);
// document.querySelector('#' + prod_id).appendChild(clone_2);
});
}
});
}
});
});
// genera la compra del producto
// $('#purchased-product-form').submit(function (event) {
// var submit_data = $('#purchased-product-form').serialize();
// event.preventDefault();
// console.log("Submitted data:", typeof(submit_data));
// console.log("Submitted data:", submit_data);
// $.ajax({
// type : 'POST',
// url : purch_prod_url,
// data : {
// 'csrfmiddlewaretoken' : document.getElementsByName('csrfmiddlewaretoken')[0].value,
// 'product_list' : JSON.stringify(productListCart)
// },
// dataType : 'json'
// });
// });
});
......@@ -212,7 +212,8 @@ OpenStreetMapsClass.prototype.formatCoords = function(coords)
OpenStreetMapsClass.prototype.showCoords = function(geometry)
{
var wkt = new ol.format.WKT();
document.getElementById("id_polygon").value = wkt.writeGeometry(geometry.clone().transform( 'EPSG:3857', 'EPSG:4326'));
var wkt_polygon = wkt.writeGeometry(geometry.clone().transform( 'EPSG:3857', 'EPSG:4326'));
document.getElementById("id_polygon").value = wkt_polygon;
}
//------------------------------------------------------------------------------
/**
......
......@@ -250,10 +250,10 @@
osmap.geolocation();
osmap.addInteraction();
var req_url = "{% url 'search-submit' %}"; // url for requesting polygon data
var prod_req_url = "{% url 'productList' %}" // url for requesting product data
var img_req_url = "{% url 'img-rqst' %}" // url for requesting preview image
var prod_cart_url = "{% url 'cart-rqst' %}" // url for requesting product saving in cart
var purch_prod_url = "{% url 'purch-rqst' %}" // url for requesting product purschase
var req_url = "{% url 'search-submit' %}"; // url for requesting polygon data
var prod_req_url = "{% url 'productList' %}" // url for requesting product data
var img_req_url = "{% url 'img-rqst' %}" // url for requesting preview image
var prod_cart_url = "{% url 'cart-rqst' %}" // url for requesting product saving in cart
var prod_from_cartDB_url = "{% url 'from-cart-rqst' %}" // url for requesting product from cart table in DB
</script>
{% endblock %}
......@@ -26,7 +26,7 @@
<a href="javascript:void(0)">
<i class="menu-icon glyphicon glyphicon-bookmark bg-red"></i>
<div class="menu-info">
<h4 id="" class="control-sidebar-subheading" onclick="drawApiResponse(this)"></h4>
<h4 id="" class="control-sidebar-subheading" onclick="drawApiResponse(this);"></h4>
<p></p>
<input type="checkbox" name="product_selected" value="" checked>
</div>
......
......@@ -10,6 +10,6 @@ urlpatterns = [
url(r'^searchsubmit/$', views.SearchSubmitView.as_view(), name='search-submit'),
url(r'^imgrequest/$', views.requestToImage, name='img-rqst'),
url(r'^cartrequest/$', views.saveInCart, name='cart-rqst'),
url(r'^purchrequest/$', views.purchaseProduct, name='purch-rqst')
url(r'^fromcartrqst/$', views.getFromCart, name='from-cart-rqst')
]
......@@ -2,7 +2,7 @@
from __future__ import unicode_literals
from django.shortcuts import render
from catalog.forms import ASFSearchForm
from catalog.models import Polygon, CartProduct, Product_l1c, Purchase
from catalog.models import Polygon, CartProduct, Product_l1c
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.urls import reverse
from django.views.generic.base import View
......@@ -11,11 +11,10 @@ from django.contrib.auth.models import User
from django.core import management
from urllib import urlencode
from collections import OrderedDict
import requests, json, unicodedata, sys
import base64
import requests, json, unicodedata, sys, base64
sys.path.append('../')
from geosentinel import APISentinel
from geosentinel import APISentinel, polygonToBox
sentinel = APISentinel.APISentinel('emmhp', 'geoemm29')
......@@ -71,13 +70,17 @@ def productList(request):
# if cloud_percentage.strip():
# params['cloudcoverpercentage'] = cloud_percentage
params['cloudcoverpercentage'] = cloud_percentage
## getting the bounding box of the polygon
pol_bbox = polygonToBox.getWKTPolygonBoundingBox(area, True)
products = sentinel.getProducts(area, date, params)
## requesting producto to sentinel api
products = sentinel.getProducts(pol_bbox, date, params)
## path from image preview storage location
img_preview = '/static/images/sat_preview/sat_test.jpg'
# se crea una lista de objetos del catalogo
## se crea una lista de objetos del catalogo
catalog = []
for p in products:
# img_link = products[p]['link_icon']
......@@ -89,11 +92,12 @@ def productList(request):
'end_date' : end_date,
'cloud_percentage' : cloud_percentage,
'product' : products[p],
'id' : products[p]['uuid'],
'uuid' : products[p]['uuid'],
'img' : img_preview
})
return JsonResponse({'catalog': catalog});
# return HttpResponse(status=204)
#-------------------------------------------------------------------------------
class SearchSubmitView(View):
......@@ -151,83 +155,107 @@ def regionSearched(request):
#-------------------------------------------------------------------------------
def saveInCart(request):
"""
Saves product in cart DB
Saves product in cart table in DB
"""
user = User.objects.filter(id=request.user.id)[0]
product = json.loads(request.POST['product'])
product_num = int(request.POST['product_num'])
# print json.dumps(product, indent=3, sort_keys=True)
cartProd = CartProduct(
user = user,
prod_uuid = product['uuid'],
prod_num = product_num,
purchased = False
)
cartProd.save()
user = User.objects.get(id=request.user.id)
product_list = json.loads(request.POST['cart_product_list'])
for product in product_list:
p_uuid = product['uuid']
p_info = product['info']
PRODUCT_EXISTS = CartProduct.objects.filter(uuid=p_uuid, user=user).exists()
if not PRODUCT_EXISTS:
cartProd = CartProduct(
user = user,
uuid = p_uuid,
info = json.dumps(p_info, indent=3, sort_keys=True, ensure_ascii=True),
purchased = False
)
cartProd.save()
return HttpResponse(status=204)
#-------------------------------------------------------------------------------
def purchaseProduct(request):
def getFromCart(request):
"""
For now to purchase a product consists in downloading L1C products and saving them in DB.
Temporarily gets product from cart table based on uuid porperty to show in cart section
"""
################# DEFINE PATH ##########################
prod_dir = 'my_path'
########################################################
products_to_download = {
'uuid' : [],
'id' : []
}
user = User.objects.filter(id=request.user.id)[0]
prod_purchased = json.loads(request.POST['product_list'])
# prod_purchased = ['S2B_MSIL1C_20171226T162659_N0206_R040_T16QBJ_20171226T212212', 'S2B_MSIL1C_20180326T161909_N0206_R040_T15QZD_20180326T195757']
for p in prod_purchased:
p_uuid = p['uuid']
p_identifier = p['identifier']
PRODUCT_EXISTS = Product_l1c.objects.filter(uuid=p_uuid).exists()
if not PRODUCT_EXISTS:
products_to_download['uuid'].append(p_uuid)
products_to_download['id'].append(p_identifier)
user = User.objects.get(id=request.user.id)
prod_uuid_list = request.POST['product_uuid_list'].split(",")
prod_list = []
for prod_uuid in prod_uuid_list:
product = CartProduct.objects.filter(uuid=prod_uuid, user=user).first()
prod_list.append({
'uuid' : product.uuid,
'info' : json.loads(product.info)
})
return JsonResponse({'product_list': prod_list})
#-------------------------------------------------------------------------------
# def purchaseProduct(request):
# """
# For now to purchase a product consists in downloading L1C products and saving them in DB.
# """
# ################# DEFINE PATH ##########################
# prod_dir = 'my_path'
# ########################################################
# products_to_download = {
# 'uuid' : [],
# 'id' : []
# }
# user = User.objects.get(id=request.user.id)
# prod_purchased = json.loads(request.POST['product_list'])
# # prod_purchased = ['S2B_MSIL1C_20171226T162659_N0206_R040_T16QBJ_20171226T212212', 'S2B_MSIL1C_20180326T161909_N0206_R040_T15QZD_20180326T195757']
# for p in prod_purchased:
# p_uuid = p['uuid']
# p_identifier = p['identifier']
# PRODUCT_EXISTS = Product_l1c.objects.filter(uuid=p_uuid).exists()
# if not PRODUCT_EXISTS:
# products_to_download['uuid'].append(p_uuid)
# products_to_download['id'].append(p_identifier)
# print json.dumps(p, indent=3, sort_keys=True)
# # print json.dumps(p, indent=3, sort_keys=True)
## Saves data to DB using populate_products_l1c command ##
management.call_command('populate_products_l1c', file_path=prod_dir, products_list=products_to_download['id'])
# ## Saves data to DB using populate_products_l1c command ##
# management.call_command('populate_products_l1c', file_path=prod_dir, products_list=products_to_download['id'])
## Register of user purchase ##
purch = Purchase(user=user)
purch.save()
# ## Register of user purchase ##
# purch = Purchase(user=user)
# purch.save()
for p_uuid in products_to_download['uuid']:
prod_l1c = Product_l1c.objects.get(uuid=p_uuid)
purch.prod_list.add(prod_l1c)
# for p_uuid in products_to_download['uuid']:
# prod_l1c = Product_l1c.objects.get(uuid=p_uuid)
# purch.prod_list.add(prod_l1c)
### TODO: Download products somewhere .. ###
# sentinel.downloadProducts(products, prod_dir)
# ### TODO: Download products somewhere .. ###
# # sentinel.downloadProducts(products, prod_dir)
### After that the code below is executed ###
# purch = Purchase(user=user)
# purch.save()
# ### After that the code below is executed ###
# # purch = Purchase(user=user)
# # purch.save()
# # for prod_uuid in prod_purchased:
# for prod_id in prod_purchased:
# # prod_l1c = Product_l1c.objects.get(uuid=prod_uuid)
# prod_l1c = Product_l1c.objects.get(identifier=prod_id)
# print prod_l1c
# purch.prod_list.add(prod_l1c)
# # # for prod_uuid in prod_purchased:
# # for prod_id in prod_purchased:
# # # prod_l1c = Product_l1c.objects.get(uuid=prod_uuid)
# # prod_l1c = Product_l1c.objects.get(identifier=prod_id)
# # print prod_l1c
# # purch.prod_list.add(prod_l1c)
return HttpResponse(status=204)
# return HttpResponse(status=204)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment