21 changes: 10 additions & 11 deletions geonode/layers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
from geonode.maps.models import Map
from geonode.services.models import Service
from geonode.monitoring import register_event
from geonode.monitoring.models import EventType
from geonode.groups.models import GroupProfile
from geonode.security.views import _perms_info_json
from geonode.people.forms import ProfileForm, PocForm
Expand Down Expand Up @@ -1097,21 +1098,20 @@ def layer_metadata(
layer.metadata_author = new_author

new_keywords = layer_form.cleaned_data['keywords']
if new_keywords is not None:
layer.keywords.clear()
layer.keywords.add(*new_keywords)

new_regions = [x.strip() for x in layer_form.cleaned_data['regions']]
if new_regions is not None:
layer.regions.clear()
layer.regions.add(*new_regions)

layer.keywords.clear()
layer.keywords.add(*new_keywords)
layer.regions.clear()
layer.regions.add(*new_regions)
layer.category = new_category
layer.save()

up_sessions = UploadSession.objects.filter(layer=layer)
if up_sessions.count() > 0 and up_sessions[0].user != layer.owner:
up_sessions.update(user=layer.owner)

register_event(request, EventType.EVENT_CHANGE_METADATA, layer)
if not ajax:
return HttpResponseRedirect(
reverse(
Expand Down Expand Up @@ -1146,19 +1146,17 @@ def layer_metadata(
tkl = tk.keyword.filter(pk__in=tkeywords_ids)
if len(tkl) > 0:
tkeywords_to_add.append(tkl[0].keyword_id)
layer.tkeywords.clear()
layer.tkeywords.add(*tkeywords_to_add)
except BaseException:
tb = traceback.format_exc()
logger.error(tb)

layer.tkeywords.add(*tkeywords_to_add)
register_event(request, 'change_metadata', layer)
except BaseException:
tb = traceback.format_exc()
logger.error(tb)

return HttpResponse(json.dumps({'message': message}))

register_event(request, 'view_metadata', layer)
if settings.ADMIN_MODERATE_UPLOADS:
if not request.user.is_superuser:
layer_form.fields['is_published'].widget.attrs.update(
Expand Down Expand Up @@ -1209,6 +1207,7 @@ def layer_metadata(
[metadata_author_groups.append(item) for item in all_metadata_author_groups
if item not in metadata_author_groups]

register_event(request, 'view_metadata', layer)
return render(request, template, context={
"resource": layer,
"layer": layer,
Expand Down
202 changes: 200 additions & 2 deletions geonode/maps/templates/layouts/map_panels.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,205 @@
{% extends "layouts/panels.html" %}
{% load static from staticfiles %}
{% load floppyforms %}
{% load i18n %}
<!--<link href="{% static "lib/css/bootstrap-select.css" %}?v={{ VERSION }}" rel="stylesheet" />-->
<script type="text/javascript" src="{% static "geonode/js/utils/thumbnail.js" %}"></script>
<style>
/* general panel styles */
#mdeditor_form .panel-group .panel{
overflow: visible;
}
/* date fields proper sizes */
#mdeditor_form .input-group.date {
width: 100%;
}

/* resizable text-areas */
#mdeditor_form textarea {
resize: vertical;
height: 120px;
}

/* question mark (info) distance fom label*/
form #mdeditor_form label{
margin-right: 0.3em;
}
/* regions */
#regions_multiselect_container .fstElement {
width: 100%;
}
#regions_multiselect_container .fstChoiceItem {
background-color: #2c689c;
border: #2c689c;
}

#mdeditor_form .mandatory-hint,#mdeditor_form .advanced-hint {
cursor: pointer;
}

/* publishing checkboxes */
#mdeditor_form #id_resource-metadata_uploaded_preserve,
#mdeditor_form #id_resource-is_approved,
#mdeditor_form #id_resource-is_published,
#mdeditor_form #id_resource-featured {
float: right;
}

/* mosaiking checkboxes */
#mdeditor_form #id_resource-is_mosaic,
#mdeditor_form #id_resource-has_time,
#mdeditor_form #id_resource-has_elevation {
float: right;
}

/* keywords */
#mdeditor_form .tokenfield.form-control {
height: auto;
}

#mdeditor_form .thesauri_keywords label {
display: block;
}
#mdeditor_form span.autocomplete-light-widget {
width: 100%;
}
</style>
<style>
/* metadata edit workflow wizard */
.wizard--progress {
list-style: none;
margin: 0;
padding: 0;
display: table;
table-layout: fixed;
width: 100%;
color: #2c689c;
}
.wizard--progress > li {
position: relative;
display: table-cell;
text-align: center;
font-size: 0.8em;
}
.wizard--progress > li:hover {
cursor: pointer;
}
.wizard--progress > li:before {
transition: background 0.5s ease 0.1s;
box-shadow: 5px 5px 5px rgba(0,0,0,.5);
content: attr(data-step);
display: block;
margin: 0 auto;
background: #DFE3E4;
width: 3em;
height: 3em;
text-align: center;
margin-bottom: 0.25em;
line-height: 3em;
border-radius: 100%;
position: relative;
z-index: 1000;
}
.wizard--progress > li:after {
transition: background 1s ease, width 1s ease;
width: 0px;
box-shadow: 5px 5px 5px rgba(0,0,0,.5);
content: '';
position: absolute;
display: block;
background: #DFE3E4;
height: 0.5em;
top: 1.25em;
left: 50%;
margin-left: 1.5em\9;
z-index: -1;
}

.wizard--progress > li:last-child:after {
display: none;
}
.wizard--progress > li.is-complete {
color: #333333;
}
.wizard--progress > li.is-complete:before, .wizard--progress > li.is-complete:after {
color: #FFF;
background: #333333;
}
.wizard--progress > li.is-complete:before {
z-index: 1;
}
.wizard--progress > li.is-complete:after {
transition: background 1s ease, width 1s ease;
z-index: 0;
width: 100%;
}
.wizard--progress > li a {
color: #2c689c;
}
.wizard--progress > li.is-active {
color: #2c689c;
}
.wizard--progress > li.is-active:before {
color: #FFF;
background: #2c689c;
}

.wizard--progress > li.is-complete a {
color: #000;
}

/**
* Needed for IE8
*/
.wizard--progress__last:after {
display: none !important;
}

/**
* Size Extensions
*/
.wizard--progress--medium {
font-size: 1.5em;
}

.wizard--progress--large {
font-size: 2em;
}
.wizard--progress > li:before {
text-decoration: none;
}
.wizard--progress li:hover a{
text-decoration: underline;
}
.wizard--progress a, .wizard--progress a:hover:before {
text-decoration: none;
}

</style>

<style>
/* draggable table */
span.grippy {
content: '....';
width: 15px;
height: 26px;
display: inline-block;
overflow: hidden;
line-height: 5px;
padding: 3px 4px;
cursor: move;
vertical-align: middle;

font-size: 12px;
font-family: sans-serif;
letter-spacing: 2px;
color: #cccccc;
text-shadow: 1px 0 1px black;
}
span.grippy::after {
content: '.. .. .. ..';
}
</style>
<button class="btn btn-success metadata-edit-done" id="btn_upd_md_done" type="submit" style="float:right; opacity: 0;" >{% trans "Done!" %}</button>
{% block body_outer %}
<ul id="md_tabs" class="nav nav-tabs">
<li id="metadata_edit_tab" class="active">
Expand Down Expand Up @@ -88,7 +286,7 @@
</div>
<div class="col-lg-5">
<div class="col-lg-12">
<span><label for="{{ layer_form.date_type|id }}">{{ layer_form.keywords.label }}</label></span>
<span><label for="{{ map_form.date_type|id }}">{{ map_form.keywords.label }}</label></span>
{{ map_form.keywords }}
</div>
{% if THESAURI_FILTERS %}
Expand Down
81 changes: 73 additions & 8 deletions geonode/maps/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import math
import logging
import urlparse
import traceback
from itertools import chain

from guardian.shortcuts import get_perms
Expand Down Expand Up @@ -63,8 +64,10 @@
check_ogc_backend)
from geonode.maps.forms import MapForm
from geonode.security.views import _perms_info_json
from geonode.base.forms import CategoryForm
from geonode.base.models import TopicCategory
from geonode.base.forms import CategoryForm, TKeywordForm
from geonode.base.models import (
Thesaurus,
TopicCategory)
from geonode import geoserver, qgis_server
from geonode.groups.models import GroupProfile
from geonode.documents.models import get_related_documents
Expand Down Expand Up @@ -206,12 +209,42 @@ def map_metadata(
category_form = CategoryForm(request.POST, prefix="category_choice_field", initial=int(
request.POST["category_choice_field"]) if "category_choice_field" in request.POST and
request.POST["category_choice_field"] else None)
tkeywords_form = TKeywordForm(
prefix="tkeywords",
initial={'tkeywords': request.POST.getlist('tkeywords-tkeywords')})
else:
map_form = MapForm(instance=map_obj, prefix="resource")
category_form = CategoryForm(
prefix="category_choice_field",
initial=topic_category.id if topic_category else None)

# Keywords from THESAURUS management
map_tkeywords = map_obj.tkeywords.all()
tkeywords_list = ''
lang = 'en' # TODO: use user's language
if map_tkeywords and len(map_tkeywords) > 0:
tkeywords_ids = map_tkeywords.values_list('id', flat=True)
if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
el = settings.THESAURUS
thesaurus_name = el['name']
try:
t = Thesaurus.objects.get(identifier=thesaurus_name)
for tk in t.thesaurus.filter(pk__in=tkeywords_ids):
tkl = tk.keyword.filter(lang=lang)
if len(tkl) > 0:
tkl_ids = ",".join(
map(str, tkl.values_list('id', flat=True)))
tkeywords_list += "," + \
tkl_ids if len(
tkeywords_list) > 0 else tkl_ids
except BaseException:
tb = traceback.format_exc()
logger.error(tb)

tkeywords_form = TKeywordForm(
prefix="tkeywords",
initial={'tkeywords': tkeywords_list})

if request.method == "POST" and map_form.is_valid(
) and category_form.is_valid():
new_poc = map_form.cleaned_data['poc']
Expand Down Expand Up @@ -252,12 +285,10 @@ def map_metadata(
map_obj.metadata_author = new_author
map_obj.title = new_title
map_obj.abstract = new_abstract
if new_keywords:
map_obj.keywords.clear()
map_obj.keywords.add(*new_keywords)
if new_regions:
map_obj.regions.clear()
map_obj.regions.add(*new_regions)
map_obj.keywords.clear()
map_obj.keywords.add(*new_keywords)
map_obj.regions.clear()
map_obj.regions.add(*new_regions)
map_obj.category = new_category
map_obj.save()

Expand All @@ -272,6 +303,39 @@ def map_metadata(

message = map_obj.id

try:
# Keywords from THESAURUS management
tkeywords_to_add = []
tkeywords_cleaned = tkeywords_form.clean()
if tkeywords_cleaned and len(tkeywords_cleaned) > 0:
tkeywords_ids = []
for i, val in enumerate(tkeywords_cleaned):
try:
cleaned_data = [value for key, value in tkeywords_cleaned[i].items(
) if 'tkeywords' in key.lower() and 'autocomplete' not in key.lower()]
tkeywords_ids.extend(map(int, cleaned_data[0]))
except BaseException:
pass

if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
el = settings.THESAURUS
thesaurus_name = el['name']
try:
t = Thesaurus.objects.get(
identifier=thesaurus_name)
for tk in t.thesaurus.all():
tkl = tk.keyword.filter(pk__in=tkeywords_ids)
if len(tkl) > 0:
tkeywords_to_add.append(tkl[0].keyword_id)
map_obj.tkeywords.clear()
map_obj.tkeywords.add(*tkeywords_to_add)
except BaseException:
tb = traceback.format_exc()
logger.error(tb)
except BaseException:
tb = traceback.format_exc()
logger.error(tb)

return HttpResponse(json.dumps({'message': message}))

# - POST Request Ends here -
Expand Down Expand Up @@ -342,6 +406,7 @@ def map_metadata(
"poc_form": poc_form,
"author_form": author_form,
"category_form": category_form,
"tkeywords_form": tkeywords_form,
"layers": layers,
"preview": getattr(settings, 'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY', 'geoext'),
"crs": getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:3857'),
Expand Down