summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorHonza Král <honza.kral@gmail.com>2009-07-02 16:07:15 +0000
committerHonza Král <honza.kral@gmail.com>2009-07-02 16:07:15 +0000
commitd628498c58aab0c4deafe6b9d08e6220ee093fc5 (patch)
tree42e9fdba067953f734252f2ab4551b48afe168d3 /django
parent481fb86e139401bd454184066ee9e2dcb0015db0 (diff)
[soc2009/model-validation] Merged to trunk at r11155
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/model-validation@11158 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admindocs/templates/admin_doc/model_index.html2
-rw-r--r--django/contrib/admindocs/views.py18
-rw-r--r--django/contrib/gis/admin/options.py2
-rw-r--r--django/contrib/gis/db/models/sql/query.py2
-rw-r--r--django/contrib/gis/maps/google/gmap.py4
-rw-r--r--django/contrib/gis/templates/gis/google/google-base.js7
-rw-r--r--django/contrib/gis/templates/gis/google/google-map.js12
-rw-r--r--django/contrib/gis/templates/gis/google/google-multi.js2
-rw-r--r--django/contrib/gis/templates/gis/google/google-single.js4
-rw-r--r--django/contrib/gis/tests/relatedapp/models.py2
-rw-r--r--django/contrib/gis/tests/relatedapp/tests.py7
-rw-r--r--django/core/urlresolvers.py7
12 files changed, 48 insertions, 21 deletions
diff --git a/django/contrib/admindocs/templates/admin_doc/model_index.html b/django/contrib/admindocs/templates/admin_doc/model_index.html
index 4dd7caa2a6..47c94c0c70 100644
--- a/django/contrib/admindocs/templates/admin_doc/model_index.html
+++ b/django/contrib/admindocs/templates/admin_doc/model_index.html
@@ -36,7 +36,7 @@
<ul>
{% regroup models by app_label as grouped_models %}
{% for group in grouped_models %}
- <li><a href="#{{ group.grouper }}">{{ group.grouper|capfirst }}</a></li>
+ <li><a href="#app-{{ group.grouper }}">{{ group.grouper|capfirst }}</a></li>
{% endfor %}
</ul>
</div>
diff --git a/django/contrib/admindocs/views.py b/django/contrib/admindocs/views.py
index f66ea3e9b0..4f22fe0a0a 100644
--- a/django/contrib/admindocs/views.py
+++ b/django/contrib/admindocs/views.py
@@ -214,6 +214,22 @@ def model_detail(request, app_label, model_name):
'help_text': field.help_text,
})
+ # Gather many-to-many fields.
+ for field in opts.many_to_many:
+ data_type = related_object_name = field.rel.to.__name__
+ app_label = field.rel.to._meta.app_label
+ verbose = _("related `%(app_label)s.%(object_name)s` objects") % {'app_label': app_label, 'object_name': data_type}
+ fields.append({
+ 'name': "%s.all" % field.name,
+ "data_type": 'List',
+ 'verbose': utils.parse_rst(_("all %s") % verbose , 'model', _('model:') + opts.module_name),
+ })
+ fields.append({
+ 'name' : "%s.count" % field.name,
+ 'data_type' : 'Integer',
+ 'verbose' : utils.parse_rst(_("number of %s") % verbose , 'model', _('model:') + opts.module_name),
+ })
+
# Gather model methods.
for func_name, func in model.__dict__.items():
if (inspect.isfunction(func) and len(inspect.getargspec(func)[0]) == 1):
@@ -233,7 +249,7 @@ def model_detail(request, app_label, model_name):
})
# Gather related objects
- for rel in opts.get_all_related_objects():
+ for rel in opts.get_all_related_objects() + opts.get_all_related_many_to_many_objects():
verbose = _("related `%(app_label)s.%(object_name)s` objects") % {'app_label': rel.opts.app_label, 'object_name': rel.opts.object_name}
accessor = rel.get_accessor_name()
fields.append({
diff --git a/django/contrib/gis/admin/options.py b/django/contrib/gis/admin/options.py
index 6a63a9fe78..fff1cb20a6 100644
--- a/django/contrib/gis/admin/options.py
+++ b/django/contrib/gis/admin/options.py
@@ -32,7 +32,7 @@ class GeoModelAdmin(ModelAdmin):
map_height = 400
map_srid = 4326
map_template = 'gis/admin/openlayers.html'
- openlayers_url = 'http://openlayers.org/api/2.7/OpenLayers.js'
+ openlayers_url = 'http://openlayers.org/api/2.8/OpenLayers.js'
point_zoom = num_zoom - 6
wms_url = 'http://labs.metacarta.com/wms/vmap0'
wms_layer = 'basic'
diff --git a/django/contrib/gis/db/models/sql/query.py b/django/contrib/gis/db/models/sql/query.py
index cf1ccf6483..5df15a88b1 100644
--- a/django/contrib/gis/db/models/sql/query.py
+++ b/django/contrib/gis/db/models/sql/query.py
@@ -225,7 +225,7 @@ class GeoQuery(sql.Query):
values.append(self.convert_values(value, field))
else:
values.extend(row[index_start:])
- return values
+ return tuple(values)
def convert_values(self, value, field):
"""
diff --git a/django/contrib/gis/maps/google/gmap.py b/django/contrib/gis/maps/google/gmap.py
index de8f75c5a0..cca5dc941f 100644
--- a/django/contrib/gis/maps/google/gmap.py
+++ b/django/contrib/gis/maps/google/gmap.py
@@ -21,7 +21,7 @@ class GoogleMap(object):
def __init__(self, key=None, api_url=None, version=None,
center=None, zoom=None, dom_id='map',
kml_urls=[], polylines=None, polygons=None, markers=None,
- template='gis/google/google-single.js',
+ template='gis/google/google-map.js',
js_module='geodjango',
extra_context={}):
@@ -162,7 +162,7 @@ class GoogleMapSet(GoogleMap):
# This is the template used to generate the GMap load JavaScript for
# each map in the set.
- self.map_template = kwargs.pop('map_template', 'gis/google/google-map.js')
+ self.map_template = kwargs.pop('map_template', 'gis/google/google-single.js')
# Running GoogleMap.__init__(), and resetting the template
# value with default obtained above.
diff --git a/django/contrib/gis/templates/gis/google/google-base.js b/django/contrib/gis/templates/gis/google/google-base.js
deleted file mode 100644
index f3a91edbc4..0000000000
--- a/django/contrib/gis/templates/gis/google/google-base.js
+++ /dev/null
@@ -1,7 +0,0 @@
-{% block vars %}var geodjango = {};{% for icon in icons %}
-var {{ icon.varname }} = new GIcon(G_DEFAULT_ICON);
-{% if icon.image %}{{ icon.varname }}.image = "{{ icon.image }}";{% endif %}
-{% if icon.shadow %}{{ icon.varname }}.shadow = "{{ icon.shadow }}";{% endif %} {% if icon.shadowsize %}{{ icon.varname }}.shadowSize = new GSize({{ icon.shadowsize.0 }}, {{ icon.shadowsize.1 }});{% endif %}
-{% if icon.iconanchor %}{{ icon.varname }}.iconAnchor = new GPoint({{ icon.iconanchor.0 }}, {{ icon.iconanchor.1 }});{% endif %} {% if icon.iconsize %}{{ icon.varname }}.iconSize = new GSize({{ icon.iconsize.0 }}, {{ icon.iconsize.1 }});{% endif %}
-{% if icon.infowindowanchor %}{{ icon.varname }}.infoWindowAnchor = new GPoint({{ icon.infowindowanchor.0 }}, {{ icon.infowindowanchor.1 }});{% endif %}{% endfor %}{% endblock %}
-{% block functions %}{% endblock %} \ No newline at end of file
diff --git a/django/contrib/gis/templates/gis/google/google-map.js b/django/contrib/gis/templates/gis/google/google-map.js
index e5f3a0e0e3..06f11e35f3 100644
--- a/django/contrib/gis/templates/gis/google/google-map.js
+++ b/django/contrib/gis/templates/gis/google/google-map.js
@@ -1,10 +1,16 @@
{% autoescape off %}
+{% block vars %}var geodjango = {};{% for icon in icons %}
+var {{ icon.varname }} = new GIcon(G_DEFAULT_ICON);
+{% if icon.image %}{{ icon.varname }}.image = "{{ icon.image }}";{% endif %}
+{% if icon.shadow %}{{ icon.varname }}.shadow = "{{ icon.shadow }}";{% endif %} {% if icon.shadowsize %}{{ icon.varname }}.shadowSize = new GSize({{ icon.shadowsize.0 }}, {{ icon.shadowsize.1 }});{% endif %}
+{% if icon.iconanchor %}{{ icon.varname }}.iconAnchor = new GPoint({{ icon.iconanchor.0 }}, {{ icon.iconanchor.1 }});{% endif %} {% if icon.iconsize %}{{ icon.varname }}.iconSize = new GSize({{ icon.iconsize.0 }}, {{ icon.iconsize.1 }});{% endif %}
+{% if icon.infowindowanchor %}{{ icon.varname }}.infoWindowAnchor = new GPoint({{ icon.infowindowanchor.0 }}, {{ icon.infowindowanchor.1 }});{% endif %}{% endfor %}
+{% endblock vars %}{% block functions %}
{% block load %}{{ js_module }}.{{ dom_id }}_load = function(){
if (GBrowserIsCompatible()) {
{{ js_module }}.{{ dom_id }} = new GMap2(document.getElementById("{{ dom_id }}"));
{{ js_module }}.{{ dom_id }}.setCenter(new GLatLng({{ center.1 }}, {{ center.0 }}), {{ zoom }});
- {% block controls %}{{ js_module }}.{{ dom_id }}.addControl(new GSmallMapControl());
- {{ js_module }}.{{ dom_id }}.addControl(new GMapTypeControl());{% endblock %}
+ {% block controls %}{{ js_module }}.{{ dom_id }}.setUIToDefault();{% endblock %}
{% if calc_zoom %}var bounds = new GLatLngBounds(); var tmp_bounds = new GLatLngBounds();{% endif %}
{% for kml_url in kml_urls %}{{ js_module }}.{{ dom_id }}_kml{{ forloop.counter }} = new GGeoXml("{{ kml_url }}");
{{ js_module }}.{{ dom_id }}.addOverlay({{ js_module }}.{{ dom_id }}_kml{{ forloop.counter }});{% endfor %}
@@ -26,4 +32,4 @@
alert("Sorry, the Google Maps API is not compatible with this browser.");
}
}
-{% endblock %}{% endautoescape %}
+{% endblock load %}{% endblock functions %}{% endautoescape %}
diff --git a/django/contrib/gis/templates/gis/google/google-multi.js b/django/contrib/gis/templates/gis/google/google-multi.js
index 49ce584e36..e3c7e8f02b 100644
--- a/django/contrib/gis/templates/gis/google/google-multi.js
+++ b/django/contrib/gis/templates/gis/google/google-multi.js
@@ -1,4 +1,4 @@
-{% extends "gis/google/google-base.js" %}
+{% extends "gis/google/google-map.js" %}
{% block functions %}
{{ load_map_js }}
{{ js_module }}.load = function(){
diff --git a/django/contrib/gis/templates/gis/google/google-single.js b/django/contrib/gis/templates/gis/google/google-single.js
index ab7901e42e..b930e4594f 100644
--- a/django/contrib/gis/templates/gis/google/google-single.js
+++ b/django/contrib/gis/templates/gis/google/google-single.js
@@ -1,2 +1,2 @@
-{% extends "gis/google/google-base.js" %}
-{% block functions %}{% include "gis/google/google-map.js" %}{% endblock %} \ No newline at end of file
+{% extends "gis/google/google-map.js" %}
+{% block vars %}{# No vars here because used within GoogleMapSet #}{% endblock %} \ No newline at end of file
diff --git a/django/contrib/gis/tests/relatedapp/models.py b/django/contrib/gis/tests/relatedapp/models.py
index 1125d7fb85..726f9826c0 100644
--- a/django/contrib/gis/tests/relatedapp/models.py
+++ b/django/contrib/gis/tests/relatedapp/models.py
@@ -40,5 +40,5 @@ class Author(models.Model):
class Book(models.Model):
title = models.CharField(max_length=100)
- author = models.ForeignKey(Author, related_name='books')
+ author = models.ForeignKey(Author, related_name='books', null=True)
objects = models.GeoManager()
diff --git a/django/contrib/gis/tests/relatedapp/tests.py b/django/contrib/gis/tests/relatedapp/tests.py
index 8c4f83b15a..502a3c0be9 100644
--- a/django/contrib/gis/tests/relatedapp/tests.py
+++ b/django/contrib/gis/tests/relatedapp/tests.py
@@ -257,6 +257,13 @@ class RelatedGeoModelTest(unittest.TestCase):
self.assertEqual(1, len(qs))
self.assertEqual(3, qs[0].num_books)
+ def test13_select_related_null_fk(self):
+ "Testing `select_related` on a nullable ForeignKey via `GeoManager`. See #11381."
+ no_author = Book.objects.create(title='Without Author')
+ b = Book.objects.select_related('author').get(title='Without Author')
+ # Should be `None`, and not a 'dummy' model.
+ self.assertEqual(None, b.author)
+
# TODO: Related tests for KML, GML, and distance lookups.
def suite():
diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index ac83756f31..10e97bbcd5 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -185,7 +185,11 @@ class RegexURLResolver(object):
try:
sub_match = pattern.resolve(new_path)
except Resolver404, e:
- tried.extend([(pattern.regex.pattern + ' ' + t) for t in e.args[0]['tried']])
+ sub_tried = e.args[0].get('tried')
+ if sub_tried is not None:
+ tried.extend([(pattern.regex.pattern + ' ' + t) for t in sub_tried])
+ else:
+ tried.append(pattern.regex.pattern)
else:
if sub_match:
sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()])
@@ -195,6 +199,7 @@ class RegexURLResolver(object):
return sub_match[0], sub_match[1], sub_match_dict
tried.append(pattern.regex.pattern)
raise Resolver404, {'tried': tried, 'path': new_path}
+ raise Resolver404, {'path' : path}
def _get_urlconf_module(self):
try: