8000 [soc2009/http-wsgi-improvements] Merged up to r11127 from trunk. · alex-python/django@4df7e8e · GitHub
[go: up one dir, main page]

Skip to content

Commit 4df7e8e

Browse files
committed
[soc2009/http-wsgi-improvements] Merged up to r11127 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/http-wsgi-improvements@11130 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent b0680a2 commit 4df7e8e

File tree

15 files changed

+67
-22
lines changed

15 files changed

+67
-22
lines changed

django/contrib/admindocs/views.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,22 @@ def model_detail(request, app_label, model_name):
214214
'help_text': field.help_text,
215215
})
216216

217+
# Gather many-to-many fields.
218+
for field in opts.many_to_many:
219+
data_type = related_object_name = field.rel.to.__name__
220+
app_label = field.rel.to._meta.app_label
221+
verbose = _("related `%(app_label)s.%(object_name)s` objects") % {'app_label': app_label, 'object_name': data_type}
222+
fields.append({
223+
'name': "%s.all" % field.name,
224+
"data_type": 'List',
225+
'verbose': utils.parse_rst(_("all %s") % verbose , 'model', _('model:') + opts.module_name),
226+
})
227+
fields.append({
228+
'name' : "%s.count" % field.name,
229+
'data_type' : 'Integer',
230+
'verbose' : utils.parse_rst(_("number of %s") % verbose , 'model', _('model:') + opts.module_name),
231+
})
232+
217233
# Gather model methods.
218234
for func_name, func in model.__dict__.items():
219235
if (inspect.isfunction(func) and len(inspect.getargspec(func)[0]) == 1):
@@ -233,7 +249,7 @@ def model_detail(request, app_label, model_name):
233249
})
234250

235251
# Gather related objects
236-
for rel in opts.get_all_related_objects():
252+
for rel in opts.get_all_related_objects() + opts.get_all_related_many_to_many_objects():
237253
verbose = _("related `%(app_label)s.%(object_name)s` objects") % {'app_label': rel.opts.app_label, 'object_name': rel.opts.object_name}
238254
accessor = rel.get_accessor_name()
239255
fields.append({

django/contrib/gis/admin/options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class GeoModelAdmin(ModelAdmin):
3232
map_height = 400
3333
map_srid = 4326
3434
map_template = 'gis/admin/openlayers.html'
35-
openlayers_url = 'http://openlayers.org/api/2.7/OpenLayers.js'
35+
openlayers_url = 'http://openlayers.org/api/2.8/OpenLayers.js'
3636
point_zoom = num_zoom - 6
3737
wms_url = 'http://labs.metacarta.com/wms/vmap0'
3838
wms_layer = 'basic'

django/contrib/gis/db/models/sql/query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def resolve_columns(self, row, fields=()):
225225
values.append(self.convert_values(value, field))
226226
else:
227227
values.extend(row[index_start:])
228-
return values
228+
return tuple(values)
229229

230230
def convert_values(self, value, field):
231231
"""

django/contrib/gis/maps/google/gmap.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class GoogleMap(object):
2121
def __init__(self, key=None, api_url=None, version=None,
2222
center=None, zoom=None, dom_id='map',
2323
kml_urls=[], polylines=None, polygons=None, markers=None,
24-
template='gis/google/google-single.js',
24+
template='gis/google/google-map.js',
2525
js_module='geodjango',
2626
extra_context={}):
2727

@@ -162,7 +162,7 @@ def __init__(self, *args, **kwargs):
162162

163163
# This is the template used to generate the GMap load JavaScript for
164164
# each map in the set.
165-
self.map_template = kwargs.pop('map_template', 'gis/google/google-map.js')
165+
self.map_template = kwargs.pop('map_template', 'gis/google/google-single.js')
166166

167167
# Running GoogleMap.__init__(), and resetting the template
168168
# value with default obtained above.

django/contrib/gis/templates/gis/google/google-base.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

django/contrib/gis/templates/gis/google/google-map.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
{% autoescape off %}
2+
{% block vars %}var geodjango = {};{% for icon in icons %}
3+
var {{ icon.varname }} = new GIcon(G_DEFAULT_ICON);
4+
{% if icon.image %}{{ icon.varname }}.image = "{{ icon.image }}";{% endif %}
5+
{% if icon.shadow %}{{ icon.varname }}.shadow = "{{ icon.shadow }}";{% endif %} {% if icon.shadowsize %}{{ icon.varname }}.shadowSize = new GSize({{ icon.shadowsize.0 }}, {{ icon.shadowsize.1 }});{% endif %}
6+
{% 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 %}
7+
{% if icon.infowindowanchor %}{{ icon.varname }}.infoWindowAnchor = new GPoint({{ icon.infowindowanchor.0 }}, {{ icon.infowindowanchor.1 }});{% endif %}{% endfor %}
8+
{% endblock vars %}{% block functions %}
29
{% block load %}{{ js_module }}.{{ dom_id }}_load = function(){
310
if (GBrowserIsCompatible()) {
411
{{ js_module }}.{{ dom_id }} = new GMap2(document.getElementById("{{ dom_id }}"));
512
{{ js_module }}.{{ dom_id }}.setCenter(new GLatLng({{ center.1 }}, {{ center.0 }}), {{ zoom }});
6-
{% block controls %}{{ js_module }}.{{ dom_id }}.addControl(new GSmallMapControl());
7-
{{ js_module }}.{{ dom_id }}.addControl(new GMapTypeControl());{% endblock %}
13+
{% block controls %}{{ js_module }}.{{ dom_id }}.setUIToDefault();{% endblock %}
814
{% if calc_zoom %}var bounds = new GLatLngBounds(); var tmp_bounds = new GLatLngBounds();{% endif %}
915
{% for kml_url in kml_urls %}{{ js_module }}.{{ dom_id }}_kml{{ forloop.counter }} = new GGeoXml("{{ kml_url }}");
1016
{{ js_module }}.{{ dom_id }}.addOverlay({{ js_module }}.{{ dom_id }}_kml{{ forloop.counter }});{% endfor %}
@@ -26,4 +32,4 @@
2632
alert("Sorry, the Google Maps API is not compatible with this browser.");
2733
}
2834
}
29-
{% endblock %}{% endautoescape %}
35+
{% endblock load %}{% endblock functions %}{% endautoescape %}

django/contrib/gis/templates/gis/google/google-multi.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends "gis/google/google-base.js" %}
1+
{% extends "gis/google/google-map.js" %}
22
{% block functions %}
33
{{ load_map_js }}
44
{{ js_module }}.load = function(){
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
{% extends "gis/google/google-base.js" %}
2-
{% block functions %}{% include "gis/google/google-map.js" %}{% endblock %}
1+
{% extends "gis/google/google-map.js" %}
2+
{% block vars %}{# No vars here because used within GoogleMapSet 1C72 #}{% endblock %}

django/contrib/gis/tests/relatedapp/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ class Author(models.Model):
4040

4141
class Book(models.Model):
4242
title = models.CharField(max_length=100)
43-
author = models.ForeignKey(Author, related_name='books')
43+
author = models.ForeignKey(Author, related_name='books', null=True)
4444
objects = models.GeoManager()

django/contrib/gis/tests/relatedapp/tests.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,13 @@ def test12_count(self):
257257
self.assertEqual(1, len(qs))
258258
self.assertEqual(3, qs[0].num_books)
259259

260+
def test13_select_related_null_fk(self):
261+
"Testing `select_related` on a nullable ForeignKey via `GeoManager`. See #11381."
262+
no_author = Book.objects.create(title='Without Author')
263+
b = Book.objects.select_related('author').get(title='Without Author')
264+
# Should be `None`, and not a 'dummy' model.
265+
self.assertEqual(None, b.author)
266+
260267
# TODO: Related tests for KML, GML, and distance lookups.
261268

262269
def suite():

django/core/urlresolvers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ def resolve(self, path):
195195
return sub_match[0], sub_match[1], sub_match_dict
196196
tried.append(pattern.regex.pattern)
197197
raise Resolver404, {'tried': tried, 'path': new_path}
198+
raise Resolver404, {'tried': [], 'path' : path}
198199

199200
def _get_urlconf_module(self):
200201
try:

tests/modeltests/transactions/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class Reporter(models.Model):
1414
last_name = models.CharField(max_length=30)
1515
email = models.EmailField()
1616

17+
class Meta:
18+
ordering = ('first_name', 'last_name')
19+
1720
def __unicode__(self):
1821
return u"%s %s" % (self.first_name, self.last_name)
1922

tests/regressiontests/null_fk/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ class Comment(models.Model):
2222
post = models.ForeignKey(Post, null=True)
2323
comment_text = models.CharField(max_length=250)
2424

25+
class Meta:
26+
ordering = ('comment_text',)
27+
2528
def __unicode__(self):
2629
return self.comment_text
2730

tests/regressiontests/serializers_regress/tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,15 @@ def data_compare(testcase, pk, klass, data):
103103
def generic_compare(testcase, pk, klass, data):
104104
instance = klass.objects.get(id=pk)
105105
testcase.assertEqual(data[0], instance.data)
106-
testcase.assertEqual(data[1:], [t.data for t in instance.tags.all()])
106+
testcase.assertEqual(data[1:], [t.data for t in instance.tags.order_by('id')])
107107

108108
def fk_compare(testcase, pk, klass, data):
109109
instance = klass.objects.get(id=pk)
110110
testcase.assertEqual(data, instance.data_id)
111111

112112
def m2m_compare(testcase, pk, klass, data):
113113
instance = klass.objects.get(id=pk)
114-
testcase.assertEqual(data, [obj.id for obj in instance.data.all()])
114+
testcase.assertEqual(data, [obj.id for obj in instance.data.order_by('id')])
115115

116116
def im2m_compare(testcase, pk, klass, data):
117117
instance = klass.objects.get(id=pk)

tests/regressiontests/urlpatterns_reverse/tests.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
ImproperlyConfigured: The included urlconf regressiontests.urlpatterns_reverse.no_urls doesn't have any patterns in it
1515
"""}
1616

17+
import unittest
1718

18-
from django.core.urlresolvers import reverse, NoReverseMatch
19+
from django.core.urlresolvers import reverse, resolve, NoReverseMatch, Resolver404
1920
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
2021
from django.shortcuts import redirect
2122
from django.test import TestCase
@@ -112,6 +113,21 @@ def test_urlpattern_reverse(self):
112113
else:
113114
self.assertEquals(got, expected)
114115

116+
class ResolverTests(unittest.TestCase):
117+
def test_non_regex(self):
118+
"""
119+
Verifies that we raise a Resolver404 if what we are resolving doesn't
120+
meet the basic requirements of a path to match - i.e., at the very
121+
least, it matches the root pattern '^/'. We must never return None
122+
from resolve, or we will get a TypeError further down the line.
123+
124+
Regression for #10834.
125+
"""
126+
self.assertRaises(Resolver404, resolve, '')
127+
self.assertRaises(Resolver404, resolve, 'a')
128+
self.assertRaises(Resolver404, resolve, '\\')
129+
self.assertRaises(Resolver404, resolve, '.')
130+
115131
class ReverseShortcutTests(TestCase):
116132
urls = 'regressiontests.urlpatterns_reverse.urls'
117133

0 commit comments

Comments
 (0)
0