diff --git a/geonode/contrib/worldmap/gazetteer/admin.py b/geonode/contrib/worldmap/gazetteer/admin.py
new file mode 100644
index 00000000000..bc20e18aecd
--- /dev/null
+++ b/geonode/contrib/worldmap/gazetteer/admin.py
@@ -0,0 +1,27 @@
+from django.contrib import admin
+
+from .models import GazetteerEntry, GazetteerAttribute
+
+
+class GazetteerEntryAdmin(admin.ModelAdmin):
+ list_display = (
+ 'layer_name',
+ 'layer_attribute',
+ 'feature_type',
+ 'place_name',
+ 'project',
+ 'username',
+ )
+
+class GazetteerAttributeAdmin(admin.ModelAdmin):
+ list_display = (
+ 'layer_name',
+ 'attribute',
+ 'in_gazetteer',
+ 'is_start_date',
+ 'is_end_date',
+ 'date_format',
+ )
+
+admin.site.register(GazetteerEntry, GazetteerEntryAdmin)
+admin.site.register(GazetteerAttribute, GazetteerAttributeAdmin)
diff --git a/geonode/contrib/worldmap/gazetteer/management/commands/updategazetteer.py b/geonode/contrib/worldmap/gazetteer/management/commands/updategazetteer.py
index ef495bb55b1..7e0b7e70b9e 100644
--- a/geonode/contrib/worldmap/gazetteer/management/commands/updategazetteer.py
+++ b/geonode/contrib/worldmap/gazetteer/management/commands/updategazetteer.py
@@ -10,6 +10,8 @@ class Command(BaseCommand):
"""
args = '[none]'
+ # TODO update this to new version
+
def handle(self, *args, **kwargs):
gaz_layers = GazetteerEntry.objects.filter(
username__isnull=True).values('layer_name').distinct()
diff --git a/geonode/contrib/worldmap/gazetteer/migrations/0002_gazetteerattribute.py b/geonode/contrib/worldmap/gazetteer/migrations/0002_gazetteerattribute.py
new file mode 100644
index 00000000000..89f82015f4a
--- /dev/null
+++ b/geonode/contrib/worldmap/gazetteer/migrations/0002_gazetteerattribute.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('layers', '0029_layer_service'),
+ ('gazetteer', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='GazetteerAttribute',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('in_gazetteer', models.BooleanField(default=False)),
+ ('attribute', models.OneToOneField(to='layers.Attribute')),
+ ],
+ ),
+ ]
diff --git a/geonode/contrib/worldmap/gazetteer/migrations/0003_auto_20180316_1109.py b/geonode/contrib/worldmap/gazetteer/migrations/0003_auto_20180316_1109.py
new file mode 100644
index 00000000000..94c5cd73a87
--- /dev/null
+++ b/geonode/contrib/worldmap/gazetteer/migrations/0003_auto_20180316_1109.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('gazetteer', '0002_gazetteerattribute'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='gazetteerattribute',
+ name='date_format',
+ field=models.TextField(null=True, blank=True),
+ ),
+ migrations.AddField(
+ model_name='gazetteerattribute',
+ name='is_end_date',
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name='gazetteerattribute',
+ name='is_start_date',
+ field=models.BooleanField(default=False),
+ ),
+ ]
diff --git a/geonode/contrib/worldmap/gazetteer/models.py b/geonode/contrib/worldmap/gazetteer/models.py
index 6052e9e846a..2a16c45495c 100644
--- a/geonode/contrib/worldmap/gazetteer/models.py
+++ b/geonode/contrib/worldmap/gazetteer/models.py
@@ -1,6 +1,8 @@
from django.utils.translation import ugettext as _
from django.contrib.gis.db import models
+from geonode.layers.models import Attribute
+
# Querying postgis database for features then saving as django model object is
# significantly slower than doing everything via SQL on postgis database only.
# from django.modelsinspector import add_introspection_rules
@@ -27,3 +29,17 @@ class GazetteerEntry(models.Model):
class Meta:
unique_together = (("layer_name", "layer_attribute", "feature_fid"))
+
+
+class GazetteerAttribute(models.Model):
+ attribute = models.OneToOneField(
+ Attribute,
+ blank=False,
+ null=False)
+ in_gazetteer = models.BooleanField(default=False)
+ is_start_date = models.BooleanField(default=False)
+ is_end_date = models.BooleanField(default=False)
+ date_format = models.TextField(blank=True, null=True)
+
+ def layer_name(self):
+ return self.attribute.layer.name
diff --git a/geonode/contrib/worldmap/gazetteer/templates/gazetteer/edit_layer_gazetteer.html b/geonode/contrib/worldmap/gazetteer/templates/gazetteer/edit_layer_gazetteer.html
new file mode 100644
index 00000000000..dc4e7f2ca1f
--- /dev/null
+++ b/geonode/contrib/worldmap/gazetteer/templates/gazetteer/edit_layer_gazetteer.html
@@ -0,0 +1,84 @@
+{% extends "geonode_base.html" %}
+
+{% load i18n %}
+{% load staticfiles %}
+{% load bootstrap_tags %}
+{% load base_tags %}
+{% load url from future %}
+
+{% block title %}{{ layer.title }} — {{ block.super }}{% endblock %}
+
+{% block body_outer %}
+
+
+
+
+{% trans "By adding your layer features to the gazetteer, they will be searchable and viewable by anyone regardless of your layer's security permissions. If you do not choose at least one depict-date field, the system will use the depict-date in the layer metadata (if any)." %}
+
+
+
+
+
+{{ block.super }}
+{% endblock body_outer %}
diff --git a/geonode/contrib/worldmap/gazetteer/urls.py b/geonode/contrib/worldmap/gazetteer/urls.py
index 2eeb2483649..0207ab2bc0d 100644
--- a/geonode/contrib/worldmap/gazetteer/urls.py
+++ b/geonode/contrib/worldmap/gazetteer/urls.py
@@ -1,8 +1,11 @@
from django.conf.urls import *
-from geonode.gazetteer.views import search
+from .views import search, edit_layer_gazetteer
urlpatterns = patterns('',
- url(r'^(?P[^/]+)' +
+ url(r'^gazetteer/edit/(?P[^/]*)$',
+ edit_layer_gazetteer,
+ name = 'edit_layer_gazetteer'),
+ url(r'^gazetteer/(?P[^/]+)' +
'(/Service/(?P[\w\,]+))?' +
'(/Project/(?P[A-Za-z0-9_-]+))?' +
'(/Map/(?P