From 453d560a945d207013b163228de5ed9a7316a772 Mon Sep 17 00:00:00 2001 From: Brian Rosner Date: Sat, 7 Jun 2008 17:10:16 +0000 Subject: [PATCH] newforms-admin: Merged from trunk up to [7583]. git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@7584 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 7 +- django/conf/locale/ca/LC_MESSAGES/django.mo | Bin 67276 -> 67276 bytes django/conf/locale/ca/LC_MESSAGES/django.po | 109 ++++--- django/conf/locale/es/LC_MESSAGES/django.mo | Bin 62789 -> 62520 bytes django/conf/locale/es/LC_MESSAGES/django.po | 182 +++++------ django/conf/locale/it/LC_MESSAGES/django.mo | Bin 66460 -> 66449 bytes django/conf/locale/it/LC_MESSAGES/django.po | 9 +- django/conf/locale/sv/LC_MESSAGES/django.mo | Bin 57255 -> 57325 bytes django/conf/locale/sv/LC_MESSAGES/django.po | 293 +++++++++--------- django/core/management/commands/syncdb.py | 4 +- django/core/management/sql.py | 21 +- django/db/models/fields/related.py | 49 ++- django/db/transaction.py | 10 +- django/template/__init__.py | 8 +- django/template/defaulttags.py | 2 +- django/template/loader.py | 5 +- django/template/loaders/eggs.py | 2 +- django/test/client.py | 14 +- django/test/testcases.py | 12 + django/utils/text.py | 22 +- docs/db-api.txt | 7 +- docs/flatpages.txt | 11 + docs/outputting_pdf.txt | 3 + docs/serialization.txt | 2 +- docs/testing.txt | 16 +- docs/url_dispatch.txt | 4 +- tests/modeltests/basic/models.py | 5 +- tests/modeltests/one_to_one/models.py | 5 +- tests/modeltests/or_lookups/models.py | 5 +- .../test_client/fixtures/testdata.json | 18 ++ tests/regressiontests/defaultfilters/tests.py | 18 +- .../many_to_one_regress/models.py | 46 ++- .../one_to_one_regress/models.py | 54 ++++ tests/regressiontests/queries/models.py | 5 +- tests/regressiontests/templates/loaders.py | 92 ++++++ tests/regressiontests/templates/tests.py | 7 +- .../fixtures/testdata.json | 36 +++ .../test_client_regress/models.py | 29 ++ .../test_client_regress/urls.py | 1 + .../test_client_regress/views.py | 14 + tests/runtests.py | 9 +- 41 files changed, 763 insertions(+), 373 deletions(-) create mode 100644 tests/regressiontests/templates/loaders.py diff --git a/AUTHORS b/AUTHORS index fe4755b8d5..ce4643ac59 100644 --- a/AUTHORS +++ b/AUTHORS @@ -68,7 +68,7 @@ answer newbie questions, and generally made Django that much better: Esdras Beleza Chris Bennett James Bennett - Ben + Ben Godfrey Arvis Bickovskis Paul Bissex Simon Blanchard @@ -79,7 +79,7 @@ answer newbie questions, and generally made Django that much better: brut.alll@gmail.com btoll@bestweb.net Jonathan Buchanan - Can Burak Çilingir + Juan Manuel Caicedo Trevor Caira Ricardo Javier Cárdenes Medina Graham Carlyle @@ -93,6 +93,7 @@ answer newbie questions, and generally made Django that much better: ivan.chelubeev@gmail.com Bryan Chow Michal Chruszcz + Can Burak Çilingir Ian Clelland Russell Cloran colin@owlfish.com @@ -142,6 +143,7 @@ answer newbie questions, and generally made Django that much better: Bill Fenner Stefane Fermgier Afonso Fernández Nogueira + J. Pablo Fernandez Matthew Flanagan Eric Floehr Vincent Foley @@ -373,6 +375,7 @@ answer newbie questions, and generally made Django that much better: George Vilches Vlado Milton Waddams + Chris Wagner wam-djangobug@wamber.net Wang Chun Filip Wasilewski diff --git a/django/conf/locale/ca/LC_MESSAGES/django.mo b/django/conf/locale/ca/LC_MESSAGES/django.mo index fe790857066dbbec575e76be030cdafc9c077169..4f61dfbbcd288496f6b914c1ba8cdbec02c44467 100644 GIT binary patch delta 28 kcmX@p%W|fdWy8&-ycW6!rn*LE3Wf$&#-^K}Eq#^%0G}!f`~Uy| delta 28 kcmX@p%W|fdWy8&-yym(FM!JTk3I+yN1_qm-Eq#^%0G^c!?EnA( diff --git a/django/conf/locale/ca/LC_MESSAGES/django.po b/django/conf/locale/ca/LC_MESSAGES/django.po index 0b216f757c..36511eb58c 100644 --- a/django/conf/locale/ca/LC_MESSAGES/django.po +++ b/django/conf/locale/ca/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-02-15 00:00+0200\n" +"POT-Creation-Date: 2008-05-26 10:35+0200\n" "PO-Revision-Date: 2008-05-14 11:15+0200\n" "Last-Translator: Django Catalan Group \n" "Language-Team: Catalan \n" @@ -14,191 +14,191 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: conf/global_settings.py:39 +#: conf/global_settings.py:43 msgid "Arabic" msgstr "Arabic" -#: conf/global_settings.py:40 +#: conf/global_settings.py:44 msgid "Bengali" msgstr "Bengalí" -#: conf/global_settings.py:41 +#: conf/global_settings.py:45 msgid "Bulgarian" msgstr "Búlgar" -#: conf/global_settings.py:42 +#: conf/global_settings.py:46 msgid "Catalan" msgstr "Català" -#: conf/global_settings.py:43 +#: conf/global_settings.py:47 msgid "Czech" msgstr "Txec" -#: conf/global_settings.py:44 +#: conf/global_settings.py:48 msgid "Welsh" msgstr "Galès" -#: conf/global_settings.py:45 +#: conf/global_settings.py:49 msgid "Danish" msgstr "Danès" -#: conf/global_settings.py:46 +#: conf/global_settings.py:50 msgid "German" msgstr "Alemany" -#: conf/global_settings.py:47 +#: conf/global_settings.py:51 msgid "Greek" msgstr "Grec" -#: conf/global_settings.py:48 +#: conf/global_settings.py:52 msgid "English" msgstr "Anglès" -#: conf/global_settings.py:49 +#: conf/global_settings.py:53 msgid "Spanish" msgstr "Espanyol" -#: conf/global_settings.py:50 +#: conf/global_settings.py:54 msgid "Argentinean Spanish" msgstr "Castellà Argentí" -#: conf/global_settings.py:51 +#: conf/global_settings.py:55 msgid "Basque" msgstr "Euskera" -#: conf/global_settings.py:52 +#: conf/global_settings.py:56 msgid "Persian" msgstr "Persa" -#: conf/global_settings.py:53 +#: conf/global_settings.py:57 msgid "Finnish" msgstr "Finlandès" -#: conf/global_settings.py:54 +#: conf/global_settings.py:58 msgid "French" msgstr "Francès" -#: conf/global_settings.py:55 +#: conf/global_settings.py:59 msgid "Irish" msgstr "Irlandès" -#: conf/global_settings.py:56 +#: conf/global_settings.py:60 msgid "Galician" msgstr "Gallec" -#: conf/global_settings.py:57 +#: conf/global_settings.py:61 msgid "Hungarian" msgstr "Húngar" -#: conf/global_settings.py:58 +#: conf/global_settings.py:62 msgid "Hebrew" msgstr "Hebreu" -#: conf/global_settings.py:59 +#: conf/global_settings.py:63 msgid "Croatian" msgstr "Croat" -#: conf/global_settings.py:60 +#: conf/global_settings.py:64 msgid "Icelandic" msgstr "Islandès" -#: conf/global_settings.py:61 +#: conf/global_settings.py:65 msgid "Italian" msgstr "Italià" -#: conf/global_settings.py:62 +#: conf/global_settings.py:66 msgid "Japanese" msgstr "Japonès" -#: conf/global_settings.py:63 +#: conf/global_settings.py:67 msgid "Georgian" msgstr "Georgià" -#: conf/global_settings.py:64 +#: conf/global_settings.py:68 msgid "Korean" msgstr "Coreà" -#: conf/global_settings.py:65 +#: conf/global_settings.py:69 msgid "Khmer" msgstr "Khmer" -#: conf/global_settings.py:66 +#: conf/global_settings.py:70 msgid "Kannada" msgstr "Canès" -#: conf/global_settings.py:67 +#: conf/global_settings.py:71 msgid "Latvian" msgstr "Letó" -#: conf/global_settings.py:68 +#: conf/global_settings.py:72 msgid "Macedonian" msgstr "Macedoni" -#: conf/global_settings.py:69 +#: conf/global_settings.py:73 msgid "Dutch" msgstr "Holandès" -#: conf/global_settings.py:70 +#: conf/global_settings.py:74 msgid "Norwegian" msgstr "Norueg" -#: conf/global_settings.py:71 +#: conf/global_settings.py:75 msgid "Polish" msgstr "Polac" -#: conf/global_settings.py:72 +#: conf/global_settings.py:76 msgid "Portugese" msgstr "Portuguès" -#: conf/global_settings.py:73 +#: conf/global_settings.py:77 msgid "Brazilian Portuguese" msgstr "Portuguès de Brasil" -#: conf/global_settings.py:74 +#: conf/global_settings.py:78 msgid "Romanian" msgstr "Rumanès" -#: conf/global_settings.py:75 +#: conf/global_settings.py:79 msgid "Russian" msgstr "Rús" -#: conf/global_settings.py:76 +#: conf/global_settings.py:80 msgid "Slovak" msgstr "Eslovac" -#: conf/global_settings.py:77 +#: conf/global_settings.py:81 msgid "Slovenian" msgstr "Esloveni" -#: conf/global_settings.py:78 +#: conf/global_settings.py:82 msgid "Serbian" msgstr "Serbi" -#: conf/global_settings.py:79 +#: conf/global_settings.py:83 msgid "Swedish" msgstr "Suec" -#: conf/global_settings.py:80 +#: conf/global_settings.py:84 msgid "Tamil" msgstr "Tàmil" -#: conf/global_settings.py:81 +#: conf/global_settings.py:85 msgid "Telugu" msgstr "Telugu" -#: conf/global_settings.py:82 +#: conf/global_settings.py:86 msgid "Turkish" msgstr "Turc" -#: conf/global_settings.py:83 +#: conf/global_settings.py:87 msgid "Ukrainian" msgstr "Ucranià" -#: conf/global_settings.py:84 +#: conf/global_settings.py:88 msgid "Simplified Chinese" msgstr "Xinès simplificat" -#: conf/global_settings.py:85 +#: conf/global_settings.py:89 msgid "Traditional Chinese" msgstr "Xinès tradicional" @@ -829,17 +829,17 @@ msgstr "" "'cookies' (galetes). Si us plau, habiliteu les 'cookies', recarregueu " "aquesta pàgina i proveu-ho de nou. " -#: contrib/admin/views/decorators.py:90 -msgid "Usernames cannot contain the '@' character." -msgstr "Els noms d'usuari no poden contenir el caracter '@'." - -#: contrib/admin/views/decorators.py:92 +#: contrib/admin/views/decorators.py:89 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "" "La vostra adreça de correu no és el vostre nom d'usuari. Provi '%s' en tot " "cas." +#: contrib/admin/views/decorators.py:93 +msgid "Usernames cannot contain the '@' character." +msgstr "Els noms d'usuari no poden contenir el caracter '@'." + #: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50 #: contrib/admin/views/doc.py:52 msgid "tag:" @@ -4038,8 +4038,7 @@ msgstr "Aquesta URL sembla ser un enllaç trencat." #: newforms/fields.py:560 newforms/models.py:299 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" -"Escolli una opció vàlida; Aquesta opció no és una de les opcions " -"disponibles." +"Escolli una opció vàlida; Aquesta opció no és una de les opcions disponibles." #: newforms/fields.py:599 #, python-format diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo index 485a77160a9f192f81193aac886ab579b0e25283..9437a3b4831f30c9699e0df5cff4e3324c5ca79d 100644 GIT binary patch delta 18977 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 delta 19159 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 qNOWvS%%Gl;0~t1?Tin2b\n" "Language-Team: Spanish \n" @@ -14,191 +14,192 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: conf/global_settings.py:39 +#: conf/global_settings.py:43 msgid "Arabic" msgstr "Árabe" -#: conf/global_settings.py:40 +#: conf/global_settings.py:44 msgid "Bengali" msgstr "Bengalí" -#: conf/global_settings.py:41 +#: conf/global_settings.py:45 msgid "Bulgarian" msgstr "Búlgaro" -#: conf/global_settings.py:42 +#: conf/global_settings.py:46 msgid "Catalan" msgstr "Catalán" -#: conf/global_settings.py:43 +#: conf/global_settings.py:47 msgid "Czech" msgstr "Checo" -#: conf/global_settings.py:44 +#: conf/global_settings.py:48 msgid "Welsh" msgstr "Galés" -#: conf/global_settings.py:45 +#: conf/global_settings.py:49 msgid "Danish" msgstr "Danés" -#: conf/global_settings.py:46 +#: conf/global_settings.py:50 msgid "German" msgstr "Alemán" -#: conf/global_settings.py:47 +#: conf/global_settings.py:51 msgid "Greek" msgstr "Griego" -#: conf/global_settings.py:48 +#: conf/global_settings.py:52 msgid "English" msgstr "Inglés" -#: conf/global_settings.py:49 +#: conf/global_settings.py:53 msgid "Spanish" msgstr "Español" -#: conf/global_settings.py:50 +#: conf/global_settings.py:54 msgid "Argentinean Spanish" msgstr "Español Argentino" -#: conf/global_settings.py:51 +#: conf/global_settings.py:55 msgid "Basque" msgstr "Vasco" -#: conf/global_settings.py:52 +#: conf/global_settings.py:56 msgid "Persian" msgstr "Persa" -#: conf/global_settings.py:53 +#: conf/global_settings.py:57 msgid "Finnish" msgstr "Finés" -#: conf/global_settings.py:54 +#: conf/global_settings.py:58 msgid "French" msgstr "Francés" -#: conf/global_settings.py:55 +#: conf/global_settings.py:59 msgid "Irish" msgstr "Irlandés" -#: conf/global_settings.py:56 +#: conf/global_settings.py:60 msgid "Galician" msgstr "Gallego" -#: conf/global_settings.py:57 +#: conf/global_settings.py:61 msgid "Hungarian" msgstr "Húngaro" -#: conf/global_settings.py:58 +#: conf/global_settings.py:62 msgid "Hebrew" msgstr "Hebreo" -#: conf/global_settings.py:59 +#: conf/global_settings.py:63 msgid "Croatian" msgstr "Croata" -#: conf/global_settings.py:60 +#: conf/global_settings.py:64 msgid "Icelandic" msgstr "Islandés" -#: conf/global_settings.py:61 +#: conf/global_settings.py:65 msgid "Italian" msgstr "Italiano" -#: conf/global_settings.py:62 +#: conf/global_settings.py:66 msgid "Japanese" msgstr "Japonés" -#: conf/global_settings.py:63 +#: conf/global_settings.py:67 msgid "Georgian" msgstr "Georgiano" -#: conf/global_settings.py:64 +#: conf/global_settings.py:68 msgid "Korean" msgstr "Koreano" -#: conf/global_settings.py:65 +#: conf/global_settings.py:69 msgid "Khmer" msgstr "Khmer" -#: conf/global_settings.py:66 +#: conf/global_settings.py:70 msgid "Kannada" msgstr "Kannada" -#: conf/global_settings.py:67 +#: conf/global_settings.py:71 msgid "Latvian" msgstr "Latvio" -#: conf/global_settings.py:68 +#: conf/global_settings.py:72 msgid "Macedonian" msgstr "Macedonio" -#: conf/global_settings.py:69 +#: conf/global_settings.py:73 msgid "Dutch" msgstr "Alemán" -#: conf/global_settings.py:70 +#: conf/global_settings.py:74 msgid "Norwegian" msgstr "Noruego" -#: conf/global_settings.py:71 +#: conf/global_settings.py:75 msgid "Polish" msgstr "Polaco" -#: conf/global_settings.py:72 +#: conf/global_settings.py:76 msgid "Portugese" msgstr "Portugés" -#: conf/global_settings.py:73 -msgid "Brazilian" -msgstr "Brasileño" +#: conf/global_settings.py:77 +#, fuzzy +msgid "Brazilian Portuguese" +msgstr "Portugés" -#: conf/global_settings.py:74 +#: conf/global_settings.py:78 msgid "Romanian" msgstr "Rumano" -#: conf/global_settings.py:75 +#: conf/global_settings.py:79 msgid "Russian" msgstr "Ruso" -#: conf/global_settings.py:76 +#: conf/global_settings.py:80 msgid "Slovak" msgstr "Eslovaco" -#: conf/global_settings.py:77 +#: conf/global_settings.py:81 msgid "Slovenian" msgstr "Esloveno" -#: conf/global_settings.py:78 +#: conf/global_settings.py:82 msgid "Serbian" msgstr "Serbio" -#: conf/global_settings.py:79 +#: conf/global_settings.py:83 msgid "Swedish" msgstr "Sueco" -#: conf/global_settings.py:80 +#: conf/global_settings.py:84 msgid "Tamil" msgstr "Tamil" -#: conf/global_settings.py:81 +#: conf/global_settings.py:85 msgid "Telugu" msgstr "Telugu" -#: conf/global_settings.py:82 +#: conf/global_settings.py:86 msgid "Turkish" msgstr "Turco" -#: conf/global_settings.py:83 +#: conf/global_settings.py:87 msgid "Ukrainian" msgstr "Ucraniano" -#: conf/global_settings.py:84 +#: conf/global_settings.py:88 msgid "Simplified Chinese" msgstr "Chino simplificado" -#: conf/global_settings.py:85 +#: conf/global_settings.py:89 msgid "Traditional Chinese" msgstr "Chino tradicional" @@ -828,17 +829,17 @@ msgstr "" "Parece que su navegador no está configurado para aceptar cookies. Actívelas " "por favor, recargue esta página, e inténtelo de nuevo." -#: contrib/admin/views/decorators.py:90 -msgid "Usernames cannot contain the '@' character." -msgstr "Los nombres de usuario no pueden contener el carácter '@'." - -#: contrib/admin/views/decorators.py:92 +#: contrib/admin/views/decorators.py:89 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "" "Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su " "lugar." +#: contrib/admin/views/decorators.py:93 +msgid "Usernames cannot contain the '@' character." +msgstr "Los nombres de usuario no pueden contener el carácter '@'." + #: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50 #: contrib/admin/views/doc.py:52 msgid "tag:" @@ -962,7 +963,7 @@ msgstr "Texto" msgid "Time" msgstr "Hora" -#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7 +#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8 msgid "URL" msgstr "URL" @@ -1021,7 +1022,7 @@ msgstr "No ha cambiado ningún campo." #: contrib/admin/views/main.py:354 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "Se modificó con éxito el %(name)s \"%(obj)s." +msgstr "Se modificó con éxito el %(name)s \"%(obj)s\"." #: contrib/admin/views/main.py:362 #, python-format @@ -1069,7 +1070,7 @@ msgstr "Escoja %s" msgid "Select %s to change" msgstr "Escoja %s para modificar" -#: contrib/admin/views/main.py:784 +#: contrib/admin/views/main.py:765 msgid "Database error" msgstr "Error en la base de datos" @@ -1190,8 +1191,9 @@ msgid "active" msgstr "activo" #: contrib/auth/models.py:137 +#, fuzzy msgid "" -"Designates whether this user can log into the Django admin. Unselect this " +"Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "" "Indica si el usuario puede entrar en este sitio de administración. Desmarque " @@ -1569,30 +1571,30 @@ msgstr "tipo de contenido" msgid "content types" msgstr "tipos de contenido" -#: contrib/flatpages/models.py:8 +#: contrib/flatpages/models.py:9 msgid "" "Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "" "Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al " "final." -#: contrib/flatpages/models.py:9 +#: contrib/flatpages/models.py:10 msgid "title" msgstr "título" -#: contrib/flatpages/models.py:10 +#: contrib/flatpages/models.py:11 msgid "content" msgstr "contenido" -#: contrib/flatpages/models.py:11 +#: contrib/flatpages/models.py:12 msgid "enable comments" msgstr "admitir comentarios" -#: contrib/flatpages/models.py:12 +#: contrib/flatpages/models.py:13 msgid "template name" msgstr "nombre de plantilla" -#: contrib/flatpages/models.py:13 +#: contrib/flatpages/models.py:14 msgid "" "Example: 'flatpages/contact_page.html'. If this isn't provided, the system " "will use 'flatpages/default.html'." @@ -1600,23 +1602,23 @@ msgstr "" "Ejemplo: 'flatpages/contact_page.html'. Si no es proporcionado, el sistema " "usará 'flatpages/default.html'." -#: contrib/flatpages/models.py:14 +#: contrib/flatpages/models.py:15 msgid "registration required" msgstr "debe estar registrado" -#: contrib/flatpages/models.py:14 +#: contrib/flatpages/models.py:15 msgid "If this is checked, only logged-in users will be able to view the page." msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." -#: contrib/flatpages/models.py:18 +#: contrib/flatpages/models.py:20 msgid "flat page" msgstr "página estática" -#: contrib/flatpages/models.py:19 +#: contrib/flatpages/models.py:21 msgid "flat pages" msgstr "páginas estáticas" -#: contrib/flatpages/models.py:24 +#: contrib/flatpages/models.py:27 msgid "Advanced options" msgstr "Opciones avanzadas" @@ -1770,8 +1772,8 @@ msgstr "Introduzca un código postal en el formato XXX XXX." #: contrib/localflavor/ca/forms.py:88 msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format." msgstr "" -"Introduzca un Número del Seguro Social de Canada válido en el formato XXX-XXX-" -"XXX." +"Introduzca un Número del Seguro Social de Canada válido en el formato XXX-" +"XXX-XXX." #: contrib/localflavor/ch/ch_states.py:5 msgid "Aargau" @@ -3628,7 +3630,7 @@ msgstr "El año debe ser 1900 o posterior." msgid "Invalid date: %s" msgstr "Fecha no válida: %s" -#: core/validators.py:156 db/models/fields/__init__.py:527 +#: core/validators.py:156 db/models/fields/__init__.py:548 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Introduzca una fecha válida en formato AAAA-MM-DD." @@ -3636,7 +3638,7 @@ msgstr "Introduzca una fecha válida en formato AAAA-MM-DD." msgid "Enter a valid time in HH:MM format." msgstr "Introduzca una hora válida en formato HH:MM." -#: core/validators.py:165 db/models/fields/__init__.py:604 +#: core/validators.py:165 db/models/fields/__init__.py:625 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM." @@ -3897,58 +3899,58 @@ msgstr "" msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "%(object)s de este %(type)s ya existen en este %(field)s." -#: db/models/fields/__init__.py:52 +#: db/models/fields/__init__.py:54 #, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "Ya existe %(optname)s con este %(fieldname)s." -#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:327 -#: db/models/fields/__init__.py:759 db/models/fields/__init__.py:770 +#: db/models/fields/__init__.py:179 db/models/fields/__init__.py:348 +#: db/models/fields/__init__.py:780 db/models/fields/__init__.py:791 #: newforms/fields.py:46 oldforms/__init__.py:374 msgid "This field is required." msgstr "Este campo es obligatorio." -#: db/models/fields/__init__.py:427 +#: db/models/fields/__init__.py:448 msgid "This value must be an integer." msgstr "Este valor debe ser un entero." -#: db/models/fields/__init__.py:466 +#: db/models/fields/__init__.py:487 msgid "This value must be either True or False." msgstr "Este valor debe ser Verdadero o Falso." -#: db/models/fields/__init__.py:490 +#: db/models/fields/__init__.py:511 msgid "This field cannot be null." msgstr "Este campo no puede estar vacío." -#: db/models/fields/__init__.py:668 +#: db/models/fields/__init__.py:689 msgid "This value must be a decimal number." msgstr "Este valor debe ser un entero." -#: db/models/fields/__init__.py:779 +#: db/models/fields/__init__.py:800 msgid "Enter a valid filename." msgstr "Introduzca un nombre de fichero válido" -#: db/models/fields/__init__.py:960 +#: db/models/fields/__init__.py:981 msgid "This value must be either None, True or False." msgstr "Este valor debe ser Verdadero o Falso." -#: db/models/fields/related.py:93 +#: db/models/fields/related.py:94 #, python-format msgid "Please enter a valid %s." msgstr "Por favor, introduzca un %s válido." -#: db/models/fields/related.py:701 +#: db/models/fields/related.py:721 msgid "Separate multiple IDs with commas." msgstr "Separe múltiples IDs con comas." -#: db/models/fields/related.py:703 +#: db/models/fields/related.py:723 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar " "más de uno." -#: db/models/fields/related.py:750 +#: db/models/fields/related.py:770 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -4042,7 +4044,8 @@ msgstr "Escoja una opción válida. Esa opción no está entre las aceptadas." #: newforms/fields.py:599 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Escoja una opción válida. %(value)s no es una de las opciones disponibles." +msgstr "" +"Escoja una opción válida. %(value)s no es una de las opciones disponibles." #: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:371 msgid "Enter a list of values." @@ -4404,6 +4407,9 @@ msgstr "Se actualizó con éxito el %(verbose_name)s." msgid "The %(verbose_name)s was deleted." msgstr "El %(verbose_name)s ha sido eliminado." +#~ msgid "Brazilian" +#~ msgstr "Brasileño" + #~ msgid "Gaeilge" #~ msgstr "Gaeilge" diff --git a/django/conf/locale/it/LC_MESSAGES/django.mo b/django/conf/locale/it/LC_MESSAGES/django.mo index 93fc7da545cd77b5d0f51efc70e81f3d8460bf87..683680bb7dc982c20f77c4c41d9e1fc78d225959 100644 GIT binary patch delta 7948 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 delta 7963 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 diff --git a/django/conf/locale/it/LC_MESSAGES/django.po b/django/conf/locale/it/LC_MESSAGES/django.po index ebe0b5a45e..a8f02e4967 100644 --- a/django/conf/locale/it/LC_MESSAGES/django.po +++ b/django/conf/locale/it/LC_MESSAGES/django.po @@ -1,13 +1,12 @@ # translation of django.po to Italiano -# Nicola Larosa , 2008. # Italian translation of Django. # Copyright (C) 2006 the Lawrence Journal-World # This file is distributed under the same license as the Django package. msgid "" msgstr "" -"Project-Id-Version: django\n" +"Project-Id-Version: Django vSVN\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-05-18 18:39+0200\n" +"POT-Creation-Date: 2008-06-02 18:40+0200\n" "PO-Revision-Date: 2008-05-18 19:13+0200\n" "Last-Translator: Nicola Larosa \n" "Language-Team: Italiano\n" @@ -1710,7 +1709,7 @@ msgstr "Inserire un codice postale nel formato NNNN o ANNNNAAA." #: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23 #: contrib/localflavor/pe/forms.py:51 msgid "This field requires only numbers." -msgstr "In questo campo possono essere solo presenti numeri." +msgstr "Questo campo può contenere solo numeri." #: contrib/localflavor/ar/forms.py:50 msgid "This field requires 7 or 8 digits." @@ -2308,7 +2307,7 @@ msgstr "Inserire un codice postale valido." #: contrib/localflavor/it/forms.py:43 msgid "Enter a valid Social Security number." -msgstr "Inserire un numero di assistenza sociale valido." +msgstr "Inserire un numero di codice fiscale valido." #: contrib/localflavor/it/forms.py:68 msgid "Enter a valid VAT number." diff --git a/django/conf/locale/sv/LC_MESSAGES/django.mo b/django/conf/locale/sv/LC_MESSAGES/django.mo index 8a6dcb7f8b5c8d73e0d4a84762508e022065ccfc..acb08754a52390159f4db174c377261dbce01ab5 100644 GIT binary patch delta 17095 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 LDW%7Xx9a^LbVdis diff --git a/django/conf/locale/sv/LC_MESSAGES/django.po b/django/conf/locale/sv/LC_MESSAGES/django.po index 2154850aed..b6ef3c3a6d 100644 --- a/django/conf/locale/sv/LC_MESSAGES/django.po +++ b/django/conf/locale/sv/LC_MESSAGES/django.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-16 16:53+0100\n" -"PO-Revision-Date: 2008-03-02 00:49+0100\n" +"POT-Creation-Date: 2008-05-26 10:58+0200\n" +"PO-Revision-Date: 2008-05-26 11:15+0200\n" "Last-Translator: Ludvig Ericson \n" "Language-Team: Django I18N \n" "MIME-Version: 1.0\n" @@ -17,191 +17,191 @@ msgstr "" "X-Poedit-Language: Swedish\n" "X-Poedit-Country: SWEDEN\n" -#: conf/global_settings.py:39 +#: conf/global_settings.py:43 msgid "Arabic" msgstr "Arabiska" -#: conf/global_settings.py:40 +#: conf/global_settings.py:44 msgid "Bengali" msgstr "Bengaliska" -#: conf/global_settings.py:41 +#: conf/global_settings.py:45 msgid "Bulgarian" msgstr "Bulgariska" -#: conf/global_settings.py:42 +#: conf/global_settings.py:46 msgid "Catalan" msgstr "Katalanska" -#: conf/global_settings.py:43 +#: conf/global_settings.py:47 msgid "Czech" msgstr "Tjeckiska" -#: conf/global_settings.py:44 +#: conf/global_settings.py:48 msgid "Welsh" msgstr "Walesiska" -#: conf/global_settings.py:45 +#: conf/global_settings.py:49 msgid "Danish" msgstr "Danska" -#: conf/global_settings.py:46 +#: conf/global_settings.py:50 msgid "German" msgstr "Tyska" -#: conf/global_settings.py:47 +#: conf/global_settings.py:51 msgid "Greek" msgstr "Grekiska" -#: conf/global_settings.py:48 +#: conf/global_settings.py:52 msgid "English" msgstr "Engelska" -#: conf/global_settings.py:49 +#: conf/global_settings.py:53 msgid "Spanish" msgstr "Spanska" -#: conf/global_settings.py:50 +#: conf/global_settings.py:54 msgid "Argentinean Spanish" msgstr "Argentisk Spanska" -#: conf/global_settings.py:51 +#: conf/global_settings.py:55 msgid "Basque" msgstr "Baskiska" -#: conf/global_settings.py:52 +#: conf/global_settings.py:56 msgid "Persian" msgstr "Persiska" -#: conf/global_settings.py:53 +#: conf/global_settings.py:57 msgid "Finnish" msgstr "Finska" -#: conf/global_settings.py:54 +#: conf/global_settings.py:58 msgid "French" msgstr "Franska" -#: conf/global_settings.py:55 +#: conf/global_settings.py:59 msgid "Irish" msgstr "Irländska" -#: conf/global_settings.py:56 +#: conf/global_settings.py:60 msgid "Galician" msgstr "Galisiska" -#: conf/global_settings.py:57 +#: conf/global_settings.py:61 msgid "Hungarian" msgstr "Ungerska" -#: conf/global_settings.py:58 +#: conf/global_settings.py:62 msgid "Hebrew" msgstr "Hebreiska" -#: conf/global_settings.py:59 +#: conf/global_settings.py:63 msgid "Croatian" msgstr "Kroatiska" -#: conf/global_settings.py:60 +#: conf/global_settings.py:64 msgid "Icelandic" msgstr "Isländska" -#: conf/global_settings.py:61 +#: conf/global_settings.py:65 msgid "Italian" msgstr "Italienska" -#: conf/global_settings.py:62 +#: conf/global_settings.py:66 msgid "Japanese" msgstr "Japanska" -#: conf/global_settings.py:63 +#: conf/global_settings.py:67 msgid "Georgian" msgstr "Georgiska" -#: conf/global_settings.py:64 +#: conf/global_settings.py:68 msgid "Korean" msgstr "Koreanska" -#: conf/global_settings.py:65 +#: conf/global_settings.py:69 msgid "Khmer" msgstr "Khmer" -#: conf/global_settings.py:66 +#: conf/global_settings.py:70 msgid "Kannada" msgstr "Kannada" -#: conf/global_settings.py:67 +#: conf/global_settings.py:71 msgid "Latvian" msgstr "Lettiska" -#: conf/global_settings.py:68 +#: conf/global_settings.py:72 msgid "Macedonian" msgstr "Makedonska" -#: conf/global_settings.py:69 +#: conf/global_settings.py:73 msgid "Dutch" msgstr "Holländska" -#: conf/global_settings.py:70 +#: conf/global_settings.py:74 msgid "Norwegian" msgstr "Norska" -#: conf/global_settings.py:71 +#: conf/global_settings.py:75 msgid "Polish" msgstr "Polska" -#: conf/global_settings.py:72 +#: conf/global_settings.py:76 msgid "Portugese" msgstr "Portugisiska" -#: conf/global_settings.py:73 -msgid "Brazilian" -msgstr "Brasilianska" +#: conf/global_settings.py:77 +msgid "Brazilian Portuguese" +msgstr "Brasiliensk portugisiska" -#: conf/global_settings.py:74 +#: conf/global_settings.py:78 msgid "Romanian" msgstr "Rumänska" -#: conf/global_settings.py:75 +#: conf/global_settings.py:79 msgid "Russian" msgstr "Ryska" -#: conf/global_settings.py:76 +#: conf/global_settings.py:80 msgid "Slovak" msgstr "Slovakiska" -#: conf/global_settings.py:77 +#: conf/global_settings.py:81 msgid "Slovenian" msgstr "Slovenska" -#: conf/global_settings.py:78 +#: conf/global_settings.py:82 msgid "Serbian" msgstr "Serbiska" -#: conf/global_settings.py:79 +#: conf/global_settings.py:83 msgid "Swedish" msgstr "Svenska" -#: conf/global_settings.py:80 +#: conf/global_settings.py:84 msgid "Tamil" msgstr "Tamilska" -#: conf/global_settings.py:81 +#: conf/global_settings.py:85 msgid "Telugu" msgstr "Telugu" -#: conf/global_settings.py:82 +#: conf/global_settings.py:86 msgid "Turkish" msgstr "Turkiska" -#: conf/global_settings.py:83 +#: conf/global_settings.py:87 msgid "Ukrainian" msgstr "Ukrainska" -#: conf/global_settings.py:84 +#: conf/global_settings.py:88 msgid "Simplified Chinese" msgstr "Förenklad Kinesiska" -#: conf/global_settings.py:85 +#: conf/global_settings.py:89 msgid "Traditional Chinese" msgstr "Traditionell Kinesiska" @@ -504,8 +504,8 @@ msgid "" "This object doesn't have a change history. It probably wasn't added via this " "admin site." msgstr "" -"Detta objekt har ingen ändringshistorik. Det lades antagligen inte till " -"via denna administrationssida." +"Detta objekt har ingen ändringshistorik. Det lades antagligen inte till via " +"denna administrationssida." #: contrib/admin/templates/admin/pagination.html:10 msgid "Show all" @@ -729,8 +729,7 @@ msgstr "Ditt nya lösenord är: %(new_password)s" #: contrib/admin/templates/registration/password_reset_email.html:7 msgid "Feel free to change this password by going to this page:" -msgstr "" -"Du är välkommen att ändra detta lösenord genom att gå till denna sida:" +msgstr "Du är välkommen att ändra detta lösenord genom att gå till denna sida:" #: contrib/admin/templates/registration/password_reset_email.html:11 msgid "Your username, in case you've forgotten:" @@ -828,15 +827,15 @@ msgstr "" "Det verkar som att din webläsare inte är konfigurerad att acceptera cookies. " "Aktivera cookies, ladda om denna sida och försök igen." -#: contrib/admin/views/decorators.py:90 -msgid "Usernames cannot contain the '@' character." -msgstr "Användarnamn får inte innehålla '@'-tecknet." - -#: contrib/admin/views/decorators.py:92 +#: contrib/admin/views/decorators.py:89 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "Din e-postadress är inte ditt användarnamn. Försök med '%s' istället." +#: contrib/admin/views/decorators.py:93 +msgid "Usernames cannot contain the '@' character." +msgstr "Användarnamn får inte innehålla '@'-tecknet." + #: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50 #: contrib/admin/views/doc.py:52 msgid "tag:" @@ -960,7 +959,7 @@ msgstr "Text" msgid "Time" msgstr "Tid" -#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7 +#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8 msgid "URL" msgstr "URL" @@ -1067,7 +1066,7 @@ msgstr "Välj %s" msgid "Select %s to change" msgstr "Välj %s att ändra" -#: contrib/admin/views/main.py:784 +#: contrib/admin/views/main.py:765 msgid "Database error" msgstr "Databasfel" @@ -1186,11 +1185,11 @@ msgstr "aktiv" #: contrib/auth/models.py:137 msgid "" -"Designates whether this user can log into the Django admin. Unselect this " +"Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "" -"Anger om användaren kan logga in till Django-adminsidan. Avmarkera denna " -"istället för att ta bort konton." +"Anger om användaren skall betraktas som aktiv. Avmarkera detta istället " +"för att ta bort konton." #: contrib/auth/models.py:138 msgid "superuser status" @@ -1322,8 +1321,8 @@ msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." msgstr "" -"Bocka för denna ruta om kommentaren är olämplig. Ett \"Denna " -"kommentar har tagits bort\"-meddelande kommer visas istället." +"Bocka för denna ruta om kommentaren är olämplig. Ett \"Denna kommentar har " +"tagits bort\"-meddelande kommer visas istället." #: contrib/comments/models.py:96 msgid "comments" @@ -1488,13 +1487,13 @@ msgid_plural "" "\n" "%(text)s" msgstr[0] "" -"Denna kommentar postades av en användare som har postat färre än %(count)" -"s kommentar:\n" +"Denna kommentar postades av en användare som har postat färre än %(count)s " +"kommentar:\n" "\n" "%(text)s" msgstr[1] "" -"Denna kommentar postades av en användare som har postat färre än %(count)" -"s kommentarer:\n" +"Denna kommentar postades av en användare som har postat färre än %(count)s " +"kommentarer:\n" "\n" "%(text)s" @@ -1551,80 +1550,92 @@ msgstr "Ogiltigt kommentar-ID" msgid "No voting for yourself" msgstr "Du får inte rösta på dig själv" -#: contrib/contenttypes/models.py:37 +#: contrib/contenttypes/models.py:67 msgid "python model class name" msgstr "python klassnamn för modell" -#: contrib/contenttypes/models.py:40 +#: contrib/contenttypes/models.py:71 msgid "content type" msgstr "innehålls typ" -#: contrib/contenttypes/models.py:41 +#: contrib/contenttypes/models.py:72 msgid "content types" msgstr "innehålls typer" -#: contrib/flatpages/models.py:8 +#: contrib/flatpages/models.py:9 msgid "" "Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "" "Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedstreck." -#: contrib/flatpages/models.py:9 +#: contrib/flatpages/models.py:10 msgid "title" msgstr "titel" -#: contrib/flatpages/models.py:10 +#: contrib/flatpages/models.py:11 msgid "content" msgstr "innehåll" -#: contrib/flatpages/models.py:11 +#: contrib/flatpages/models.py:12 msgid "enable comments" msgstr "aktivera kommentarer" -#: contrib/flatpages/models.py:12 +#: contrib/flatpages/models.py:13 msgid "template name" msgstr "mallnamn" -#: contrib/flatpages/models.py:13 +#: contrib/flatpages/models.py:14 msgid "" "Example: 'flatpages/contact_page.html'. If this isn't provided, the system " "will use 'flatpages/default.html'." msgstr "" -"Exempel: 'sidor/kontaktsida.html'. Om detta inte fylls i kommer systemet " -"att använda 'flatpages/default.html'." +"Exempel: 'sidor/kontaktsida.html'. Om detta inte fylls i kommer systemet att " +"använda 'flatpages/default.html'." -#: contrib/flatpages/models.py:14 +#: contrib/flatpages/models.py:15 msgid "registration required" msgstr "registrering krävs" -#: contrib/flatpages/models.py:14 +#: contrib/flatpages/models.py:15 msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Om detta bockas för kommer endast inloggade användare kunna se sidan." +msgstr "Om detta bockas för kommer endast inloggade användare kunna se sidan." -#: contrib/flatpages/models.py:18 +#: contrib/flatpages/models.py:20 msgid "flat page" msgstr "statisk sida" -#: contrib/flatpages/models.py:19 +#: contrib/flatpages/models.py:21 msgid "flat pages" msgstr "statiska sidor" +#: contrib/flatpages/models.py:27 +msgid "Advanced options" +msgstr "Avancerade inställningar" + +# Setting these as fuzzy because they might not make sense in Swedish. Consider +# the code's usage of them. They turn numbers such as 1 in to 1st, which isn't +# how we do it in Swedish, we do it by textualizing the number: first, första. +# For the time being, we'll leave these as fuzzy, IMO. // toxik + #: contrib/humanize/templatetags/humanize.py:19 +#,fuzzy msgid "th" -msgstr "" +msgstr ":a" #: contrib/humanize/templatetags/humanize.py:19 +#,fuzzy msgid "st" -msgstr "" +msgstr ":a" #: contrib/humanize/templatetags/humanize.py:19 +#,fuzzy msgid "nd" -msgstr "" +msgstr ":e" #: contrib/humanize/templatetags/humanize.py:19 +#,fuzzy msgid "rd" -msgstr "" +msgstr ":e" #: contrib/humanize/templatetags/humanize.py:51 #, python-format @@ -3551,8 +3562,7 @@ msgstr "webbplatser" #: core/validators.py:72 msgid "This value must contain only letters, numbers and underscores." -msgstr "" -"Detta värde får endast innehålla bokstäver, siffror och understreck." +msgstr "Detta värde får endast innehålla bokstäver, siffror och understreck." #: core/validators.py:76 msgid "" @@ -3600,7 +3610,7 @@ msgstr "Icke-numeriska tecken är inte tillåtna här." msgid "This value can't be comprised solely of digits." msgstr "Detta värde kan inte enbart bestå av siffror." -#: core/validators.py:128 newforms/fields.py:151 +#: core/validators.py:128 newforms/fields.py:152 msgid "Enter a whole number." msgstr "Fyll i ett heltal." @@ -3617,7 +3627,7 @@ msgstr "Årtal måste vara 1900 eller senare." msgid "Invalid date: %s" msgstr "Ogiltigt datum: %s" -#: core/validators.py:156 db/models/fields/__init__.py:522 +#: core/validators.py:156 db/models/fields/__init__.py:548 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Fyll i ett giltigt datum med formatet ÅÅÅÅ-MM-DD." @@ -3625,20 +3635,20 @@ msgstr "Fyll i ett giltigt datum med formatet ÅÅÅÅ-MM-DD." msgid "Enter a valid time in HH:MM format." msgstr "Fyll i ett giltigt klockslag med formatet TT:MM." -#: core/validators.py:165 db/models/fields/__init__.py:599 +#: core/validators.py:165 db/models/fields/__init__.py:625 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "Fyll i en giltig tidpunkt med formatet ÅÅÅÅ-MM-DD TT:MM." -#: core/validators.py:170 newforms/fields.py:402 +#: core/validators.py:170 newforms/fields.py:403 msgid "Enter a valid e-mail address." msgstr "Fyll i en giltig e-postadress." -#: core/validators.py:182 core/validators.py:474 newforms/fields.py:432 +#: core/validators.py:182 core/validators.py:474 newforms/fields.py:433 #: oldforms/__init__.py:687 msgid "No file was submitted. Check the encoding type on the form." msgstr "Ingen fil skickades. Kontrollera kodningnstypen i formuläret." -#: core/validators.py:193 newforms/fields.py:458 +#: core/validators.py:193 newforms/fields.py:459 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -3874,57 +3884,57 @@ msgstr "" msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "%(object)s med typen %(type)s finns redan för %(field)s." -#: db/models/fields/__init__.py:52 +#: db/models/fields/__init__.py:54 #, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "%(optname)s med detta %(fieldname)s finns redan." -#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:322 -#: db/models/fields/__init__.py:754 db/models/fields/__init__.py:765 -#: newforms/fields.py:45 oldforms/__init__.py:374 +#: db/models/fields/__init__.py:179 db/models/fields/__init__.py:348 +#: db/models/fields/__init__.py:780 db/models/fields/__init__.py:791 +#: newforms/fields.py:46 oldforms/__init__.py:374 msgid "This field is required." msgstr "Detta fält måste fyllas i." -#: db/models/fields/__init__.py:422 +#: db/models/fields/__init__.py:448 msgid "This value must be an integer." msgstr "Detta värde måste vara ett heltal." -#: db/models/fields/__init__.py:461 +#: db/models/fields/__init__.py:487 msgid "This value must be either True or False." msgstr "Detta värde måste vara antingen True eller False." -#: db/models/fields/__init__.py:485 +#: db/models/fields/__init__.py:511 msgid "This field cannot be null." msgstr "Detta fält får inte vara null." -#: db/models/fields/__init__.py:663 +#: db/models/fields/__init__.py:689 msgid "This value must be a decimal number." msgstr "Detta värde måste vara ett decimaltal." -#: db/models/fields/__init__.py:774 +#: db/models/fields/__init__.py:800 msgid "Enter a valid filename." msgstr "Fyll i ett giltigt filnamn." -#: db/models/fields/__init__.py:945 +#: db/models/fields/__init__.py:981 msgid "This value must be either None, True or False." msgstr "Detta värde måste vara antingen None, True eller False." -#: db/models/fields/related.py:93 +#: db/models/fields/related.py:94 #, python-format msgid "Please enter a valid %s." msgstr "Var god fyll i giltig %s." -#: db/models/fields/related.py:694 +#: db/models/fields/related.py:721 msgid "Separate multiple IDs with commas." msgstr "Separera flera ID-nummer med kommatecken." -#: db/models/fields/related.py:696 +#: db/models/fields/related.py:723 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Håll ner \"Control\" eller \"Command\" på en Mac för att välja fler än en." -#: db/models/fields/related.py:743 +#: db/models/fields/related.py:770 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -3934,101 +3944,101 @@ msgstr[0] "" msgstr[1] "" "Var god och fyll giltiga %(self)s ID-nummer. Värdena %(value)r är ogiltiga." -#: newforms/fields.py:46 +#: newforms/fields.py:47 msgid "Enter a valid value." msgstr "Fyll i ett giltigt värde." -#: newforms/fields.py:123 +#: newforms/fields.py:124 #, python-format msgid "Ensure this value has at most %(max)d characters (it has %(length)d)." msgstr "" "Kontrollera att detta värde har högst %(max)d tecken (det har %(length)d)." -#: newforms/fields.py:124 +#: newforms/fields.py:125 #, python-format msgid "Ensure this value has at least %(min)d characters (it has %(length)d)." msgstr "" "Kontrollera att detta värde har minst %(min)d tecken (det har %(length)d)." -#: newforms/fields.py:152 newforms/fields.py:181 newforms/fields.py:210 +#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211 #, python-format msgid "Ensure this value is less than or equal to %s." msgstr "Kontrollera att detta värde är mindre eller lika med %s." -#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211 +#: newforms/fields.py:154 newforms/fields.py:183 newforms/fields.py:212 #, python-format msgid "Ensure this value is greater than or equal to %s." msgstr "Kontrollera att detta värde är mer eller lika med %s." -#: newforms/fields.py:180 newforms/fields.py:209 +#: newforms/fields.py:181 newforms/fields.py:210 msgid "Enter a number." msgstr "Fyll i ett tal." -#: newforms/fields.py:212 +#: newforms/fields.py:213 #, python-format msgid "Ensure that there are no more than %s digits in total." msgstr "Kontrollera att det inte finns mer än totalt %s siffror." -#: newforms/fields.py:213 +#: newforms/fields.py:214 #, python-format msgid "Ensure that there are no more than %s decimal places." msgstr "Kontrollera att det inte finns mer än %s decimaler." -#: newforms/fields.py:214 +#: newforms/fields.py:215 #, python-format msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Kontrollera att det inte finns mer än %s siffror före decimaltecknet." -#: newforms/fields.py:262 newforms/fields.py:723 +#: newforms/fields.py:263 newforms/fields.py:751 msgid "Enter a valid date." msgstr "Fyll i ett giltigt datum." -#: newforms/fields.py:295 newforms/fields.py:724 +#: newforms/fields.py:296 newforms/fields.py:752 msgid "Enter a valid time." msgstr "Fyll i en giltig tid." -#: newforms/fields.py:334 +#: newforms/fields.py:335 msgid "Enter a valid date/time." msgstr "Fyll i ett giltigt datum/tid." -#: newforms/fields.py:433 +#: newforms/fields.py:434 msgid "No file was submitted." msgstr "Ingen fil skickades." -#: newforms/fields.py:434 oldforms/__init__.py:689 +#: newforms/fields.py:435 oldforms/__init__.py:689 msgid "The submitted file is empty." msgstr "Den skickade filen är tom." -#: newforms/fields.py:496 +#: newforms/fields.py:497 msgid "Enter a valid URL." msgstr "Fyll i en giltig URL." -#: newforms/fields.py:497 +#: newforms/fields.py:498 msgid "This URL appears to be a broken link." msgstr "Denna URL verkar vara en trasig länk." -#: newforms/fields.py:559 newforms/models.py:300 +#: newforms/fields.py:560 newforms/models.py:299 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" "Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga " "alternativ." -#: newforms/fields.py:598 +#: newforms/fields.py:599 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" "Välj ett giltigt alternativ. %(value)s finns inte bland tillgängliga " "alternativ." -#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:360 +#: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:371 msgid "Enter a list of values." msgstr "Fyll i en lista med värden." -#: newforms/fields.py:752 +#: newforms/fields.py:780 msgid "Enter a valid IPv4 address." msgstr "Fyll i en giltig IPv4 adress." -#: newforms/models.py:361 +#: newforms/models.py:372 #, python-format msgid "Select a valid choice. %s is not one of the available choices." msgstr "" @@ -4062,28 +4072,28 @@ msgstr "Fyll i ett positivt tal." msgid "Enter a whole number between 0 and 32,767." msgstr "Fyll i ett heltal mellan 0 och 32767." -#: template/defaultfilters.py:695 +#: template/defaultfilters.py:698 msgid "yes,no,maybe" msgstr "ja,nej,kanske" -#: template/defaultfilters.py:726 +#: template/defaultfilters.py:729 #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d byte" -#: template/defaultfilters.py:728 +#: template/defaultfilters.py:731 #, python-format msgid "%.1f KB" msgstr "%.1f KB" -#: template/defaultfilters.py:730 +#: template/defaultfilters.py:733 #, python-format msgid "%.1f MB" msgstr "%.1f MB" -#: template/defaultfilters.py:731 +#: template/defaultfilters.py:734 #, python-format msgid "%.1f GB" msgstr "%.1f GB" @@ -4381,5 +4391,8 @@ msgstr "%(verbose_name)s uppdaterades." msgid "The %(verbose_name)s was deleted." msgstr "%(verbose_name)s togs bort." +#~ msgid "Brazilian" +#~ msgstr "Brasilianska" + #~ msgid "Gaeilge" #~ msgstr "Gaeliska" diff --git a/django/core/management/commands/syncdb.py b/django/core/management/commands/syncdb.py index 8017ed832f..b8b2ff1beb 100644 --- a/django/core/management/commands/syncdb.py +++ b/django/core/management/commands/syncdb.py @@ -21,7 +21,7 @@ class Command(NoArgsCommand): def handle_noargs(self, **options): from django.db import connection, transaction, models from django.conf import settings - from django.core.management.sql import table_list, installed_models, sql_model_create, sql_for_pending_references, many_to_many_sql_for_model, custom_sql_for_model, sql_indexes_for_model, emit_post_sync_signal + from django.core.management.sql import table_names, installed_models, sql_model_create, sql_for_pending_references, many_to_many_sql_for_model, custom_sql_for_model, sql_indexes_for_model, emit_post_sync_signal verbosity = int(options.get('verbosity', 1)) interactive = options.get('interactive') @@ -45,7 +45,7 @@ class Command(NoArgsCommand): table_name_converter = lambda x: x # Get a list of all existing database tables, so we know what needs to # be added. - tables = [table_name_converter(name) for name in table_list()] + tables = [table_name_converter(name) for name in table_names()] # Get a list of already installed *models* so that references work right. seen_models = installed_models(tables) diff --git a/django/core/management/sql.py b/django/core/management/sql.py index 1ccb100361..574be5a1ee 100644 --- a/django/core/management/sql.py +++ b/django/core/management/sql.py @@ -7,13 +7,13 @@ try: except NameError: from sets import Set as set # Python 2.3 fallback -def table_list(): +def table_names(): "Returns a list of all table names that exist in the database." from django.db import connection, get_introspection_module cursor = connection.cursor() - return get_introspection_module().get_table_list(cursor) + return set(get_introspection_module().get_table_list(cursor)) -def django_table_list(only_existing=False): +def django_table_names(only_existing=False): """ Returns a list of all table names that have associated Django models and are in INSTALLED_APPS. @@ -22,14 +22,13 @@ def django_table_list(only_existing=False): that actually exist in the database. """ from django.db import models - tables = [] + tables = set() for app in models.get_apps(): for model in models.get_models(app): - tables.append(model._meta.db_table) - tables.extend([f.m2m_db_table() for f in model._meta.local_many_to_many]) + tables.add(model._meta.db_table) + tables.update([f.m2m_db_table() for f in model._meta.local_many_to_many]) if only_existing: - existing = table_list() - tables = [t for t in tables if t in existing] + tables = [t for t in tables if t in table_names()] return tables def installed_models(table_list): @@ -82,7 +81,7 @@ def sql_create(app, style): # we can be conservative). app_models = models.get_models(app) final_output = [] - known_models = set([model for model in installed_models(table_list()) if model not in app_models]) + known_models = set([model for model in installed_models(table_names()) if model not in app_models]) pending_references = {} for model in app_models: @@ -214,9 +213,9 @@ def sql_flush(style, only_django=False): """ from django.db import connection if only_django: - tables = django_table_list() + tables = django_table_names() else: - tables = table_list() + tables = table_names() statements = connection.ops.sql_flush(style, tables, sequence_list()) return statements diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 02780813de..49d41ff3d9 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -1,6 +1,6 @@ from django.db import connection, transaction from django.db.models import signals, get_model -from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, get_ul_class +from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, get_ul_class, FieldDoesNotExist from django.db.models.related import RelatedObject from django.db.models.query_utils import QueryWrapper from django.utils.text import capfirst @@ -165,7 +165,7 @@ class SingleRelatedObjectDescriptor(object): # SingleRelatedObjectDescriptor instance. def __init__(self, related): self.related = related - self.cache_name = '_%s_cache' % related.field.name + self.cache_name = '_%s_cache' % related.get_accessor_name() def __get__(self, instance, instance_type=None): if instance is None: @@ -182,14 +182,29 @@ class SingleRelatedObjectDescriptor(object): def __set__(self, instance, value): if instance is None: raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name + + # The similarity of the code below to the code in + # ReverseSingleRelatedObjectDescriptor is annoying, but there's a bunch + # of small differences that would make a common base class convoluted. + + # If null=True, we can assign null here, but otherwise the value needs + # to be an instance of the related class. + if value is None and self.related.field.null == False: + raise ValueError('Cannot assign None: "%s.%s" does not allow null values.' % + (instance._meta.object_name, self.related.get_accessor_name())) + elif value is not None and not isinstance(value, self.related.model): + raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' % + (value, instance._meta.object_name, + self.related.get_accessor_name(), self.related.opts.object_name)) + # Set the value of the related field setattr(value, self.related.field.rel.get_related_field().attname, instance) - # Clear the cache, if it exists - try: - delattr(value, self.related.field.get_cache_name()) - except AttributeError: - pass + # Since we already know what the related object is, seed the related + # object caches now, too. This avoids another db hit if you get the + # object you just set. + setattr(instance, self.cache_name, value) + setattr(value, self.related.field.get_cache_name(), instance) class ReverseSingleRelatedObjectDescriptor(object): # This class provides the functionality that makes the related-object @@ -225,6 +240,17 @@ class ReverseSingleRelatedObjectDescriptor(object): def __set__(self, instance, value): if instance is None: raise AttributeError, "%s must be accessed via instance" % self._field.name + + # If null=True, we can assign null here, but otherwise the value needs + # to be an instance of the related class. + if value is None and self.field.null == False: + raise ValueError('Cannot assign None: "%s.%s" does not allow null values.' % + (instance._meta.object_name, self.field.name)) + elif value is not None and not isinstance(value, self.field.rel.to): + raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' % + (value, instance._meta.object_name, + self.field.name, self.field.rel.to._meta.object_name)) + # Set the value of the related field try: val = getattr(value, self.field.rel.get_related_field().attname) @@ -232,11 +258,10 @@ class ReverseSingleRelatedObjectDescriptor(object): val = None setattr(instance, self.field.attname, val) - # Clear the cache, if it exists - try: - delattr(instance, self.field.get_cache_name()) - except AttributeError: - pass + # Since we already know what the related object is, seed the related + # object cache now, too. This avoids another db hit if you get the + # object you just set. + setattr(instance, self.field.get_cache_name(), value) class ForeignRelatedObjectsDescriptor(object): # This class provides the functionality that makes the related-object diff --git a/django/db/transaction.py b/django/db/transaction.py index bb90713525..c0c3779f6a 100644 --- a/django/db/transaction.py +++ b/django/db/transaction.py @@ -16,6 +16,10 @@ try: import thread except ImportError: import dummy_thread as thread +try: + from functools import wraps +except ImportError: + from django.utils.functional import wraps # Python 2.3, 2.4 fallback. from django.db import connection from django.conf import settings @@ -177,7 +181,7 @@ def autocommit(func): return func(*args, **kw) finally: leave_transaction_management() - return _autocommit + return wraps(func)(_autocommit) def commit_on_success(func): """ @@ -202,7 +206,7 @@ def commit_on_success(func): return res finally: leave_transaction_management() - return _commit_on_success + return wraps(func)(_commit_on_success) def commit_manually(func): """ @@ -219,4 +223,4 @@ def commit_manually(func): finally: leave_transaction_management() - return _commit_manually + return wraps(func)(_commit_manually) diff --git a/django/template/__init__.py b/django/template/__init__.py index e60ff64ebf..5c4ab3052a 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -467,7 +467,7 @@ class FilterExpression(object): >>> len(fe.filters) 2 >>> fe.var - 'variable' + This class should never be instantiated outside of the get_filters_from_token helper function. @@ -598,15 +598,15 @@ class Variable(object): a hard-coded string (if it begins and ends with single or double quote marks):: - >>> c = {'article': {'section':'News'}} + >>> c = {'article': {'section':u'News'}} >>> Variable('article.section').resolve(c) u'News' >>> Variable('article').resolve(c) - {'section': 'News'} + {'section': u'News'} >>> class AClass: pass >>> c = AClass() >>> c.article = AClass() - >>> c.article.section = 'News' + >>> c.article.section = u'News' >>> Variable('article.section').resolve(c) u'News' diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index e5a8e6620b..cf3b35b4cc 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -515,7 +515,7 @@ debug = register.tag(debug) #@register.tag(name="filter") def do_filter(parser, token): """ - Filters the contents of the blog through variable filters. + Filters the contents of the block through variable filters. Filters can also be piped through each other, and they can have arguments -- just like in variable syntax. diff --git a/django/template/loader.py b/django/template/loader.py index 03e6f8d49d..1d7d945ef7 100644 --- a/django/template/loader.py +++ b/django/template/loader.py @@ -46,7 +46,7 @@ def find_template_source(name, dirs=None): # circular import errors. See Django ticket #1292. global template_source_loaders if template_source_loaders is None: - template_source_loaders = [] + loaders = [] for path in settings.TEMPLATE_LOADERS: i = path.rfind('.') module, attr = path[:i], path[i+1:] @@ -62,7 +62,8 @@ def find_template_source(name, dirs=None): import warnings warnings.warn("Your TEMPLATE_LOADERS setting includes %r, but your Python installation doesn't support that type of template loading. Consider removing that line from TEMPLATE_LOADERS." % path) else: - template_source_loaders.append(func) + loaders.append(func) + template_source_loaders = tuple(loaders) for loader in template_source_loaders: try: source, display_name = loader(name, dirs) diff --git a/django/template/loaders/eggs.py b/django/template/loaders/eggs.py index 0c68153917..946c2b4759 100644 --- a/django/template/loaders/eggs.py +++ b/django/template/loaders/eggs.py @@ -18,7 +18,7 @@ def load_template_source(template_name, template_dirs=None): pkg_name = 'templates/' + template_name for app in settings.INSTALLED_APPS: try: - return (resource_string(app, pkg_name), 'egg:%s:%s ' % (app, pkg_name)).decode(settings.FILE_CHARSET) + return (resource_string(app, pkg_name).decode(settings.FILE_CHARSET), 'egg:%s:%s' % (app, pkg_name)) except: pass raise TemplateDoesNotExist, template_name diff --git a/django/test/client.py b/django/test/client.py index bac28f797b..a15876e6f9 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -1,5 +1,6 @@ import urllib import sys +import os from cStringIO import StringIO from django.conf import settings from django.contrib.auth import authenticate, login @@ -67,7 +68,7 @@ def encode_multipart(boundary, data): if isinstance(value, file): lines.extend([ '--' + boundary, - 'Content-Disposition: form-data; name="%s"; filename="%s"' % (to_str(key), to_str(value.name)), + 'Content-Disposition: form-data; name="%s"; filename="%s"' % (to_str(key), to_str(os.path.basename(value.name))), 'Content-Type: application/octet-stream', '', value.read() @@ -178,10 +179,15 @@ class Client: if e.args != ('500.html',): raise - # Look for a signalled exception and reraise it + # Look for a signalled exception, clear the current context + # exception data, then re-raise the signalled exception. + # Also make sure that the signalled exception is cleared from + # the local cache! if self.exc_info: - raise self.exc_info[1], None, self.exc_info[2] - + exc_info = self.exc_info + self.exc_info = None + raise exc_info[1], None, exc_info[2] + # Save the client and request that stimulated the response response.client = self response.request = request diff --git a/django/test/testcases.py b/django/test/testcases.py index 5589443aed..ee83b960a6 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -128,6 +128,18 @@ class TestCase(unittest.TestCase): self.failUnless(real_count != 0, "Couldn't find '%s' in response" % text) + def assertNotContains(self, response, text, status_code=200): + """ + Asserts that a response indicates that a page was retrieved + successfully, (i.e., the HTTP status code was as expected), and that + ``text`` doesn't occurs in the content of the response. + """ + self.assertEqual(response.status_code, status_code, + "Couldn't retrieve page: Response code was %d (expected %d)'" % + (response.status_code, status_code)) + self.assertEqual(response.content.count(text), 0, + "Response should not contain '%s'" % text) + def assertFormError(self, response, form, field, errors): """ Asserts that a form used to render the response has a specific field diff --git a/django/utils/text.py b/django/utils/text.py index 4670ab47fa..aa190c8c4f 100644 --- a/django/utils/text.py +++ b/django/utils/text.py @@ -118,7 +118,7 @@ def get_valid_filename(s): spaces are converted to underscores; and all non-filename-safe characters are removed. >>> get_valid_filename("john's portrait in 2004.jpg") - 'johns_portrait_in_2004.jpg' + u'johns_portrait_in_2004.jpg' """ s = force_unicode(s).strip().replace(' ', '_') return re.sub(r'[^-A-Za-z0-9_.]', '', s) @@ -127,15 +127,15 @@ get_valid_filename = allow_lazy(get_valid_filename, unicode) def get_text_list(list_, last_word=ugettext_lazy(u'or')): """ >>> get_text_list(['a', 'b', 'c', 'd']) - 'a, b, c or d' + u'a, b, c or d' >>> get_text_list(['a', 'b', 'c'], 'and') - 'a, b and c' + u'a, b and c' >>> get_text_list(['a', 'b'], 'and') - 'a and b' + u'a and b' >>> get_text_list(['a']) - 'a' + u'a' >>> get_text_list([]) - '' + u'' """ if len(list_) == 0: return u'' if len(list_) == 1: return force_unicode(list_[0]) @@ -198,14 +198,18 @@ javascript_quote = allow_lazy(javascript_quote, unicode) smart_split_re = re.compile('("(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|[^\\s]+)') def smart_split(text): - """ + r""" Generator that splits a string by spaces, leaving quoted phrases together. Supports both single and double quotes, and supports escaping quotes with backslashes. In the output, strings will keep their initial and trailing quote marks. - >>> list(smart_split('This is "a person\'s" test.')) - ['This', 'is', '"a person\'s"', 'test.'] + >>> list(smart_split(r'This is "a person\'s" test.')) + [u'This', u'is', u'"a person\\\'s"', u'test.'] + >>> list(smart_split(r"Another 'person\'s' test.")) + [u'Another', u"'person's'", u'test.'] + >>> list(smart_split(r'A "\"funky\" style" test.')) + [u'A', u'""funky" style"', u'test.'] """ text = force_unicode(text) for bit in smart_split_re.finditer(text): diff --git a/docs/db-api.txt b/docs/db-api.txt index 405ed87cef..a15c45d37b 100644 --- a/docs/db-api.txt +++ b/docs/db-api.txt @@ -1061,7 +1061,12 @@ they query the database each time they're called. Returns the object matching the given lookup parameters, which should be in the format described in `Field lookups`_. -``get()`` raises ``AssertionError`` if more than one object was found. +``get()`` raises ``MultipleObjectsReturned`` if more than one object was found. +The ``MultipleObjectsReturned`` exception is an attribute of the model class. +For example, the following will raise ``MultipleObjectsReturned`` if there +are more than one authors with the name of 'John':: + + Author.objects.get(name='John') # raises Author.MultipleObjectsReturned ``get()`` raises a ``DoesNotExist`` exception if an object wasn't found for the given parameters. The ``DoesNotExist`` exception is an attribute of the model diff --git a/docs/flatpages.txt b/docs/flatpages.txt index b6fa8e035f..a538217642 100644 --- a/docs/flatpages.txt +++ b/docs/flatpages.txt @@ -66,6 +66,17 @@ resort. For more on middleware, read the `middleware docs`_. +.. admonition:: Ensure that your 404 template works + + Note that the ``FlatpageFallbackMiddleware`` only steps in once + another view has successfully produced a 404 response. If another + view or middleware class attempts to produce a 404 but ends up + raising an exception instead (such as a ``TemplateDoesNotExist`` + exception if your site does not have an appropriate template to + use for HTTP 404 responses), the response will become an HTTP 500 + ("Internal Server Error") and the ``FlatpageFallbackMiddleware`` + will not attempt to serve a flat page. + .. _SITE_ID: ../settings/#site-id .. _RequestContext: ../templates_python/#subclassing-context-djangocontext .. _middleware docs: ../middleware/ diff --git a/docs/outputting_pdf.txt b/docs/outputting_pdf.txt index bd6ae7a660..dd8a262812 100644 --- a/docs/outputting_pdf.txt +++ b/docs/outputting_pdf.txt @@ -143,11 +143,14 @@ Further resources * PDFlib_ is another PDF-generation library that has Python bindings. To use it with Django, just use the same concepts explained in this article. + * `Pisa HTML2PDF`_ is yet another PDF-generation library. Pisa ships with + an example of how to integrate Pisa with Django. * HTMLdoc_ is a command-line script that can convert HTML to PDF. It doesn't have a Python interface, but you can escape out to the shell using ``system`` or ``popen`` and retrieve the output in Python. * `forge_fdf in Python`_ is a library that fills in PDF forms. .. _PDFlib: http://www.pdflib.org/ +.. _`Pisa HTML2PDF`: http://www.htmltopdf.org/ .. _HTMLdoc: http://www.htmldoc.org/ .. _forge_fdf in Python: http://www.accesspdf.com/article.php/20050421092951834 diff --git a/docs/serialization.txt b/docs/serialization.txt index e901410f1c..8a672d8b8a 100644 --- a/docs/serialization.txt +++ b/docs/serialization.txt @@ -112,7 +112,7 @@ Django "ships" with a few included serializers: strings, etc.). Not really all that useful on its own, but used as a base for other serializers. - ``yaml`` Serializes to YAML (Yet Another Markup Lanuage). This + ``yaml`` Serializes to YAML (YAML Ain't a Markup Language). This serializer is only available if PyYAML_ is installed. ========== ============================================================== diff --git a/docs/testing.txt b/docs/testing.txt index 0ff3cce3d9..befa6979af 100644 --- a/docs/testing.txt +++ b/docs/testing.txt @@ -822,6 +822,10 @@ useful for testing Web applications: that ``text`` appears in the content of the response. If ``count`` is provided, ``text`` must occur exactly ``count`` times in the response. +``assertNotContains(response, text, status_code=200)`` + Asserts that a ``Response`` instance produced the given ``status_code`` and + that ``text`` does not appears in the content of the response. + ``assertFormError(response, form, field, errors)`` Asserts that a field on a form raises the provided list of errors when rendered on the form. @@ -837,6 +841,12 @@ useful for testing Web applications: ``errors`` is an error string, or a list of error strings, that are expected as a result of form validation. +``assertTemplateUsed(response, template_name)`` + Asserts that the template with the given name was used in rendering the + response. + + The name is a string such as ``'admin/index.html'``. + ``assertTemplateNotUsed(response, template_name)`` Asserts that the template with the given name was *not* used in rendering the response. @@ -846,12 +856,6 @@ useful for testing Web applications: it redirected to ``expected_url`` (including any GET data), and the subsequent page was received with ``target_status_code``. -``assertTemplateUsed(response, template_name)`` - Asserts that the template with the given name was used in rendering the - response. - - The name is a string such as ``'admin/index.html'``. - E-mail services --------------- diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt index 28f15289a9..7d67cd5b53 100644 --- a/docs/url_dispatch.txt +++ b/docs/url_dispatch.txt @@ -157,10 +157,10 @@ The URLconf searches against the requested URL, as a normal Python string. This does not include GET or POST parameters, or the domain name. For example, in a request to ``http://www.example.com/myapp/``, the URLconf -will look for ``/myapp/``. +will look for ``myapp/``. In a request to ``http://www.example.com/myapp/?page=3``, the URLconf will look -for ``/myapp/``. +for ``myapp/``. The URLconf doesn't look at the request method. In other words, all request methods -- ``POST``, ``GET``, ``HEAD``, etc. -- will be routed to the same diff --git a/tests/modeltests/basic/models.py b/tests/modeltests/basic/models.py index d7c27cb15b..c3ad38d661 100644 --- a/tests/modeltests/basic/models.py +++ b/tests/modeltests/basic/models.py @@ -401,8 +401,9 @@ True # The 'select' argument to extra() supports names with dashes in them, as long # as you use values(). ->>> Article.objects.filter(pub_date__year=2008).extra(select={'dashed-value': '1'}).values('headline', 'dashed-value') -[{'headline': u'Article 11', 'dashed-value': 1}, {'headline': u'Article 12', 'dashed-value': 1}] +>>> dicts = Article.objects.filter(pub_date__year=2008).extra(select={'dashed-value': '1'}).values('headline', 'dashed-value') +>>> [sorted(d.items()) for d in dicts] +[[('dashed-value', 1), ('headline', u'Article 11')], [('dashed-value', 1), ('headline', u'Article 12')]] # If you use 'select' with extra() and names containing dashes on a query # that's *not* a values() query, those extra 'select' values will silently be diff --git a/tests/modeltests/one_to_one/models.py b/tests/modeltests/one_to_one/models.py index 800ccddac2..6fa4dd8c18 100644 --- a/tests/modeltests/one_to_one/models.py +++ b/tests/modeltests/one_to_one/models.py @@ -80,11 +80,8 @@ DoesNotExist: Restaurant matching query does not exist. >>> r.place -# Set the place back again, using assignment in the reverse direction. Need to -# reload restaurant object first, because the reverse set can't update the -# existing restaurant instance +# Set the place back again, using assignment in the reverse direction. >>> p1.restaurant = r ->>> r.save() >>> p1.restaurant diff --git a/tests/modeltests/or_lookups/models.py b/tests/modeltests/or_lookups/models.py index c779e19e37..22bada07b1 100644 --- a/tests/modeltests/or_lookups/models.py +++ b/tests/modeltests/or_lookups/models.py @@ -110,8 +110,9 @@ __test__ = {'API_TESTS':""" >>> Article.objects.filter(Q(headline__startswith='Hello') | Q(headline__contains='bye')).count() 3 ->>> list(Article.objects.filter(Q(headline__startswith='Hello'), Q(headline__contains='bye')).values()) -[{'headline': u'Hello and goodbye', 'pub_date': datetime.datetime(2005, 11, 29, 0, 0), 'id': 3}] +>>> dicts = list(Article.objects.filter(Q(headline__startswith='Hello'), Q(headline__contains='bye')).values()) +>>> [sorted(d.items()) for d in dicts] +[[('headline', u'Hello and goodbye'), ('id', 3), ('pub_date', datetime.datetime(2005, 11, 29, 0, 0))]] >>> Article.objects.filter(Q(headline__startswith='Hello')).in_bulk([1,2]) {1: } diff --git a/tests/modeltests/test_client/fixtures/testdata.json b/tests/modeltests/test_client/fixtures/testdata.json index e9d3ebe9a8..0dcf625939 100644 --- a/tests/modeltests/test_client/fixtures/testdata.json +++ b/tests/modeltests/test_client/fixtures/testdata.json @@ -34,5 +34,23 @@ "email": "testclient@example.com", "date_joined": "2006-12-17 07:03:31" } + }, + { + "pk": "3", + "model": "auth.user", + "fields": { + "username": "staff", + "first_name": "Staff", + "last_name": "Member", + "is_active": true, + "is_superuser": false, + "is_staff": true, + "last_login": "2006-12-17 07:03:31", + "groups": [], + "user_permissions": [], + "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", + "email": "testclient@example.com", + "date_joined": "2006-12-17 07:03:31" + } } ] \ No newline at end of file diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py index 668ecb9d5a..4a8b68a897 100644 --- a/tests/regressiontests/defaultfilters/tests.py +++ b/tests/regressiontests/defaultfilters/tests.py @@ -226,15 +226,17 @@ u'some html with alert("You smell") disallowed tags' >>> striptags(u'some html with disallowed tags') u'some html with alert("You smell") disallowed tags' ->>> dictsort([{'age': 23, 'name': 'Barbara-Ann'}, -... {'age': 63, 'name': 'Ra Ra Rasputin'}, -... {'name': 'Jonny B Goode', 'age': 18}], 'age') -[{'age': 18, 'name': 'Jonny B Goode'}, {'age': 23, 'name': 'Barbara-Ann'}, {'age': 63, 'name': 'Ra Ra Rasputin'}] +>>> sorted_dicts = dictsort([{'age': 23, 'name': 'Barbara-Ann'}, +... {'age': 63, 'name': 'Ra Ra Rasputin'}, +... {'name': 'Jonny B Goode', 'age': 18}], 'age') +>>> [sorted(dict.items()) for dict in sorted_dicts] +[[('age', 18), ('name', 'Jonny B Goode')], [('age', 23), ('name', 'Barbara-Ann')], [('age', 63), ('name', 'Ra Ra Rasputin')]] ->>> dictsortreversed([{'age': 23, 'name': 'Barbara-Ann'}, -... {'age': 63, 'name': 'Ra Ra Rasputin'}, -... {'name': 'Jonny B Goode', 'age': 18}], 'age') -[{'age': 63, 'name': 'Ra Ra Rasputin'}, {'age': 23, 'name': 'Barbara-Ann'}, {'age': 18, 'name': 'Jonny B Goode'}] +>>> sorted_dicts = dictsortreversed([{'age': 23, 'name': 'Barbara-Ann'}, +... {'age': 63, 'name': 'Ra Ra Rasputin'}, +... {'name': 'Jonny B Goode', 'age': 18}], 'age') +>>> [sorted(dict.items()) for dict in sorted_dicts] +[[('age', 63), ('name', 'Ra Ra Rasputin')], [('age', 23), ('name', 'Barbara-Ann')], [('age', 18), ('name', 'Jonny B Goode')]] >>> first([0,1,2]) 0 diff --git a/tests/regressiontests/many_to_one_regress/models.py b/tests/regressiontests/many_to_one_regress/models.py index 57bbcd8489..4e49df1555 100644 --- a/tests/regressiontests/many_to_one_regress/models.py +++ b/tests/regressiontests/many_to_one_regress/models.py @@ -1,3 +1,7 @@ +""" +Regression tests for a few FK bugs: #1578, #6886 +""" + from django.db import models # If ticket #1578 ever slips back in, these models will not be able to be @@ -25,10 +29,48 @@ class Child(models.Model): __test__ = {'API_TESTS':""" ->>> Third.AddManipulator().save(dict(id='3', name='An example', another=None)) +>>> Third.objects.create(id='3', name='An example') >>> parent = Parent(name = 'fred') >>> parent.save() ->>> Child.AddManipulator().save(dict(name='bam-bam', parent=parent.id)) +>>> Child.objects.create(name='bam-bam', parent=parent) + +# +# Tests of ForeignKey assignment and the related-object cache (see #6886) +# +>>> p = Parent.objects.create(name="Parent") +>>> c = Child.objects.create(name="Child", parent=p) + +# Look up the object again so that we get a "fresh" object +>>> c = Child.objects.get(name="Child") +>>> p = c.parent + +# Accessing the related object again returns the exactly same object +>>> c.parent is p +True + +# But if we kill the cache, we get a new object +>>> del c._parent_cache +>>> c.parent is p +False + +# Assigning a new object results in that object getting cached immediately +>>> p2 = Parent.objects.create(name="Parent 2") +>>> c.parent = p2 +>>> c.parent is p2 +True + +# Assigning None fails: Child.parent is null=False +>>> c.parent = None +Traceback (most recent call last): + ... +ValueError: Cannot assign None: "Child.parent" does not allow null values. + +# You also can't assign an object of the wrong type here +>>> c.parent = First(id=1, second=1) +Traceback (most recent call last): + ... +ValueError: Cannot assign "": "Child.parent" must be a "Parent" instance. + """} diff --git a/tests/regressiontests/one_to_one_regress/models.py b/tests/regressiontests/one_to_one_regress/models.py index c5ffd3fb3c..99022882f2 100644 --- a/tests/regressiontests/one_to_one_regress/models.py +++ b/tests/regressiontests/one_to_one_regress/models.py @@ -15,6 +15,13 @@ class Restaurant(models.Model): def __unicode__(self): return u"%s the restaurant" % self.place.name +class Bar(models.Model): + place = models.OneToOneField(Place) + serves_cocktails = models.BooleanField() + + def __unicode__(self): + return u"%s the bar" % self.place.name + class Favorites(models.Model): name = models.CharField(max_length = 50) restaurants = models.ManyToManyField(Restaurant) @@ -34,4 +41,51 @@ __test__ = {'API_TESTS':""" >>> f.restaurants = [r] >>> f.restaurants.all() [] + +# Regression test for #7173: Check that the name of the cache for the +# reverse object is correct. +>>> b = Bar(place=p1, serves_cocktails=False) +>>> b.save() +>>> p1.restaurant + +>>> p1.bar + + +# +# Regression test for #6886 (the related-object cache) +# + +# Look up the objects again so that we get "fresh" objects +>>> p = Place.objects.get(name="Demon Dogs") +>>> r = p.restaurant + +# Accessing the related object again returns the exactly same object +>>> p.restaurant is r +True + +# But if we kill the cache, we get a new object +>>> del p._restaurant_cache +>>> p.restaurant is r +False + +# Reassigning the Restaurant object results in an immediate cache update +# We can't use a new Restaurant because that'll violate one-to-one, but +# with a new *instance* the is test below will fail if #6886 regresses. +>>> r2 = Restaurant.objects.get(pk=r.pk) +>>> p.restaurant = r2 +>>> p.restaurant is r2 +True + +# Assigning None fails: Place.restaurant is null=False +>>> p.restaurant = None +Traceback (most recent call last): + ... +ValueError: Cannot assign None: "Place.restaurant" does not allow null values. + +# You also can't assign an object of the wrong type here +>>> p.restaurant = p +Traceback (most recent call last): + ... +ValueError: Cannot assign "": "Place.restaurant" must be a "Restaurant" instance. + """} diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index 5beaf5fb09..8c9334c849 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -503,8 +503,9 @@ True # Despite having some extra aliases in the query, we can still omit them in a # values() query. ->>> qs.values('id', 'rank').order_by('id') -[{'id': 1, 'rank': 2}, {'id': 2, 'rank': 1}, {'id': 3, 'rank': 3}] +>>> dicts = qs.values('id', 'rank').order_by('id') +>>> [sorted(d.items()) for d in dicts] +[[('id', 1), ('rank', 2)], [('id', 2), ('rank', 1)], [('id', 3), ('rank', 3)]] Bugs #2874, #3002 >>> qs = Item.objects.select_related().order_by('note__note', 'name') diff --git a/tests/regressiontests/templates/loaders.py b/tests/regressiontests/templates/loaders.py new file mode 100644 index 0000000000..82e3c622d1 --- /dev/null +++ b/tests/regressiontests/templates/loaders.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +""" +Test cases for the template loaders +""" + +from django.conf import settings + +if __name__ == '__main__': + settings.configure() + +import unittest +import sys +import pkg_resources +import imp +import StringIO + +from django.template import TemplateDoesNotExist +from django.template.loaders.eggs import load_template_source as lts_egg + +#Mock classes and objects for pkg_resources functions +class MockProvider(pkg_resources.NullProvider): + def __init__(self, module): + pkg_resources.NullProvider.__init__(self, module) + self.module = module + + def _has(self, path): + return path in self.module._resources + + def _isdir(self,path): + return False + + def get_resource_stream(self, manager, resource_name): + return self.module._resources[resource_name] + + def _get(self, path): + return self.module._resources[path].read() + +class MockLoader(object): pass + +def create_egg(name, resources): + """ + Creates a mock egg with a list of resources + + name: The name of the module + resources: A dictionary of resources. Keys are the names and values the the data. + """ + egg = imp.new_module(name) + egg.__loader__ = MockLoader() + egg._resources = resources + sys.modules[name] = egg + + +class EggLoader(unittest.TestCase): + def setUp(self): + pkg_resources._provider_factories[MockLoader] = MockProvider + + self.empty_egg = create_egg("egg_empty", {}) + self.egg_1 = create_egg("egg_1", { + 'templates/y.html' : StringIO.StringIO("y"), + 'templates/x.txt' : StringIO.StringIO("x"), + }) + self._old_installed_apps = settings.INSTALLED_APPS + settings.INSTALLED_APPS = [] + + def tearDown(self): + settings.INSTALLED_APPS = self._old_installed_apps + + def test_empty(self): + "Loading any template on an empty egg should fail" + settings.INSTALLED_APPS = ['egg_empty'] + self.assertRaises(TemplateDoesNotExist, lts_egg, "not-existing.html") + + def test_non_existing(self): + "Template loading fails if the template is not in the egg" + settings.INSTALLED_APPS = ['egg_1'] + self.assertRaises(TemplateDoesNotExist, lts_egg, "not-existing.html") + + def test_existing(self): + "A template can be loaded from an egg" + settings.INSTALLED_APPS = ['egg_1'] + contents, template_name = lts_egg("y.html") + self.assertEqual(contents, "y") + self.assertEqual(template_name, "egg:egg_1:templates/y.html") + + def test_not_installed(self): + "Loading an existent template from an egg not included in INSTALLED_APPS should fail" + settings.INSTALLED_APPS = [] + self.assertRaises(TemplateDoesNotExist, lts_egg, "y.html") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index aef6f504b1..4effea55de 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -19,12 +19,15 @@ from django.utils.tzinfo import LocalTimezone from unicode import unicode_tests from context import context_tests + +from loaders import * + import filters # Some other tests we would like to run __test__ = { - 'unicode': unicode_tests, - 'context': context_tests, + 'unicode': unicode_tests, + 'context': context_tests } ################################# diff --git a/tests/regressiontests/test_client_regress/fixtures/testdata.json b/tests/regressiontests/test_client_regress/fixtures/testdata.json index 5c9e415240..0dcf625939 100644 --- a/tests/regressiontests/test_client_regress/fixtures/testdata.json +++ b/tests/regressiontests/test_client_regress/fixtures/testdata.json @@ -16,5 +16,41 @@ "email": "testclient@example.com", "date_joined": "2006-12-17 07:03:31" } + }, + { + "pk": "2", + "model": "auth.user", + "fields": { + "username": "inactive", + "first_name": "Inactive", + "last_name": "User", + "is_active": false, + "is_superuser": false, + "is_staff": false, + "last_login": "2006-12-17 07:03:31", + "groups": [], + "user_permissions": [], + "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", + "email": "testclient@example.com", + "date_joined": "2006-12-17 07:03:31" + } + }, + { + "pk": "3", + "model": "auth.user", + "fields": { + "username": "staff", + "first_name": "Staff", + "last_name": "Member", + "is_active": true, + "is_superuser": false, + "is_staff": true, + "last_login": "2006-12-17 07:03:31", + "groups": [], + "user_permissions": [], + "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", + "email": "testclient@example.com", + "date_joined": "2006-12-17 07:03:31" + } } ] \ No newline at end of file diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index 305ccc9aa3..a204ec3e72 100644 --- a/tests/regressiontests/test_client_regress/models.py +++ b/tests/regressiontests/test_client_regress/models.py @@ -4,6 +4,7 @@ Regression tests for the Test Client, especially the customized assertions. """ from django.test import Client, TestCase from django.core.urlresolvers import reverse +from django.core.exceptions import SuspiciousOperation import os class AssertContainsTests(TestCase): @@ -11,12 +12,18 @@ class AssertContainsTests(TestCase): "Responses can be inspected for content, including counting repeated substrings" response = self.client.get('/test_client_regress/no_template_view/') + self.assertNotContains(response, 'never') self.assertContains(response, 'never', 0) self.assertContains(response, 'once') self.assertContains(response, 'once', 1) self.assertContains(response, 'twice') self.assertContains(response, 'twice', 2) + try: + self.assertNotContains(response, 'once') + except AssertionError, e: + self.assertEquals(str(e), "Response should not contain 'once'") + try: self.assertContains(response, 'never', 1) except AssertionError, e: @@ -288,4 +295,26 @@ class URLEscapingTests(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'Hi, Arthur') +class ExceptionTests(TestCase): + fixtures = ['testdata.json'] + + def test_exception_cleared(self): + "#5836 - A stale user exception isn't re-raised by the test client." + login = self.client.login(username='testclient',password='password') + self.failUnless(login, 'Could not log in') + try: + response = self.client.get("/test_client_regress/staff_only/") + self.fail("General users should not be able to visit this page") + except SuspiciousOperation: + pass + + # At this point, an exception has been raised, and should be cleared. + + # This next operation should be successful; if it isn't we have a problem. + login = self.client.login(username='staff', password='password') + self.failUnless(login, 'Could not log in') + try: + self.client.get("/test_client_regress/staff_only/") + except SuspiciousOperation: + self.fail("Staff should be able to visit this page") diff --git a/tests/regressiontests/test_client_regress/urls.py b/tests/regressiontests/test_client_regress/urls.py index d3304caef0..dc26d1260a 100644 --- a/tests/regressiontests/test_client_regress/urls.py +++ b/tests/regressiontests/test_client_regress/urls.py @@ -4,6 +4,7 @@ import views urlpatterns = patterns('', (r'^no_template_view/$', views.no_template_view), (r'^file_upload/$', views.file_upload_view), + (r'^staff_only/$', views.staff_only_view), (r'^get_view/$', views.get_view), url(r'^arg_view/(?P.+)/$', views.view_with_argument, name='arg_view'), (r'^login_protected_redirect_view/$', views.login_protected_redirect_view) diff --git a/tests/regressiontests/test_client_regress/views.py b/tests/regressiontests/test_client_regress/views.py index f44757dc10..9632c17284 100644 --- a/tests/regressiontests/test_client_regress/views.py +++ b/tests/regressiontests/test_client_regress/views.py @@ -1,5 +1,8 @@ +import os + from django.contrib.auth.decorators import login_required from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError +from django.core.exceptions import SuspiciousOperation def no_template_view(request): "A simple view that expects a GET request, and returns a rendered template" @@ -13,10 +16,21 @@ def file_upload_view(request): form_data = request.POST.copy() form_data.update(request.FILES) if isinstance(form_data['file_field'], dict) and isinstance(form_data['name'], unicode): + # If a file is posted, the dummy client should only post the file name, + # not the full path. + if os.path.dirname(form_data['file_field']['filename']) != '': + return HttpResponseServerError() return HttpResponse('') else: return HttpResponseServerError() +def staff_only_view(request): + "A view that can only be visited by staff. Non staff members get an exception" + if request.user.is_staff: + return HttpResponse('') + else: + raise SuspiciousOperation() + def get_view(request): "A simple login protected view" return HttpResponse("Hello world") diff --git a/tests/runtests.py b/tests/runtests.py index aaac926d47..5bba9b9c15 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -118,7 +118,6 @@ def django_tests(verbosity, interactive, test_labels): get_apps() # Load all the test model apps. - test_models = [] for model_dir, model_name in get_test_models(): model_label = '.'.join([model_dir, model_name]) try: @@ -143,7 +142,13 @@ def django_tests(verbosity, interactive, test_labels): if not test_labels or model_name in test_labels: print >> sys.stderr,'****', model_label extra_tests.append(InvalidModelTestCase(model_label)) - + try: + # Invalid models are not working apps, so we cannot pass them into + # the test runner with the other test_labels + test_labels.remove(model_name) + except ValueError: + pass + # Run the test suite, including the extra validation tests. from django.test.simple import run_tests failures = run_tests(test_labels, verbosity=verbosity, interactive=interactive, extra_tests=extra_tests)