django-gisserver 1.5.0__py3-none-any.whl → 2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {django_gisserver-1.5.0.dist-info → django_gisserver-2.1.dist-info}/METADATA +34 -8
  2. django_gisserver-2.1.dist-info/RECORD +68 -0
  3. {django_gisserver-1.5.0.dist-info → django_gisserver-2.1.dist-info}/WHEEL +1 -1
  4. gisserver/__init__.py +1 -1
  5. gisserver/compat.py +23 -0
  6. gisserver/conf.py +7 -0
  7. gisserver/crs.py +401 -0
  8. gisserver/db.py +126 -51
  9. gisserver/exceptions.py +132 -4
  10. gisserver/extensions/__init__.py +4 -0
  11. gisserver/{parsers/fes20 → extensions}/functions.py +131 -31
  12. gisserver/extensions/queries.py +266 -0
  13. gisserver/features.py +253 -181
  14. gisserver/geometries.py +64 -311
  15. gisserver/management/__init__.py +0 -0
  16. gisserver/management/commands/__init__.py +0 -0
  17. gisserver/management/commands/loadgeojson.py +311 -0
  18. gisserver/operations/base.py +130 -312
  19. gisserver/operations/wfs20.py +399 -375
  20. gisserver/output/__init__.py +14 -49
  21. gisserver/output/base.py +198 -144
  22. gisserver/output/csv.py +78 -75
  23. gisserver/output/geojson.py +37 -37
  24. gisserver/output/gml32.py +287 -259
  25. gisserver/output/iters.py +207 -0
  26. gisserver/output/results.py +73 -61
  27. gisserver/output/stored.py +143 -0
  28. gisserver/output/utils.py +81 -169
  29. gisserver/output/xmlschema.py +85 -46
  30. gisserver/parsers/__init__.py +10 -10
  31. gisserver/parsers/ast.py +426 -0
  32. gisserver/parsers/fes20/__init__.py +89 -31
  33. gisserver/parsers/fes20/expressions.py +172 -58
  34. gisserver/parsers/fes20/filters.py +116 -45
  35. gisserver/parsers/fes20/identifiers.py +66 -28
  36. gisserver/parsers/fes20/lookups.py +146 -0
  37. gisserver/parsers/fes20/operators.py +417 -161
  38. gisserver/parsers/fes20/sorting.py +113 -34
  39. gisserver/parsers/gml/__init__.py +17 -25
  40. gisserver/parsers/gml/base.py +36 -15
  41. gisserver/parsers/gml/geometries.py +105 -44
  42. gisserver/parsers/ows/__init__.py +25 -0
  43. gisserver/parsers/ows/kvp.py +198 -0
  44. gisserver/parsers/ows/requests.py +160 -0
  45. gisserver/parsers/query.py +179 -0
  46. gisserver/parsers/values.py +87 -4
  47. gisserver/parsers/wfs20/__init__.py +39 -0
  48. gisserver/parsers/wfs20/adhoc.py +253 -0
  49. gisserver/parsers/wfs20/base.py +148 -0
  50. gisserver/parsers/wfs20/projection.py +103 -0
  51. gisserver/parsers/wfs20/requests.py +483 -0
  52. gisserver/parsers/wfs20/stored.py +193 -0
  53. gisserver/parsers/xml.py +261 -0
  54. gisserver/projection.py +367 -0
  55. gisserver/static/gisserver/index.css +20 -4
  56. gisserver/templates/gisserver/base.html +12 -0
  57. gisserver/templates/gisserver/index.html +9 -15
  58. gisserver/templates/gisserver/service_description.html +12 -6
  59. gisserver/templates/gisserver/wfs/2.0.0/get_capabilities.xml +9 -9
  60. gisserver/templates/gisserver/wfs/feature_field.html +3 -3
  61. gisserver/templates/gisserver/wfs/feature_type.html +35 -13
  62. gisserver/templatetags/gisserver_tags.py +20 -0
  63. gisserver/types.py +445 -313
  64. gisserver/views.py +227 -62
  65. django_gisserver-1.5.0.dist-info/RECORD +0 -54
  66. gisserver/parsers/base.py +0 -149
  67. gisserver/parsers/fes20/query.py +0 -285
  68. gisserver/parsers/tags.py +0 -102
  69. gisserver/queries/__init__.py +0 -37
  70. gisserver/queries/adhoc.py +0 -185
  71. gisserver/queries/base.py +0 -186
  72. gisserver/queries/projection.py +0 -240
  73. gisserver/queries/stored.py +0 -206
  74. gisserver/templates/gisserver/wfs/2.0.0/describe_stored_queries.xml +0 -20
  75. gisserver/templates/gisserver/wfs/2.0.0/list_stored_queries.xml +0 -14
  76. {django_gisserver-1.5.0.dist-info → django_gisserver-2.1.dist-info/licenses}/LICENSE +0 -0
  77. {django_gisserver-1.5.0.dist-info → django_gisserver-2.1.dist-info}/top_level.txt +0 -0
@@ -1,26 +1,20 @@
1
- <!doctype html>{% load i18n static %}{# This is a very basic template that can be overwritten in projects #}
2
- <html>
3
- <head>
4
- <meta http-equiv="content-type" content="text/html; charset=utf-8">
5
- <title>{{ service_description.title }} {{ accept_operations|dictsort:0|join:"/" }}</title>
6
- {% block link %}<link rel="stylesheet" type="text/css" href="{% static 'gisserver/index.css' %}">{% endblock %}
7
- {% block extrahead %}{% endblock %}
8
- </head>
9
- <body>
10
- <header>
1
+
2
+ {% extends "gisserver/base.html" %}{% load i18n %}
3
+
4
+ {% block title %}{{ service_description.title }} {{ accept_operations|dictsort:0|join:"/" }}{% endblock %}
5
+ {% block content %}
6
+ <header id="wfs-header">
11
7
  {% block header %}{% include "gisserver/service_description.html" %}{% endblock %}
12
8
  </header>
13
9
 
14
- <main>
10
+ <main id="wfs-main">
15
11
  {% block main %}
16
12
  {% if wfs_features %}
17
- <h2>WFS Feature Types</h2>
13
+ <h2>{% translate "WFS Feature Types" %}</h2>
18
14
  {% for feature_type in wfs_features %}
19
15
  <article>{% include "gisserver/wfs/feature_type.html" %}</article>
20
16
  {% endfor %}
21
17
  {% endif %}
22
18
  {% endblock %}
23
19
  </main>
24
-
25
- </body>
26
- </html>
20
+ {% endblock %}
@@ -2,15 +2,21 @@
2
2
  <h1>{{ service_description.title }} {{ accept_operations|dictsort:0|join:"/" }}</h1>
3
3
  {% if service_description.abstract %}{{ service_description.abstract|linebreaks }}{% endif %}
4
4
 
5
+ {% if service_description.keywords or service_description.provider_name %}
6
+ <dl>
5
7
  {% if service_description.keywords %}
6
- <p>{% trans "Keywords" %}: {% for keyword in service_description.keywords %}{{ keyword }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>
8
+ <dt>{% translate "Keywords" %}:</dt><dd>{{ service_description.keywords|join:", " }}</dd>
7
9
  {% endif %}
8
10
  {% if service_description.provider_name %}
9
- {% trans "Provider" %}: {% if service_description.provider_site %}<a href="{{ service_description.provider_site }}">{% endif %}{{ service_description.provider_name }}{% if service_description.provider_site %}</a>{% endif %}
10
- {% if service_description.contact_person %}<p>{% trans "Contact" %}: {{ service_description.contact_person }}</p>{% endif %}
11
+ <dt>{% translate "Provider" %}:</dt>
12
+ <dd>{% if service_description.provider_site %}<a href="{{ service_description.provider_site }}">{% endif %}{{ service_description.provider_name }}{% if service_description.provider_site %}</a></dd>{% endif %}
13
+ {% if service_description.contact_person %}<dt>{% translate "Contact" %}:</dt><dd>{{ service_description.contact_person }}</dd>{% endif %}
11
14
  {% endif %}
15
+ </dl>
16
+ {% endif %}
17
+
12
18
  {% if connect_url %}
13
- <h2>{% trans "Using This WFS" %}</h2>
14
- <p>{% trans "Add the following URL to your GIS application:" %}</p>
15
- <blockquote><code>{{ connect_url }}</code></blockquote>
19
+ <h2>{% translate "Using This WFS" %}</h2>
20
+ <p>{% translate "Add the following URL to your GIS application:" %}</p>
21
+ <p class="connect-url"><code>{{ connect_url }}</code></p>
16
22
  {% endif %}
@@ -11,8 +11,8 @@
11
11
  xmlns:xlink="http://www.w3.org/1999/xlink"
12
12
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
13
13
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
14
- xmlns:fes="http://www.opengis.net/fes/2.0"
15
- xmlns:app="{{ app_xml_namespace }}"
14
+ xmlns:fes="http://www.opengis.net/fes/2.0"{% for xml_namespace, prefix in xml_namespaces.items %}
15
+ xmlns:{{ prefix }}="{{ xml_namespace }}"{% endfor %}
16
16
  xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
17
17
 
18
18
  <ows:ServiceIdentification>
@@ -59,22 +59,22 @@
59
59
  </ows:ServiceProvider>
60
60
 
61
61
  <ows:OperationsMetadata>
62
- {% for name, operation in accept_operations.items %}
62
+ {% for name, parameters in accept_operations.items %}
63
63
  <ows:Operation name="{{ name }}">
64
64
  <ows:DCP>
65
65
  <ows:HTTP>
66
66
  <ows:Get xlink:type="simple" xlink:href="{{ server_url }}"/>
67
- {# <ows:Post xlink:type="simple" xlink:href="{{ server_url }}"/> #}
67
+ <ows:Post xlink:type="simple" xlink:href="{{ server_url }}"/>
68
68
  </ows:HTTP>
69
69
  </ows:DCP>
70
- {% for parameter in operation.get_parameters %}{% if parameter.in_capabilities and parameter.allowed_values %}
70
+ {% for parameter in parameters %}
71
71
  <ows:Parameter name="{{ parameter.name }}">
72
72
  <ows:AllowedValues>
73
73
  {% for output in parameter.allowed_values %}
74
74
  <ows:Value>{{ output }}</ows:Value>
75
75
  {% endfor %}
76
76
  </ows:AllowedValues>
77
- </ows:Parameter>{% endif %}{% endfor %}
77
+ </ows:Parameter>{% endfor %}
78
78
  </ows:Operation>
79
79
  {% endfor %}
80
80
  {% for name, value in service_constraints.items %}
@@ -89,7 +89,7 @@
89
89
  <FeatureTypeList>
90
90
  {% for feature_type in feature_types %}
91
91
  <FeatureType>
92
- <Name>{{ feature_type.xml_name }}</Name>
92
+ <Name>{% feature_qname feature_type %}</Name>
93
93
  <Title>{{ feature_type.title }}</Title>{% if feature_type.abstract %}
94
94
  <Abstract>{{ feature_type.abstract }}</Abstract>{% endif %}
95
95
  {% if feature_type.keywords %}<ows:Keywords>{% for keyword in feature_type.keywords %}
@@ -177,10 +177,10 @@
177
177
  {% endcomment %}{% if function_registry %}
178
178
  <fes:Functions>{% for function in function_registry %}
179
179
  <fes:Function name="{{ function.name }}">
180
- <fes:Returns>{{ function.returns.with_prefix }}</fes:Returns>{% if function.arguments %}
180
+ <fes:Returns>{{ function.returns|to_qname }}</fes:Returns>{% if function.arguments %}
181
181
  <fes:Arguments>{% for name, xs_type in function.arguments.items %}
182
182
  <fes:Argument name="{{ name }}">
183
- <fes:Type>{{ xs_type.with_prefix }}</fes:Type>
183
+ <fes:Type>{{ xs_type|to_qname }}</fes:Type>
184
184
  </fes:Argument>{% endfor %}
185
185
  </fes:Arguments>{% endif %}
186
186
  </fes:Function>{% endfor %}
@@ -1,6 +1,6 @@
1
- <tr{% if level %} class="complex-field-member complex-level-{{ level }}"{% endif %}>
2
- <th><code>{{ field.name }}</code></th>
3
- <td>{{ field.xsd_element.type }}{% if field.xsd_element.is_many %} <em>(maxOccurs={{ field.xsd_element.max_occurs }})</em>{% endif %}</td>
1
+ {% load gisserver_tags %}<tr{% if level %} class="complex-field-member complex-level-{{ level }}"{% endif %}>
2
+ <th><code>{% if level %}/{% endif %}{{ field.name }}</code></th>
3
+ <td>{{ field.xsd_element.type|to_qname:xml_namespaces }}{% if field.xsd_element.is_many %} <em>(maxOccurs={{ field.xsd_element.max_occurs }})</em>{% endif %}</td>
4
4
  <td>{{ field.abstract|default:'' }}</td>
5
5
  </tr>
6
6
  {% if field.xsd_element.type.is_complex_type and field.fields %}
@@ -1,19 +1,41 @@
1
- {% load i18n %}
2
- <h3>{{ feature_type.title }}</h3>
3
- {% if feature_type.abstract %}{{ feature_type.abstract|linebreaks }}{% endif %}
1
+ {% load i18n gisserver_tags %}
4
2
 
5
- {% block formats %}{% if wfs_output_formats %}
6
- <p>
7
- {% trans "Formats" %}:
8
- {% for output_format in wfs_output_formats %}
9
- <a href="?{{ base_query }}SERVICE=WFS&VERSION={{ version }}&REQUEST=GetFeature&TYPENAMES={{ feature_type.name }}&OUTPUTFORMAT={{ output_format.identifier }}">{{ output_format.title|default:output_format }}</a>{% if not forloop.last %},{% endif %}
10
- {% endfor %}
11
- </p>
12
- {% endif %}{% endblock %}
3
+ {% block title %}<h3><a id="feature-{{ feature_type.name }}">{{ feature_type.title }}</a></h3>{% endblock %}
4
+ {% block description %}
5
+ {% if feature_type.abstract %}{{ feature_type.abstract|linebreaks }}{% endif %}
6
+ {% endblock %}
7
+
8
+ {% block metadata %}
9
+ <dl>
10
+ {% block metadata-items %}
11
+ <dt>{% translate "XML Namespace" %}:</dt><dd><code>{{ feature_type.xml_namespace }}</code></dd>
12
+ <dt>{% translate "Typename" %}:</dt><dd><abbr title="{{ feature_type.xml_name }}">{% feature_qname feature_type %}</abbr></dd>
13
+ <dt>{% translate "Supported CRS" %}:</dt>
14
+ <dd>
15
+ {% if GISSERVER_SUPPORTED_CRS_ONLY %}
16
+ {% blocktranslate with default_crs=feature_type.crs %}Any CRS value is supported, source data uses {{ default_crs }}.{% endblocktranslate %}
17
+ {% else %}
18
+ {{ feature_type.supported_crs|join:", " }}
19
+ {% endif %}
20
+ </dd>
21
+ {% if wfs_output_formats %}
22
+ <dt>{% translate "Formats" %}:</dt>
23
+ <dd>{% block metadata-formats %}
24
+ {% for output_format in wfs_output_formats %}
25
+ <a href="?{{ base_query }}SERVICE=WFS&VERSION={{ version }}&REQUEST=GetFeature&TYPENAMES={% feature_qname feature_type %}&OUTPUTFORMAT={{ output_format.identifier }}">{{ output_format.title|default:output_format }}</a>{% block format-sep %},{% endblock %}
26
+ {% endfor %}
27
+ <a href="?{{ base_query }}SERVICE=WFS&VERSION={{ version }}&REQUEST=DescribeFeatureType&TYPENAMES={% feature_qname feature_type %}">XML Schema</a>
28
+ {% endblock %}
29
+ </dd>
30
+ {% endif %}
31
+ {% endblock %}
32
+ </dl>
33
+ {% endblock %}
13
34
 
14
35
  {% block fields %}
15
- <p>{% trans "Fields" %}:</p>
16
- <table>
36
+ <p>{% translate "The following fields are available:" %}</p>
37
+ <table class="table table-striped">
38
+ <thead><tr><th>{% translate "Field Name" %}</th><th>{% translate "Type" %}</th><th>{% translate "Description" %}</th></tr></thead>
17
39
  <tbody>
18
40
  {% for field in feature_type.fields %}
19
41
  {% include "gisserver/wfs/feature_field.html" with level=0 %}
@@ -1,10 +1,30 @@
1
+ from __future__ import annotations
2
+
1
3
  from urllib.parse import urljoin
2
4
 
3
5
  from django.template import Library
4
6
 
7
+ from gisserver.features import FeatureType
8
+ from gisserver.output import to_qname
9
+ from gisserver.types import XsdAnyType, XsdNode
10
+
5
11
  register = Library()
6
12
 
7
13
 
8
14
  @register.filter(name="urljoin")
9
15
  def urljoin_(fragment, server_url):
10
16
  return urljoin(server_url, fragment)
17
+
18
+
19
+ @register.filter(name="to_qname")
20
+ def _to_qname(xsd_type: XsdNode | XsdAnyType, xml_namespaces=None):
21
+ """Translate a full XML name to a shortened name, using common prefixes.."""
22
+ return to_qname(xsd_type.namespace, xsd_type.name, xml_namespaces or {})
23
+
24
+
25
+ @register.simple_tag(name="feature_qname", takes_context=True)
26
+ def feature_qname(context, feature_type: FeatureType, xml_namespaces=None):
27
+ """Translate a full XML name to a shortened name."""
28
+ if xml_namespaces is None:
29
+ xml_namespaces = context["xml_namespaces"]
30
+ return to_qname(feature_type.xml_namespace, feature_type.name, xml_namespaces)