def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": if layer.metadata_uploaded_preserve: # layer metadata cannot be edited out = { 'success': False, 'errors': METADATA_UPLOADED_PRESERVE_ERROR } return HttpResponse( json.dumps(out), content_type='application/json', status=400) layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc is None: poc_form = ProfileForm( request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.is_valid(): if len(poc_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = poc_form._errors.setdefault('profile', ErrorList()) errors.append(_('You must set a point of contact for this resource')) poc = None if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.is_valid(): if len(author_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = author_form._errors.setdefault('profile', ErrorList()) errors.append(_('You must set an author for this resource')) metadata_author = None if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: new_keywords = layer_form.cleaned_data['keywords'] layer.keywords.clear() layer.keywords.add(*new_keywords) the_layer = layer_form.save() up_sessions = UploadSession.objects.filter(layer=the_layer.id) if up_sessions.count() > 0 and up_sessions[0].user != the_layer.owner: up_sessions.update(user=the_layer.owner) the_layer.poc = new_poc the_layer.metadata_author = new_author Layer.objects.filter(id=the_layer.id).update( category=new_category ) if getattr(settings, 'SLACK_ENABLED', False): try: from geonode.contrib.slack.utils import build_slack_message_layer, send_slack_messages send_slack_messages(build_slack_message_layer("layer_edit", the_layer)) except: print "Could not send slack message." return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) if poc is not None: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author is not None: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response(template, RequestContext(request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, }))
def layer_metadata(request, layername, template='layers/layer_metadata.html', ajax=True): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author # assert False, str(layer_bbox) config = layer.attribute_config() # Add required parameters for GXP lazy-loading layer_bbox = layer.bbox bbox = [float(coord) for coord in list(layer_bbox[0:4])] config["srs"] = getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') config["bbox"] = bbox if config["srs"] != 'EPSG:900913' \ else llbbox_to_mercator([float(coord) for coord in bbox]) config["title"] = layer.title config["queryable"] = True if layer.storeType == "remoteStore": service = layer.service source_params = { "ptype": service.ptype, "remote": True, "url": service.base_url, "name": service.name} maplayer = GXPLayer( name=layer.typename, ows_url=layer.ows_url, layer_params=json.dumps(config), source_params=json.dumps(source_params)) else: maplayer = GXPLayer( name=layer.typename, ows_url=layer.ows_url, layer_params=json.dumps(config)) # Update count for popularity ranking, # but do not includes admins or resource owners if request.user != layer.owner and not request.user.is_superuser: Layer.objects.filter( id=layer.id).update(popular_count=F('popular_count') + 1) # center/zoom don't matter; the viewer will center on the layer bounds map_obj = GXPMap(projection=getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913')) NON_WMS_BASE_LAYERS = [ la for la in default_map_config(request)[1] if la.ows_url is None] if request.method == "POST": if layer.metadata_uploaded_preserve: # layer metadata cannot be edited out = { 'success': False, 'errors': METADATA_UPLOADED_PRESERVE_ERROR } return HttpResponse( json.dumps(out), content_type='application/json', status=400) layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) tkeywords_form = TKeywordForm( request.POST, prefix="tkeywords") else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) # Keywords from THESAURI management layer_tkeywords = layer.tkeywords.all() tkeywords_list = '' lang = 'en' # TODO: use user's language if layer_tkeywords and len(layer_tkeywords) > 0: tkeywords_ids = layer_tkeywords.values_list('id', flat=True) if hasattr(settings, 'THESAURI'): for el in settings.THESAURI: 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: tb = traceback.format_exc() logger.error(tb) tkeywords_form = TKeywordForm( prefix="tkeywords", initial={'tkeywords': tkeywords_list}) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid() and tkeywords_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] if new_poc is None: if poc is None: poc_form = ProfileForm( request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.is_valid(): if len(poc_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = poc_form._errors.setdefault('profile', ErrorList()) errors.append(_('You must set a point of contact for this resource')) poc = None if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.is_valid(): if len(author_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = author_form._errors.setdefault('profile', ErrorList()) errors.append(_('You must set an author for this resource')) metadata_author = None if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: # layer.poc = new_poc # layer.metadata_author = new_author new_keywords = [x.strip() for x in layer_form.cleaned_data['keywords']] layer.keywords.clear() layer.keywords.add(*new_keywords) try: the_layer = layer_form.save() except: tb = traceback.format_exc() if tb: logger.debug(tb) the_layer = layer up_sessions = UploadSession.objects.filter(layer=the_layer.id) if up_sessions.count() > 0 and up_sessions[0].user != the_layer.owner: up_sessions.update(user=the_layer.owner) Layer.objects.filter(id=the_layer.id).update( category=new_category ) if getattr(settings, 'SLACK_ENABLED', False): try: from geonode.contrib.slack.utils import build_slack_message_layer, send_slack_messages send_slack_messages(build_slack_message_layer("layer_edit", the_layer)) except: print "Could not send slack message." if not ajax: return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) message = layer.typename try: # Keywords from THESAURI 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-tkeywords' in key.lower() and 'autocomplete' not in key.lower()] tkeywords_ids.extend(map(int, cleaned_data[0])) except: pass if hasattr(settings, 'THESAURI'): for el in settings.THESAURI: 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) except: tb = traceback.format_exc() logger.error(tb) layer.tkeywords.add(*tkeywords_to_add) except: tb = traceback.format_exc() logger.error(tb) return HttpResponse(json.dumps({'message': message})) if poc is not None: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True else: poc_form = ProfileForm(prefix="poc") poc_form.hidden = False if metadata_author is not None: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True else: author_form = ProfileForm(prefix="author") author_form.hidden = False if 'access_token' in request.session: access_token = request.session['access_token'] else: u = uuid.uuid1() access_token = u.hex viewer = json.dumps( map_obj.viewer_json(request.user, access_token, * (NON_WMS_BASE_LAYERS + [maplayer]))) metadataxsl = False if "geonode.contrib.metadataxsl" in settings.INSTALLED_APPS: metadataxsl = True return render_to_response(template, RequestContext(request, { "resource": layer, "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, "tkeywords_form": tkeywords_form, "viewer": viewer, "preview": getattr(settings, 'LAYER_PREVIEW_LIBRARY', 'leaflet'), "crs": getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913'), "metadataxsl": metadataxsl }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc is None: poc_form = ProfileForm( request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: the_layer = layer_form.save() the_layer.poc = new_poc the_layer.metadata_author = new_author the_layer.keywords.clear() the_layer.keywords.add(*new_keywords) the_layer.category = new_category the_layer.save() return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) if poc is None: poc_form = ProfileForm(instance=poc, prefix="poc") else: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author is None: author_form = ProfileForm(instance=metadata_author, prefix="author") else: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response(template, RequestContext(request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer(request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": if layer.metadata_uploaded_preserve: # layer metadata cannot be edited out = { 'success': False, 'errors': METADATA_UPLOADED_PRESERVE_ERROR } return HttpResponse(json.dumps(out), content_type='application/json', status=400) layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int(request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] if new_poc is None: if poc is None: poc_form = ProfileForm(request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.is_valid(): if len(poc_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = poc_form._errors.setdefault( 'profile', ErrorList()) errors.append( _('You must set a point of contact for this resource')) poc = None if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.is_valid(): if len(author_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = author_form._errors.setdefault( 'profile', ErrorList()) errors.append( _('You must set an author for this resource')) metadata_author = None if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: new_keywords = [ x.strip() for x in layer_form.cleaned_data['keywords'] ] layer.keywords.clear() layer.keywords.add(*new_keywords) the_layer = layer_form.save() up_sessions = UploadSession.objects.filter(layer=the_layer.id) if up_sessions.count( ) > 0 and up_sessions[0].user != the_layer.owner: up_sessions.update(user=the_layer.owner) the_layer.poc = new_poc the_layer.metadata_author = new_author Layer.objects.filter(id=the_layer.id).update(category=new_category) if getattr(settings, 'SLACK_ENABLED', False): try: from geonode.contrib.slack.utils import build_slack_message_layer, send_slack_messages send_slack_messages( build_slack_message_layer("layer_edit", the_layer)) except: print "Could not send slack message." return HttpResponseRedirect( reverse('layer_detail', args=(layer.service_typename, ))) if poc is not None: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True else: poc_form = ProfileForm(prefix="poc") poc_form.hidden = False if metadata_author is not None: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True else: author_form = ProfileForm(prefix="author") author_form.hidden = False return render_to_response( template, RequestContext( request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer(request, layername, 'layers.change_layer', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory(Layer, Attribute, extra=0, form=LayerAttributeForm, ) poc = layer.poc metadata_author = layer.metadata_author ContactRole.objects.get(resource=layer, role=layer.poc_role) ContactRole.objects.get(resource=layer, role=layer.metadata_author_role) if request.method == "POST": layer_form = LayerForm(request.POST, instance=layer, prefix="layer") attribute_form = layer_attribute_set(request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) else: layer_form = LayerForm(instance=layer, prefix="layer") attribute_form = layer_attribute_set(instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) if request.method == "POST" and layer_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: author_form = ProfileForm(request.POST, prefix="author") if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() if attribute_form.is_valid(): for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: the_layer = layer_form.save() the_layer.poc = new_poc the_layer.metadata_author = new_author the_layer.keywords.clear() the_layer.keywords.add(*new_keywords) return HttpResponseRedirect(reverse('layer_detail', args=(layer.typename,))) if poc.user is None: poc_form = ProfileForm(instance=poc, prefix="poc") else: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden=True if metadata_author.user is None: author_form = ProfileForm(instance=metadata_author, prefix="author") else: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden=True return render_to_response(template, RequestContext(request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer(request, layername, 'layers.change_layer', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc.user is None: poc_form = ProfileForm(request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author.user is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: the_layer = layer_form.save() the_layer.poc = new_poc the_layer.metadata_author = new_author the_layer.keywords.clear() the_layer.keywords.add(*new_keywords) return HttpResponseRedirect( reverse('layer_detail', args=(layer.typename, ))) if poc.user is None: poc_form = ProfileForm(instance=poc, prefix="poc") else: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author.user is None: author_form = ProfileForm(instance=metadata_author, prefix="author") else: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response( template, RequestContext( request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": icraf_dr_category =Category.objects.get(pk=request.POST['icraf_dr_category']) #^^ icraf_dr_coverage =Coverage.objects.get(pk=request.POST['icraf_dr_coverage']) #^^ icraf_dr_source =Source.objects.get(pk=request.POST['icraf_dr_source']) #^^ icraf_dr_year =Year.objects.get(pk=request.POST['icraf_dr_year']) #^^ icraf_dr_date_created = request.POST['icraf_dr_date_created'] #^^ icraf_dr_date_published = request.POST['icraf_dr_date_published'] #^^ icraf_dr_date_revised = request.POST['icraf_dr_date_revised'] #^^ #^^ validate date format if (len(icraf_dr_date_created)): #^^ try: #^^ parse(icraf_dr_date_created) #^^ except ValueError: #^^ icraf_dr_date_created = None #^^ else: #^^ icraf_dr_date_created = None #^^ if (len(icraf_dr_date_published)): #^^ try: #^^ parse(icraf_dr_date_published) #^^ except ValueError: #^^ icraf_dr_date_published = None #^^ else: #^^ icraf_dr_date_published = None #^^ if (len(icraf_dr_date_revised)): #^^ try: #^^ parse(icraf_dr_date_revised) #^^ except ValueError: #^^ icraf_dr_date_revised = None #^^ else: #^^ icraf_dr_date_revised = None #^^ try: #^^ main_topic_category = TopicCategory(id=request.POST['category_choice_field']) #^^ except: #^^ main_topic_category = None #^^ main_regions = ','.join(request.POST.getlist('resource-regions')) #^^ save as comma separated ids main_defaults = { #^^ 'category': icraf_dr_category, #^^ 'coverage': icraf_dr_coverage, #^^ 'source': icraf_dr_source, #^^ 'year': icraf_dr_year, #^^ 'topic_category': main_topic_category, #^^ 'regions': main_regions, #^^ 'date_created': icraf_dr_date_created, #^^ 'date_published': icraf_dr_date_published, #^^ 'date_revised': icraf_dr_date_revised #^^ } #^^ main, main_created = Main.objects.get_or_create(layer=layer, defaults=main_defaults) #^^ if not main_created: #^^ main.category = icraf_dr_category #^^ main.coverage = icraf_dr_coverage #^^ main.source = icraf_dr_source #^^ main.year = icraf_dr_year #^^ main.topic_category = main_topic_category #^^ main.regions = main_regions #^^ main.date_created = icraf_dr_date_created #^^ main.date_published = icraf_dr_date_published #^^ main.date_revised = icraf_dr_date_revised #^^ main.save() #^^ #^^ override resource-date with icraf_dr_date_created #^^ override resource-edition with icraf_dr_year request_post = request.POST.copy() #^^ request_post['resource-date'] = icraf_dr_date_created #^^ request_post['resource-edition'] = icraf_dr_year.year_num #^^ layer_form = LayerForm(request_post, instance=layer, prefix="resource") #^^ replace request.POST attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) icraf_dr_categories = Category.objects.order_by('cat_num') #^^ icraf_dr_coverages = Coverage.objects.order_by('cov_num') #^^ icraf_dr_sources = Source.objects.order_by('src_num') #^^ icraf_dr_years = Year.objects.order_by('year_num') #^^ try: #^^ icraf_dr_main = Main.objects.get(layer=layer) #^^ except: #^^ icraf_dr_main = None #^^ if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc is None: poc_form = ProfileForm( request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.is_valid(): if len(poc_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = poc_form._errors.setdefault('profile', ErrorList()) errors.append(_('You must set a point of contact for this resource')) poc = None if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.is_valid(): if len(author_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = author_form._errors.setdefault('profile', ErrorList()) errors.append(_('You must set an author for this resource')) metadata_author = None if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: new_keywords = layer_form.cleaned_data['keywords'] layer.keywords.clear() layer.keywords.add(*new_keywords) the_layer = layer_form.save() the_layer.poc = new_poc the_layer.metadata_author = new_author Layer.objects.filter(id=the_layer.id).update( category=new_category ) if getattr(settings, 'SLACK_ENABLED', False): try: from geonode.contrib.slack.utils import build_slack_message_layer, send_slack_messages send_slack_messages(build_slack_message_layer("layer_edit", the_layer)) except: print "Could not send slack message." return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) if poc is not None: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author is not None: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response(template, RequestContext(request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, 'icraf_dr_categories': icraf_dr_categories, #^^ 'icraf_dr_coverages': icraf_dr_coverages, #^^ 'icraf_dr_sources': icraf_dr_sources, #^^ 'icraf_dr_years': icraf_dr_years, #^^ 'icraf_dr_main': icraf_dr_main, #^^ }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author external_person = layer.external_person if request.method == "POST": layer_form = LayerForm(request.POST, instance=layer, prefix="resource") lkd_project_form = LinkedProjectsForm(request.POST, instance=layer) attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") lkd_project_form = LinkedProjectsForm(instance=layer) attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid() and lkd_project_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_ep = layer_form.cleaned_data['external_person'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc is None: poc_form = ExternalPersonForm( request.POST, prefix="poc", instance=poc) else: poc_form = ExternalPersonForm(request.POST, prefix="poc") if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_ep is None: if external_person is None: ep_form = ExternalPersonForm( request.POST, prefix="external_person", instance=external_person) else: ep_form = ExternalPersonForm(request.POST, prefix="external_person") if ep_form.has_changed and ep_form.is_valid(): new_ep = ep_form.save() # Permite clasificar las capas segun el tipo de fuente capturado # esto ayuda la ejecuión del filtrado en la lista de capas. st = layer_form.cleaned_data['source'] st_low = st.lower().replace(" ", "") if st_low == '': src_type = 'otro' elif st_low == 'centrogeo': src_type = 'centrogeo' else: src_type = 'externo' new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_type = form["attribute_type"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_ep is not None: new_keywords = layer_form.cleaned_data['keywords'] layer.keywords.clear() layer.keywords.add(*new_keywords) the_layer = layer_form.save() the_layer.poc = new_poc the_layer.external_person = new_ep lkd_project_form.save() Layer.objects.filter(id=the_layer.id).update( category=new_category, external_person=new_ep, source_type=src_type) return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) if external_person is None: ep_form = ExternalPersonForm(instance=external_person, prefix="external_person") else: layer_form.fields['external_person'].initial = external_person ep_form = ExternalPersonForm(prefix="external_person") ep_form.hidden = True if poc is None: poc_form = ProfileForm(instance=poc, prefix="poc") else: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author is None: author_form = ProfileForm(instance=metadata_author, prefix="author") else: #layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response(template, RequestContext(request, { "layer": layer, "layer_form": layer_form, "ep_form": ep_form, "poc_form": poc_form, "lkd_project_form": lkd_project_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, }))
def layer_metadata( request, layername, template='layers/layer_metadata.html', ajax=True): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author # assert False, str(layer_bbox) config = layer.attribute_config() # Add required parameters for GXP lazy-loading layer_bbox = layer.bbox bbox = [float(coord) for coord in list(layer_bbox[0:4])] config["srs"] = getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') config["bbox"] = bbox if config["srs"] != 'EPSG:900913' \ else llbbox_to_mercator([float(coord) for coord in bbox]) config["title"] = layer.title config["queryable"] = True if layer.storeType == "remoteStore": service = layer.service source_params = { "ptype": service.ptype, "remote": True, "url": service.base_url, "name": service.name} maplayer = GXPLayer( name=layer.alternate, ows_url=layer.ows_url, layer_params=json.dumps(config), source_params=json.dumps(source_params)) else: maplayer = GXPLayer( name=layer.alternate, ows_url=layer.ows_url, layer_params=json.dumps(config)) # Update count for popularity ranking, # but do not includes admins or resource owners if request.user != layer.owner and not request.user.is_superuser: Layer.objects.filter( id=layer.id).update(popular_count=F('popular_count') + 1) # center/zoom don't matter; the viewer will center on the layer bounds map_obj = GXPMap( projection=getattr( settings, 'DEFAULT_MAP_CRS', 'EPSG:900913')) NON_WMS_BASE_LAYERS = [ la for la in default_map_config(request)[1] if la.ows_url is None] if request.method == "POST": if layer.metadata_uploaded_preserve: # layer metadata cannot be edited out = { 'success': False, 'errors': METADATA_UPLOADED_PRESERVE_ERROR } return HttpResponse( json.dumps(out), content_type='application/json', status=400) layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm(request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) tkeywords_form = TKeywordForm( request.POST, prefix="tkeywords") else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) # Keywords from THESAURI management layer_tkeywords = layer.tkeywords.all() tkeywords_list = '' lang = 'en' # TODO: use user's language if layer_tkeywords and len(layer_tkeywords) > 0: tkeywords_ids = layer_tkeywords.values_list('id', flat=True) if hasattr(settings, 'THESAURI'): for el in settings.THESAURI: 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 layer_form.is_valid() and attribute_form.is_valid( ) and category_form.is_valid() and tkeywords_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] if new_poc is None: if poc is None: poc_form = ProfileForm( request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.is_valid(): if len(poc_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = poc_form._errors.setdefault( 'profile', ErrorList()) errors.append( _('You must set a point of contact for this resource')) poc = None if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.is_valid(): if len(author_form.cleaned_data['profile']) == 0: # FIXME use form.add_error in django > 1.7 errors = author_form._errors.setdefault( 'profile', ErrorList()) errors.append( _('You must set an author for this resource')) metadata_author = None if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None or new_author is not None: if new_poc is not None: layer.poc = new_poc if new_author is not None: layer.metadata_author = new_author new_keywords = [x.strip() for x in layer_form.cleaned_data['keywords']] if new_keywords is not None: layer.keywords.clear() layer.keywords.add(*new_keywords) try: the_layer = layer_form.save() except BaseException: tb = traceback.format_exc() if tb: logger.debug(tb) the_layer = layer up_sessions = UploadSession.objects.filter(layer=the_layer.id) if up_sessions.count() > 0 and up_sessions[0].user != the_layer.owner: up_sessions.update(user=the_layer.owner) if new_category is not None: Layer.objects.filter(id=the_layer.id).update( category=new_category ) if getattr(settings, 'SLACK_ENABLED', False): try: from geonode.contrib.slack.utils import build_slack_message_layer, send_slack_messages send_slack_messages( build_slack_message_layer( "layer_edit", the_layer)) except BaseException: print "Could not send slack message." if not ajax: return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) message = layer.alternate try: # Keywords from THESAURI 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-tkeywords' in key.lower() and 'autocomplete' not in key.lower()] tkeywords_ids.extend(map(int, cleaned_data[0])) except BaseException: pass if hasattr(settings, 'THESAURI'): for el in settings.THESAURI: 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) except BaseException: tb = traceback.format_exc() logger.error(tb) layer.tkeywords.add(*tkeywords_to_add) except BaseException: tb = traceback.format_exc() logger.error(tb) return HttpResponse(json.dumps({'message': message})) if settings.ADMIN_MODERATE_UPLOADS: if not request.user.is_superuser: layer_form.fields['is_published'].widget.attrs.update({'disabled': 'true'}) if not request.user.is_superuser and not request.user.is_staff: can_change_metadata = request.user.has_perm( 'change_resourcebase_metadata', layer.get_self_resource()) try: is_manager = request.user.groupmember_set.all().filter(role='manager').exists() except: is_manager = False if not is_manager or not can_change_metadata: layer_form.fields['is_approved'].widget.attrs.update({'disabled': 'true'}) if poc is not None: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True else: poc_form = ProfileForm(prefix="poc") poc_form.hidden = False if metadata_author is not None: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True else: author_form = ProfileForm(prefix="author") author_form.hidden = False if 'access_token' in request.session: access_token = request.session['access_token'] else: u = uuid.uuid1() access_token = u.hex viewer = json.dumps(map_obj.viewer_json( request.user, access_token, * (NON_WMS_BASE_LAYERS + [maplayer]))) metadataxsl = False if "geonode.contrib.metadataxsl" in settings.INSTALLED_APPS: metadataxsl = True metadata_author_groups = [] if request.user.is_superuser or request.user.is_staff: metadata_author_groups = GroupProfile.objects.all() else: all_metadata_author_groups = chain( request.user.group_list_all().distinct(), GroupProfile.objects.exclude(access="private").exclude(access="public-invite")) [metadata_author_groups.append(item) for item in all_metadata_author_groups if item not in metadata_author_groups] return render_to_response(template, RequestContext(request, { "resource": layer, "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, "tkeywords_form": tkeywords_form, "viewer": viewer, "preview": getattr(settings, 'LAYER_PREVIEW_LIBRARY', 'leaflet'), "crs": getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913'), "metadataxsl": metadataxsl, "freetext_readonly": getattr( settings, 'FREETEXT_KEYWORDS_READONLY', False), "metadata_author_groups": metadata_author_groups, "GROUP_MANDATORY_RESOURCES": getattr(settings, 'GROUP_MANDATORY_RESOURCES', False), }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer(request, layername, 'base.edit_resourcebase_metadata', _PERMISSION_MSG_METADATA) try: if "permission_denied" in layer: return HttpResponse('You are not allowed to edit this layer', mimetype="text/plain", status=401) except: pass layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int(request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc is None: poc_form = ProfileForm(request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: the_layer = layer_form.save() the_layer.poc = new_poc the_layer.metadata_author = new_author the_layer.keywords.clear() the_layer.keywords.add(*new_keywords) the_layer.category = new_category the_layer.save() return HttpResponseRedirect( reverse('layer_detail', args=(layer.service_typename, ))) if poc is None: poc_form = ProfileForm(instance=poc, prefix="poc") else: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author is None: author_form = ProfileForm(instance=metadata_author, prefix="author") else: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response( template, RequestContext( request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, }))
def layer_metadata(request, layername, template='layers/layer_metadata.html'): layer = _resolve_layer( request, layername, 'base.change_resourcebase_metadata', _PERMISSION_MSG_METADATA) layer_attribute_set = inlineformset_factory( Layer, Attribute, extra=0, form=LayerAttributeForm, ) topic_category = layer.category poc = layer.poc metadata_author = layer.metadata_author if request.method == "POST": layer_form = LayerForm(request.POST, instance=layer, prefix="resource") attribute_form = layer_attribute_set( request.POST, instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( request.POST, prefix="category_choice_field", initial=int( request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None) else: layer_form = LayerForm(instance=layer, prefix="resource") attribute_form = layer_attribute_set( instance=layer, prefix="layer_attribute_set", queryset=Attribute.objects.order_by('display_order')) category_form = CategoryForm( prefix="category_choice_field", initial=topic_category.id if topic_category else None) if request.method == "POST" and layer_form.is_valid( ) and attribute_form.is_valid() and category_form.is_valid(): new_poc = layer_form.cleaned_data['poc'] new_author = layer_form.cleaned_data['metadata_author'] new_keywords = layer_form.cleaned_data['keywords'] if new_poc is None: if poc is None: poc_form = ProfileForm( request.POST, prefix="poc", instance=poc) else: poc_form = ProfileForm(request.POST, prefix="poc") if poc_form.has_changed and poc_form.is_valid(): new_poc = poc_form.save() if new_author is None: if metadata_author is None: author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author) else: author_form = ProfileForm(request.POST, prefix="author") if author_form.has_changed and author_form.is_valid(): new_author = author_form.save() new_category = TopicCategory.objects.get( id=category_form.cleaned_data['category_choice_field']) for form in attribute_form.cleaned_data: la = Attribute.objects.get(id=int(form['id'].id)) la.description = form["description"] la.attribute_label = form["attribute_label"] la.visible = form["visible"] la.display_order = form["display_order"] la.save() if new_poc is not None and new_author is not None: new_keywords = layer_form.cleaned_data['keywords'] layer.keywords.clear() layer.keywords.add(*new_keywords) the_layer = layer_form.save() the_layer.poc = new_poc the_layer.metadata_author = new_author Layer.objects.filter(id=the_layer.id).update( category=new_category ) if getattr(settings, 'SLACK_ENABLED', False): try: from geonode.contrib.slack.utils import build_slack_message_layer, send_slack_messages send_slack_messages(build_slack_message_layer("layer_edit", the_layer)) except: print "Could not send slack message." return HttpResponseRedirect( reverse( 'layer_detail', args=( layer.service_typename, ))) if poc is None: poc_form = ProfileForm(instance=poc, prefix="poc") else: layer_form.fields['poc'].initial = poc.id poc_form = ProfileForm(prefix="poc") poc_form.hidden = True if metadata_author is None: author_form = ProfileForm(instance=metadata_author, prefix="author") else: layer_form.fields['metadata_author'].initial = metadata_author.id author_form = ProfileForm(prefix="author") author_form.hidden = True return render_to_response(template, RequestContext(request, { "layer": layer, "layer_form": layer_form, "poc_form": poc_form, "author_form": author_form, "attribute_form": attribute_form, "category_form": category_form, }))