From ff3423ca4cab29887f547189eaa1cf90a1988a6d Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Wed, 28 Feb 2007 05:09:20 +0000 Subject: [PATCH] newforms-admin: Merged to [4640] git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@4641 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/global_settings.py | 2 +- django/conf/locale/es/LC_MESSAGES/django.mo | Bin 38425 -> 40242 bytes django/conf/locale/es/LC_MESSAGES/django.po | 71 +++++++----------- django/conf/locale/sv/LC_MESSAGES/djangojs.mo | Bin 905 -> 1575 bytes django/conf/locale/sv/LC_MESSAGES/djangojs.po | 20 ++--- django/conf/project_template/settings.py | 2 +- django/conf/urls/admin_password_reset.py | 6 -- django/conf/urls/registration.py | 19 ----- django/template/__init__.py | 6 +- django/utils/datastructures.py | 7 ++ docs/authentication.txt | 8 +- docs/db-api.txt | 9 +++ docs/tutorial04.txt | 15 ++++ docs/url_dispatch.txt | 7 ++ .../datastructures/__init__.py | 0 .../regressiontests/datastructures/models.py | 0 tests/regressiontests/datastructures/tests.py | 34 +++++++++ tests/regressiontests/templates/tests.py | 25 +++++- 18 files changed, 145 insertions(+), 86 deletions(-) delete mode 100644 django/conf/urls/admin_password_reset.py delete mode 100644 django/conf/urls/registration.py create mode 100644 tests/regressiontests/datastructures/__init__.py create mode 100644 tests/regressiontests/datastructures/models.py create mode 100644 tests/regressiontests/datastructures/tests.py diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 5812b7e55e..148afe0e38 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -99,7 +99,7 @@ SERVER_EMAIL = 'root@localhost' SEND_BROKEN_LINK_EMAILS = False # Database connection info. -DATABASE_ENGINE = '' # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. +DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. DATABASE_NAME = '' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo index c7b992ae231ad289e4fdf4da26c15fb11f178729..8edce68c5373f5828bc09e0d572cf0823602b359 100644 GIT binary patch delta 11545 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 delta 10202 zcmZA530xKB8prWr6$E8dAw@+{Q4kRb_YDzH5ph9tM^q$~MRDIc=7PCo>d{;(HMhz& zJ(`ADmSwi-)#|ocR$k4l+vakuZhC+JGq0cg-1+$MeV%vb%)IYA@5})YR(WpNa>d2h|>fei(=Tn1VX4 zld02C9m_@?SA@Yh5q}g z%di2i$HsUB)v*hxVrKo0Q=z-9D$ml^Qe*i zfFXDTxqFsxg581ISe?2(YQ!0+^Jk;ZHw+!RP!WlGHXC(<`KYN{h1$OrHIkQ5Cpv+e zkyEG+yodVSN2v2$LS5h*?!#Ny7k9L@tahrg2wNpG|5{Y*6YUY~!y42lur8iK-NWy( z5&E>UI}nSyU;+kVN7Vk_SRczU8keJHa6i%q>j);{Wuy;QcoOqJm?V?daNLYt@d#>) zZ=+UoNU~)$#fMP0>Je;)t57pkg(-Lj^*K)pb)+8ZyzMXs`(YSPMXjMF4iY+JZ9>+c zbrv-ve<1&?;0NsscSqF|kUm+PF&odJZbki6`&L9_Tk3eMg=0~-ZYJv1EI`f3QXGhm z)g)RZS5ZB`j?*x(wfTT?De7LYGWAB}HDNuAS`*t%`!3@F)P;_sI(P!rk+)FSJ8Rbt z>vNJU8vcd4mo3`Zk7GyF393--Z(t~%#}K@1_WuWUfxD*mX87u8AgaAKreR$ifWuAu zi`Yod|6vkM%_kU$U!gAi15U>47>h+L-C%qIHG(ZjpRL`phW+I}!{UU0Bx@FO* z#Wx5ea3Sh?&tP>u|JzBl>i46j^f+pyC$Iy4h;=ZCA|9KfR)2rglop^yIsrBEiKd>3 z8ptE4^H-u4@fy_XKZaU=)-@7cpg~7_M=I(>V^KXVHT4wKh3A@jIci4MqHfVntcx$9 zjys1B;Mb^*{(*Wgcz3c5?!^47XOT2$>f^98w!tAd4ZGq$@F5Igr>3wNqi{Y};x?R* zab4^;-(KWNw9cbO>eH2#j}PKvJc?tmYZ~*f5pHLNr~|uE&-+o-i0+`Kux2-VM0HRd zXo8xd&RBq1s73jLX+MVg+?%F;A9ag9Mm?6Fqh{u32Z^S{Ki!_9+89RN5E+z}f>~IB ztV62`waBicru28zg}l1kZ^{7FKw?pA=s{FRvrxCBFZRKFv){3gL>GJ=H4`7>7`%Yo zE~_iku^;E6E|idIe}AWP_g~!!{MQD954h;aqHldrW->^|`-Lk6+K8_S50ONb23lgJYe>T=eQ?zk&y#_D{!n zJ^yP+n$U0pEAfh{OF6slkrM~vUQ9%<-b^c|;6Z#CHNtv1c86PIICTzc5f)-=T#vfW zS*(sXaWL0+-w--!4dKRUm2X2`=ugy$O!oC(@`CD zVhvn}y5J71kLOVL{AWzZz&w77!oGRTKQBLP9}T)E*RUzxL>_%Bk{hpkI}$bJGcf?S z8uy_ub(QgTR7XyuI{3b+zcPM{HEF+snxUHx5>5Rb)8ISEu7glh6pk8EW7LI{F$_DS zPS789!C|Q5@=>2FMIAp2b-_vu!nLM-2kLW<10?FeVbly9M@{`{<9XA50W~w

9P@ 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 Xa>Zn8a&e2Y@)lDHN}{F}&a(aozHJq` diff --git a/django/conf/locale/es/LC_MESSAGES/django.po b/django/conf/locale/es/LC_MESSAGES/django.po index 0fbea3c7ca..9c68183113 100644 --- a/django/conf/locale/es/LC_MESSAGES/django.po +++ b/django/conf/locale/es/LC_MESSAGES/django.po @@ -1,22 +1,22 @@ # translation of django.po to Castellano # This file is distributed under the same license as the PACKAGE package. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER. # # Ricardo Javier Cárdenes Medina , 2005. # Ricardo Javier Cardenes Medina , 2005. # AgarFu , 2007. +# Mario Gonzalez msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-02-24 17:08+0000\n" -"PO-Revision-Date: 2007-02-24 17:12+0000\n" +"PO-Revision-Date: 2007-02-24 18:02-0600\n" "Last-Translator: AgarFu \n" -"Language-Team: Castellano \n" +"Language-Team: Castellano \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: utils/dates.py:6 @@ -187,7 +187,7 @@ msgstr[1] "meses" msgid "week" msgid_plural "weeks" msgstr[0] "semana" -msgstr[1] "" +msgstr[1] "semanas" #: utils/timesince.py:15 msgid "day" @@ -209,23 +209,23 @@ msgstr[1] "minutos" #: utils/translation/trans_real.py:362 msgid "DATE_FORMAT" -msgstr "FORMATO_DE_FECHA" +msgstr "j N Y" #: utils/translation/trans_real.py:363 msgid "DATETIME_FORMAT" -msgstr "FORMATO_DE_FECHA_Y_HORA" +msgstr "j N Y P" #: utils/translation/trans_real.py:364 msgid "TIME_FORMAT" -msgstr "FORMATO_DE_HORA" +msgstr "P" #: utils/translation/trans_real.py:380 msgid "YEAR_MONTH_FORMAT" -msgstr "FORMATO_DE_AÑO_Y_MES" +msgstr "F Y" #: utils/translation/trans_real.py:381 msgid "MONTH_DAY_FORMAT" -msgstr "FORMATO_DE_MES_Y_DÍA" +msgstr "j \\de F" #: conf/global_settings.py:39 msgid "Arabic" @@ -340,9 +340,8 @@ msgid "Slovak" msgstr "Eslovaco" #: conf/global_settings.py:67 -#, fuzzy msgid "Slovenian" -msgstr "Eslovaco" +msgstr "Esloveno" #: conf/global_settings.py:68 msgid "Serbian" @@ -354,7 +353,7 @@ msgstr "Sueco" #: conf/global_settings.py:70 msgid "Tamil" -msgstr "" +msgstr "Tamil" #: conf/global_settings.py:71 msgid "Turkish" @@ -388,14 +387,12 @@ msgid "Please enter a valid %s." msgstr "Por favor, introduzca un %s válido." #: db/models/fields/related.py:642 -#, fuzzy msgid "Separate multiple IDs with commas." -msgstr " Separe múltiples IDs con comas." +msgstr "Separe múltiples IDs con comas." #: db/models/fields/related.py:644 -#, fuzzy msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "Pulse \"Control\" o \"Command\" en un Mac para escoger más de uno." +msgstr "Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar más de uno." #: db/models/fields/related.py:691 #, python-format @@ -462,9 +459,9 @@ msgid "Select a valid choice. %s is not one of the available choices." msgstr "Escoja una opción válida; '%s' no es una de las opciones disponibles." #: newforms/fields.py:101 newforms/fields.py:254 -#, fuzzy, python-format +#, python-format msgid "Ensure this value has at most %d characters." -msgstr "Asegúrese de que su texto tiene menos de %s carácter." +msgstr "Asegúrese de que su texto tiene a lo más %d caracteres." #: newforms/fields.py:103 newforms/fields.py:256 #, python-format @@ -478,7 +475,7 @@ msgstr "Introduzca un n #: newforms/fields.py:128 #, python-format msgid "Ensure this value is less than or equal to %s." -msgstr "Asegñurese de que este valor es menor o igual a %s." +msgstr "Asegúrese de que este valor es menor o igual a %s." #: newforms/fields.py:130 #, python-format @@ -533,11 +530,10 @@ msgid "This value must contain only letters, numbers and underscores." msgstr "Este valor debe contener sólo letras, números y guiones bajos." #: core/validators.py:68 -#, fuzzy msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." -msgstr "Este valor debe contener sólo letras, números, guiones bajos y barras (/)." +msgstr "Este valor debe contener letras, números, guiones bajos o barras solamente." #: core/validators.py:72 msgid "This value must contain only letters, numbers, underscores or hyphens." @@ -659,8 +655,8 @@ msgstr "Introduzca una abreviatura v #, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "¡Vigila tu boca! Aquí no admitimos la palabra %s." -msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s." +msgstr[0] "¡Cuida tu vocabulario! Aquí no admitimos la palabra %s." +msgstr[1] "¡Cuida tu vocabulario! Aquí no admitimos las palabras %s." #: core/validators.py:272 #, python-format @@ -690,9 +686,9 @@ msgid "Duplicate values are not allowed." msgstr "No se admiten valores duplicados." #: core/validators.py:364 -#, fuzzy, python-format +#, python-format msgid "This value must be between %(lower)s and %(upper)s." -msgstr "Este valor no debe ser mayor que %s." +msgstr "Este valor debe estar entre %(lower)s y %(upper)s." #: core/validators.py:367 #, python-format @@ -725,7 +721,7 @@ msgstr[1] "" "total." #: core/validators.py:423 -#, fuzzy, python-format +#, python-format msgid "Please enter a valid decimal number with a whole part of at most %s digit." msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." msgstr[0] "" @@ -901,13 +897,12 @@ msgid "template name" msgstr "nombre de plantilla" #: contrib/flatpages/models.py:13 -#, fuzzy msgid "" "Example: 'flatpages/contact_page.html'. If this isn't provided, the system " "will use 'flatpages/default.html'." msgstr "" -"Ejemplo: 'flatpages/contact_page'. Si no lo proporciona, el sistema usará " -"'flatpages/default'." +"Ejemplo: 'flatpages/contact_page.html'. Si no es proporcionado, el sistema usará " +"'flatpages/default.html'." #: contrib/flatpages/models.py:14 msgid "registration required" @@ -926,9 +921,8 @@ msgid "flat pages" msgstr "páginas estáticas" #: contrib/auth/views.py:39 -#, fuzzy msgid "Logged out" -msgstr "Terminar sesión" +msgstr "Sesión terminada" #: contrib/auth/models.py:38 contrib/auth/models.py:57 msgid "name" @@ -1225,12 +1219,10 @@ msgid "approved by staff" msgstr "aprobado por el staff" #: contrib/comments/models.py:176 -#, fuzzy msgid "free comment" msgstr "Comentario libre" #: contrib/comments/models.py:177 -#, fuzzy msgid "free comments" msgstr "Comentarios libres" @@ -1243,12 +1235,10 @@ msgid "score date" msgstr "fecha de la puntuación" #: contrib/comments/models.py:237 -#, fuzzy msgid "karma score" msgstr "Punto karma" #: contrib/comments/models.py:238 -#, fuzzy msgid "karma scores" msgstr "Puntos karma" @@ -1273,12 +1263,10 @@ msgid "flag date" msgstr "fecha de la marca" #: contrib/comments/models.py:268 -#, fuzzy msgid "user flag" msgstr "Marca de usuario" #: contrib/comments/models.py:269 -#, fuzzy msgid "user flags" msgstr "Marcas de usuario" @@ -1292,12 +1280,10 @@ msgid "deletion date" msgstr "fecha de eliminación" #: contrib/comments/models.py:280 -#, fuzzy msgid "moderator deletion" msgstr "Eliminación de moderador" #: contrib/comments/models.py:281 -#, fuzzy msgid "moderator deletions" msgstr "Eliminaciones de moderador" @@ -1758,7 +1744,7 @@ msgstr "Acci #: contrib/admin/templates/admin/object_history.html:26 msgid "DATE_WITH_TIME_FULL" -msgstr "FECHA_CON_TIEMP_COMPLETO" +msgstr "j M Y P" #: contrib/admin/templates/admin/object_history.html:36 msgid "" @@ -2330,9 +2316,8 @@ msgid "Add user" msgstr "Añadir usuario" #: contrib/admin/views/auth.py:57 -#, fuzzy msgid "Password changed successfully." -msgstr "Cambio de clave exitoso" +msgstr "La clave se ha cambiado exitosamente." #: contrib/admin/views/auth.py:64 #, python-format diff --git a/django/conf/locale/sv/LC_MESSAGES/djangojs.mo b/django/conf/locale/sv/LC_MESSAGES/djangojs.mo index c73aa305606de3a5745079f50baaef8b27af7bad..d099af156c0e2011302bd0c9d7f248b702f611ec 100644 GIT binary patch literal 1575 zcmaKr&u<(x6vy3CAYGt90U;2G7a=67YPLI}tAqwO1Zb z%JL6zgiD3EaY&K4a6qDGq~*?$6R6yJ;17UXzi)P@C!1^5UXXG#svi)}iZGeA(FN2Rk z_WuXu_^06XDmVx7{@dU=@O_Z&3n1rt4SXK_YG(fiL<-`2kiYu@M~1vl%cEc{b>x_CRZd~BV_L3sRYvNnQB=d83bdU^&)o8d z(~VV?*Avk(g)_Pz#g_LD!#%O9hVT+y>QF{|=&dEc8{eOO)~=?coN z$p<95749^qj<1nbs^sOKD%^CI^{Y^Ctp~%Fu8dW{L}Y$C4t)qX{WDcYRU3AKKfsyE zMv>fAp)}sLY4t!l?Hjvlq4r8Y(KNu|pq^KEMEY-hX`$7+lB5es z>l&qL`$~GTm9|=NOm@|w;h6vRyG-fjcDgY2+mvNYvLIb)W%QvRtcaRcQnzhv1g)s4m`60M|GNv7oRIB`0Og^#C~NjB2Ot()3=ZIuqb8kNo5 z4{tO&8=bY2i>J+2W5v6u91gBkC#SP8h0IkM21qur7G?xizj}Z_`V9sn#+A* zoNm)%&&0-#t%9`4x(~y$O>R^#%cX_uG@ULvnqQ){@oBQ-RbgUse3v$L?_s0tpO{vB zScBCz8r7Rx~Wf-U+Sp`zuW*Nwt4$QF*3~C?0;#dX;ECa(bFf$pLr*$y+KOM*z zp@$f0GKV$R3Uq<0K^7PTX^@3BKpNx_ zXDB}uNV5a^F+iFRNT&d4CLmo5q(K&zLFKD~G{`~CKpJQ?*fJmm)(a8`0g(CJV3sCC zGsqwi0O|pU1c(iC3>S!DrjV$Yt2g-vqk>pYesVU0Z)QqfW_m^mgI|7r9*`*C%+7p` zQNueiCp9l6wTR(xYhHR$B172WB{^9Nsd)+|nJEROdD$fl-XQIXllxeug*{Ue(-}N- Q^NZ4fMtG(lURuNe0Dx38LI3~& diff --git a/django/conf/locale/sv/LC_MESSAGES/djangojs.po b/django/conf/locale/sv/LC_MESSAGES/djangojs.po index 4d0c1e9034..c677dc7d9c 100644 --- a/django/conf/locale/sv/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/sv/LC_MESSAGES/djangojs.po @@ -21,7 +21,7 @@ msgstr "" #: contrib/admin/media/js/SelectFilter2.js:33 #, perl-format msgid "Available %s" -msgstr "" +msgstr "Tillgänglig %s" #: contrib/admin/media/js/SelectFilter2.js:41 #, fuzzy @@ -30,39 +30,39 @@ msgstr "Välj en tidpunkt" #: contrib/admin/media/js/SelectFilter2.js:46 msgid "Add" -msgstr "" +msgstr "Lägg till" #: contrib/admin/media/js/SelectFilter2.js:48 msgid "Remove" -msgstr "" +msgstr "Tag bort" #: contrib/admin/media/js/SelectFilter2.js:53 #, perl-format msgid "Chosen %s" -msgstr "" +msgstr "Valde %s" #: contrib/admin/media/js/SelectFilter2.js:54 msgid "Select your choice(s) and click " -msgstr "" +msgstr "Välj ditt/dina val och klicka " #: contrib/admin/media/js/SelectFilter2.js:59 msgid "Clear all" -msgstr "" +msgstr "Avmarkera alla" #: contrib/admin/media/js/dateparse.js:26 #: contrib/admin/media/js/calendar.js:24 msgid "" "January February March April May June July August September October November " "December" -msgstr "" +msgstr "Januari Februari Mars April Maj Juni Juli Augusti September Oktober November December" #: contrib/admin/media/js/dateparse.js:27 msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" -msgstr "" +msgstr "Söndag Mondag Tisdag Onsdag Torsdag Fredag Lördag" #: contrib/admin/media/js/calendar.js:25 msgid "S M T W T F S" -msgstr "" +msgstr "S M T O T F L" #: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 #: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 @@ -92,7 +92,7 @@ msgstr "Mitt pÃ¥ dagen" #: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 #: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 msgid "Cancel" -msgstr "Ã…ngra" +msgstr "Avbryt" #: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 #: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py index 4fc03c809b..d36553b84d 100644 --- a/django/conf/project_template/settings.py +++ b/django/conf/project_template/settings.py @@ -9,7 +9,7 @@ ADMINS = ( MANAGERS = ADMINS -DATABASE_ENGINE = '' # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. +DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. DATABASE_NAME = '' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. diff --git a/django/conf/urls/admin_password_reset.py b/django/conf/urls/admin_password_reset.py deleted file mode 100644 index afa078205a..0000000000 --- a/django/conf/urls/admin_password_reset.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.conf.urls.defaults import * - -urlpatterns = patterns('django.views', - (r'^$', 'registration.passwords.password_reset', {'is_admin_site' : True}), - (r'^done/$', 'registration.passwords.password_reset_done'), -) diff --git a/django/conf/urls/registration.py b/django/conf/urls/registration.py deleted file mode 100644 index 9b41e434f9..0000000000 --- a/django/conf/urls/registration.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.conf.urls.defaults import * - -urlpatterns = patterns('', - (r'^login/$', 'django.contrib.auth.views.login'), - (r'^logout/$', 'django.contrib.auth.views.logout'), - (r'^login_another/$', 'django.contrib.auth.views.logout_then_login'), - - (r'^register/$', 'ellington.registration.views.registration.signup'), - (r'^register/(?P\w{32})/$', 'ellington.registration.views.registration.register_form'), - - (r'^profile/$', 'ellington.registration.views.profile.profile'), - (r'^profile/welcome/$', 'ellington.registration.views.profile.profile_welcome'), - (r'^profile/edit/$', 'ellington.registration.views.profile.edit_profile'), - - (r'^password_reset/$', 'django.contrib.auth.views.password_reset'), - (r'^password_reset/done/$', 'django.contrib.auth.views.password_reset_done'), - (r'^password_change/$', 'django.contrib.auth.views.password_change'), - (r'^password_change/done/$', 'django.contrib.auth.views.password_change_done'), -) diff --git a/django/template/__init__.py b/django/template/__init__.py index 90fd13e1ce..678d19293c 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -667,7 +667,11 @@ def resolve_variable(path, context): except (TypeError, AttributeError): try: # list-index lookup current = current[int(bits[0])] - except (IndexError, ValueError, KeyError): + except (IndexError, # list index out of range + ValueError, # invalid literal for int() + KeyError, # current is a dict without `int(bits[0])` key + TypeError, # unsubscriptable object + ): raise VariableDoesNotExist("Failed lookup for key [%s] in %r", (bits[0], current)) # missing attribute except Exception, e: if getattr(e, 'silent_variable_failure', False): diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py index c20da05144..94ab76c483 100644 --- a/django/utils/datastructures.py +++ b/django/utils/datastructures.py @@ -16,6 +16,9 @@ class MergeDict(object): def __contains__(self, key): return self.has_key(key) + + def __copy__(self): + return self.__class__(*self.dicts) def get(self, key, default=None): try: @@ -42,6 +45,10 @@ class MergeDict(object): if dict.has_key(key): return True return False + + def copy(self): + """ returns a copy of this object""" + return self.__copy__() class SortedDict(dict): "A dictionary that keeps its keys in the order in which they're inserted." diff --git a/docs/authentication.txt b/docs/authentication.txt index f5736a3cd7..5186c5672c 100644 --- a/docs/authentication.txt +++ b/docs/authentication.txt @@ -86,10 +86,10 @@ objects in the same way as any other `Django model`_:: myuser.groups.add(group, group,...) myuser.groups.remove(group, group,...) myuser.groups.clear() - myuser.permissions = [permission_list] - myuser.permissions.add(permission, permission, ...) - myuser.permissions.remove(permission, permission, ...] - myuser.permissions.clear() + myuser.user_permissions = [permission_list] + myuser.user_permissions.add(permission, permission, ...) + myuser.user_permissions.remove(permission, permission, ...] + myuser.user_permissions.clear() In addition to those automatic API methods, ``User`` objects have the following custom methods: diff --git a/docs/db-api.txt b/docs/db-api.txt index 99bb30054b..3dc0efbabd 100644 --- a/docs/db-api.txt +++ b/docs/db-api.txt @@ -1621,6 +1621,15 @@ For example, this deletes all ``Entry`` objects with a ``pub_date`` year of Entry.objects.filter(pub_date__year=2005).delete() +When Django deletes an object, it emulates the behavior of the SQL +constraint ``ON DELETE CASCADE`` -- in other words, any objects which +had foreign keys pointing at the object to be deleted will be deleted +along with it. For example:: + + b = Blog.objects.get(pk=1) + # This will delete the Blog and all of its Entry objects. + b.delete() + Note that ``delete()`` is the only ``QuerySet`` method that is not exposed on a ``Manager`` itself. This is a safety mechanism to prevent you from accidentally requesting ``Entry.objects.delete()``, and deleting *all* the entries. If you diff --git a/docs/tutorial04.txt b/docs/tutorial04.txt index 7b19bdaeaf..b1c8c7d4fc 100644 --- a/docs/tutorial04.txt +++ b/docs/tutorial04.txt @@ -206,6 +206,21 @@ for the polls app, we manually specify a template name for the results view: ``template_name='polls/results.html'``. Otherwise, both views would use the same template. Note that we use ``dict()`` to return an altered dictionary in place. +.. note:: ``all()`` is lazy + + It might look a little frightening to see ``Poll.objects.all()`` being used + in a detail view which only needs one ``Poll`` object, but don't worry; + ``Poll.objects.all()`` is actually a special object called a ``QuerySet``, + which is "lazy" and doesn't hit your database until it absolutely has to. By + the time the database query happens, the ``object_detail`` generic view will + have narrowed its scope down to a single object, so the eventual query will + only select one row from the database. + + If you'd like to know more about how that works, The Django database API + documentation `explains the lazy nature of QuerySet objects`_. + +.. _explains the lazy nature of QuerySet objects: ../db_api/#querysets-are-lazy + In previous parts of the tutorial, the templates have been provided with a context that contains the ``poll`` and ``latest_poll_list`` context variables. However, the generic views provide the variables ``object`` and ``object_list`` as context. diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt index da4be2c746..3f51ce4b91 100644 --- a/docs/url_dispatch.txt +++ b/docs/url_dispatch.txt @@ -390,6 +390,13 @@ to pass metadata and options to views. .. _generic views: ../generic_views/ .. _syndication framework: ../syndication/ +.. admonition:: Dealing with conflicts + + It's possible to have a URL pattern which captures named keyword arguments, + and also passes arguments with the same names in its dictionary of extra + arguments. When this happens, the arguments in the dictionary will be used + instead of the arguments captured in the URL. + Passing extra options to ``include()`` -------------------------------------- diff --git a/tests/regressiontests/datastructures/__init__.py b/tests/regressiontests/datastructures/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/datastructures/models.py b/tests/regressiontests/datastructures/models.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py new file mode 100644 index 0000000000..624e7a50bf --- /dev/null +++ b/tests/regressiontests/datastructures/tests.py @@ -0,0 +1,34 @@ +""" +# Tests for stuff in django.utils.datastructures. + +>>> from django.utils.datastructures import * + +### MergeDict ################################################################# + +>>> d1 = {'chris':'cool','camri':'cute','cotton':'adorable','tulip':'snuggable', 'twoofme':'firstone'} +>>> d2 = {'chris2':'cool2','camri2':'cute2','cotton2':'adorable2','tulip2':'snuggable2'} +>>> d3 = {'chris3':'cool3','camri3':'cute3','cotton3':'adorable3','tulip3':'snuggable3'} +>>> d4 = {'twoofme':'secondone'} +>>> md = MergeDict( d1,d2,d3 ) +>>> md['chris'] +'cool' +>>> md['camri'] +'cute' +>>> md['twoofme'] +'firstone' +>>> md2 = md.copy() +>>> md2['chris'] +'cool' + +### MultiValueDict ########################################################## + +>>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']}) +>>> d['name'] +'Simon' +>>> d.getlist('name') +['Adrian', 'Simon'] +>>> d.get('lastname', 'nonexistent') +'nonexistent' +>>> d.setlist('lastname', ['Holovaty', 'Willison']) + +""" \ No newline at end of file diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 3bae6a2609..0165824951 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -127,6 +127,29 @@ class Templates(unittest.TestCase): # Fail silently when accessing a non-simple method 'basic-syntax20': ("{{ var.method2 }}", {"var": SomeClass()}, ("","INVALID")), + # List-index syntax allows a template to access a certain item of a subscriptable object. + 'list-index01': ("{{ var.1 }}", {"var": ["first item", "second item"]}, "second item"), + + # Fail silently when the list index is out of range. + 'list-index02': ("{{ var.5 }}", {"var": ["first item", "second item"]}, ("", "INVALID")), + + # Fail silently when the variable is not a subscriptable object. + 'list-index03': ("{{ var.1 }}", {"var": None}, ("", "INVALID")), + + # Fail silently when variable is a dict without the specified key. + 'list-index04': ("{{ var.1 }}", {"var": {}}, ("", "INVALID")), + + # Dictionary lookup wins out when dict's key is a string. + 'list-index05': ("{{ var.1 }}", {"var": {'1': "hello"}}, "hello"), + + # But list-index lookup wins out when dict's key is an int, which + # behind the scenes is really a dictionary lookup (for a dict) + # after converting the key to an int. + 'list-index06': ("{{ var.1 }}", {"var": {1: "hello"}}, "hello"), + + # Dictionary lookup wins out when there is a string and int version of the key. + 'list-index07': ("{{ var.1 }}", {"var": {'1': "hello", 1: "world"}}, "hello"), + # Basic filter usage 'basic-syntax21': ("{{ var|upper }}", {"var": "Django is the greatest!"}, "DJANGO IS THE GREATEST!"), @@ -167,7 +190,7 @@ class Templates(unittest.TestCase): 'basic-syntax33': (r'1{{ var.method3 }}2', {"var": SomeClass()}, ("12", "1INVALID2")), # In methods that raise an exception without a "silent_variable_attribute" set to True, - # the exception propogates + # the exception propagates 'basic-syntax34': (r'1{{ var.method4 }}2', {"var": SomeClass()}, SomeOtherException), # Escaped backslash in argument