1
0
mirror of https://github.com/django/django.git synced 2025-07-04 09:49:12 +00:00

[soc2010/query-refactor] Merged up to trunk r13556, resolved merge conflicts

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/query-refactor@13565 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Alex Gaynor 2010-08-09 21:22:37 +00:00
parent c7bd48cb9f
commit 6001ba016a
141 changed files with 8784 additions and 1956 deletions

View File

@ -184,11 +184,13 @@ answer newbie questions, and generally made Django that much better:
Idan Gazit
geber@datacollect.com
Baishampayan Ghose
Joshua Ginsberg <jag@flowtheory.net>
Dimitris Glezos <dimitris@glezos.com>
glin@seznam.cz
martin.glueck@gmail.com
Artyom Gnilov <boobsd@gmail.com>
Ben Godfrey <http://aftnn.org>
Andrew Godwin <andrew@aeracode.org>
GomoX <gomo@datafull.com>
Guilherme Mesquita Gondim <semente@taurinus.org>
Mario Gonzalez <gonzalemario@gmail.com>
@ -337,6 +339,7 @@ answer newbie questions, and generally made Django that much better:
Aljosa Mohorovic <aljosa.mohorovic@gmail.com>
Ramiro Morales <rm0@gmx.net>
Eric Moritz <http://eric.themoritzfamily.com/>
Gregor Müllegger <gregor@muellegger.de>
Robin Munn <http://www.geekforgod.com/>
James Murty
msundstr

View File

@ -54,7 +54,7 @@ LANGUAGES = (
('en', gettext_noop('English')),
('en-gb', gettext_noop('British English')),
('es', gettext_noop('Spanish')),
('es-ar', gettext_noop('Argentinean Spanish')),
('es-ar', gettext_noop('Argentinian Spanish')),
('et', gettext_noop('Estonian')),
('eu', gettext_noop('Basque')),
('fa', gettext_noop('Persian')),
@ -78,6 +78,7 @@ LANGUAGES = (
('lt', gettext_noop('Lithuanian')),
('lv', gettext_noop('Latvian')),
('mk', gettext_noop('Macedonian')),
('ml', gettext_noop('Malayalam')),
('mn', gettext_noop('Mongolian')),
('nl', gettext_noop('Dutch')),
('no', gettext_noop('Norwegian')),

View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-09 14:26+0200\n"
"PO-Revision-Date: 2010-05-09 14:09+0100\n"
"POT-Creation-Date: 2010-08-06 18:35+0200\n"
"PO-Revision-Date: 2010-08-06 18:33+0100\n"
"Last-Translator: Vlada Macek <macek@sandbox.cz>\n"
"Language-Team: Czech\n"
"MIME-Version: 1.0\n"
@ -70,7 +70,7 @@ msgid "Spanish"
msgstr "španělsky"
#: conf/global_settings.py:57
msgid "Argentinean Spanish"
msgid "Argentinian Spanish"
msgstr "španělsky (Argentina)"
#: conf/global_settings.py:58
@ -122,138 +122,146 @@ msgid "Hungarian"
msgstr "maďarsky"
#: conf/global_settings.py:70
msgid "Indonesian"
msgstr "indonésky"
#: conf/global_settings.py:71
msgid "Icelandic"
msgstr "islandsky"
#: conf/global_settings.py:71
#: conf/global_settings.py:72
msgid "Italian"
msgstr "italsky"
#: conf/global_settings.py:72
#: conf/global_settings.py:73
msgid "Japanese"
msgstr "japonsky"
#: conf/global_settings.py:73
#: conf/global_settings.py:74
msgid "Georgian"
msgstr "gruzínsky"
#: conf/global_settings.py:74
#: conf/global_settings.py:75
msgid "Khmer"
msgstr "khmersky"
#: conf/global_settings.py:75
#: conf/global_settings.py:76
msgid "Kannada"
msgstr "kannadsky"
#: conf/global_settings.py:76
#: conf/global_settings.py:77
msgid "Korean"
msgstr "korejsky"
#: conf/global_settings.py:77
#: conf/global_settings.py:78
msgid "Lithuanian"
msgstr "litevsky"
#: conf/global_settings.py:78
#: conf/global_settings.py:79
msgid "Latvian"
msgstr "lotyšsky"
#: conf/global_settings.py:79
#: conf/global_settings.py:80
msgid "Macedonian"
msgstr "makedonsky"
#: conf/global_settings.py:80
#: conf/global_settings.py:81
msgid "Malayalam"
msgstr "malajálamsky"
#: conf/global_settings.py:82
msgid "Mongolian"
msgstr "mongolsky"
#: conf/global_settings.py:81
#: conf/global_settings.py:83
msgid "Dutch"
msgstr "holandsky"
#: conf/global_settings.py:82
#: conf/global_settings.py:84
msgid "Norwegian"
msgstr "norsky"
#: conf/global_settings.py:83
#: conf/global_settings.py:85
msgid "Norwegian Bokmal"
msgstr "norsky (Bokmål)"
#: conf/global_settings.py:84
#: conf/global_settings.py:86
msgid "Norwegian Nynorsk"
msgstr "norsky (Nynorsk)"
#: conf/global_settings.py:85
#: conf/global_settings.py:87
msgid "Polish"
msgstr "polsky"
#: conf/global_settings.py:86
#: conf/global_settings.py:88
msgid "Portuguese"
msgstr "portugalsky"
#: conf/global_settings.py:87
#: conf/global_settings.py:89
msgid "Brazilian Portuguese"
msgstr "portugalsky (Brazílie)"
#: conf/global_settings.py:88
#: conf/global_settings.py:90
msgid "Romanian"
msgstr "rumunsky"
#: conf/global_settings.py:89
#: conf/global_settings.py:91
msgid "Russian"
msgstr "rusky"
#: conf/global_settings.py:90
#: conf/global_settings.py:92
msgid "Slovak"
msgstr "slovensky"
#: conf/global_settings.py:91
#: conf/global_settings.py:93
msgid "Slovenian"
msgstr "slovinsky"
#: conf/global_settings.py:92
#: conf/global_settings.py:94
msgid "Albanian"
msgstr "albánsky"
#: conf/global_settings.py:93
#: conf/global_settings.py:95
msgid "Serbian"
msgstr "srbsky"
#: conf/global_settings.py:94
#: conf/global_settings.py:96
msgid "Serbian Latin"
msgstr "srbsky (latinkou)"
#: conf/global_settings.py:95
#: conf/global_settings.py:97
msgid "Swedish"
msgstr "švédsky"
#: conf/global_settings.py:96
#: conf/global_settings.py:98
msgid "Tamil"
msgstr "tamilsky"
#: conf/global_settings.py:97
#: conf/global_settings.py:99
msgid "Telugu"
msgstr "telužsky"
#: conf/global_settings.py:98
#: conf/global_settings.py:100
msgid "Thai"
msgstr "thajsky"
#: conf/global_settings.py:99
#: conf/global_settings.py:101
msgid "Turkish"
msgstr "turecky"
#: conf/global_settings.py:100
#: conf/global_settings.py:102
msgid "Ukrainian"
msgstr "ukrajinsky"
#: conf/global_settings.py:101
#: conf/global_settings.py:103
msgid "Vietnamese"
msgstr "vietnamsky"
#: conf/global_settings.py:102
#: conf/global_settings.py:104
msgid "Simplified Chinese"
msgstr "čínsky (zjednodušeně)"
#: conf/global_settings.py:103
#: conf/global_settings.py:105
msgid "Traditional Chinese"
msgstr "čínsky (tradičně)"
@ -305,15 +313,15 @@ msgstr "Tento měsíc"
msgid "This year"
msgstr "Tento rok"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes"
msgstr "Ano"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No"
msgstr "Ne"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown"
msgstr "Neznámé"
@ -359,7 +367,7 @@ msgid "Changed %s."
msgstr "Změněno: %s"
#: contrib/admin/options.py:559 contrib/admin/options.py:569
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845
#: forms/models.py:568
msgid "and"
msgstr "a"
@ -853,7 +861,7 @@ msgstr "Uložit a přidat další položku"
msgid "Save and continue editing"
msgstr "Uložit a pokračovat v úpravách"
#: contrib/admin/templates/admin/auth/user/add_form.html:5
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
@ -861,6 +869,10 @@ msgstr ""
"Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více "
"uživatelských nastavení."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Vložte uživatelské jméno a heslo."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1418,8 +1430,8 @@ msgstr "zpráva"
msgid "Logged out"
msgstr "Odhlášeno"
#: contrib/auth/management/commands/createsuperuser.py:23
#: core/validators.py:120 forms/fields.py:428
#: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address."
msgstr "Vložte platnou e-mailovou adresu."
@ -1491,7 +1503,7 @@ msgid "Email address"
msgstr "E-mailová adresa"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL"
msgstr "URL"
@ -1541,7 +1553,7 @@ msgstr "komentář"
msgid "date/time submitted"
msgstr "datum a čas byly zaslané"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896
#: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address"
msgstr "Adresa IP"
@ -4473,22 +4485,22 @@ msgstr "weby"
msgid "Enter a valid value."
msgstr "Vložte platnou hodnotu."
#: core/validators.py:87 forms/fields.py:529
#: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL."
msgstr "Vložte platnou adresu URL."
#: core/validators.py:89 forms/fields.py:530
#: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link."
msgstr "Tato adresa URL je zřejmě neplatný odkaz."
#: core/validators.py:123 forms/fields.py:873
#: core/validators.py:123 forms/fields.py:877
msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr ""
"Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a "
"pomlček."
#: core/validators.py:126 forms/fields.py:866
#: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address."
msgstr "Vložte platnou adresu typu IPv4."
@ -4501,12 +4513,12 @@ msgstr "Vložte pouze číslice oddělené čárkami."
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257
#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Hodnota musí být menší nebo rovna %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258
#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Hodnota musí být větší nebo rovna %(limit_value)s."
@ -4529,13 +4541,13 @@ msgstr ""
"Hodnota smí mít nejvýše %(limit_value)d znaků, ale nyní jich má %(show_value)"
"d."
#: db/models/base.py:822
#: db/models/base.py:823
#, python-format
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
msgstr ""
"Pole %(field_name)s musí být unikátní testem %(lookup)s pole %(date_field)s."
#: db/models/base.py:837 db/models/base.py:845
#: db/models/base.py:838 db/models/base.py:846
#, python-format
msgid "%(model_name)s with this %(field_label)s already exists."
msgstr ""
@ -4559,13 +4571,13 @@ msgstr "Pole nemůže být prázdné."
msgid "Field of type: %(field_type)s"
msgstr "Pole typu: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
#: db/models/fields/__init__.py:999
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:1007
msgid "Integer"
msgstr "Celé číslo"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer."
msgstr "Hodnota musí být celé číslo."
@ -4577,7 +4589,7 @@ msgstr "Hodnota musí být buď Ano (True) nebo Ne (False)."
msgid "Boolean (Either True or False)"
msgstr "Pravdivost (buď Ano (True), nebo Ne (False))"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format
msgid "String (up to %(max_length)s)"
msgstr "Řetězec (max. %(max_length)s znaků)"
@ -4619,44 +4631,44 @@ msgstr "Desetinné číslo"
msgid "E-mail address"
msgstr "E-mailová adresa"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220
#: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331
msgid "File path"
msgstr "Cesta k souboru"
#: db/models/fields/__init__.py:822
#: db/models/fields/__init__.py:830
msgid "This value must be a float."
msgstr "Hodnota musí být desetinné číslo."
#: db/models/fields/__init__.py:824
#: db/models/fields/__init__.py:832
msgid "Floating point number"
msgstr "Číslo s pohyblivou řádovou čárkou"
#: db/models/fields/__init__.py:883
#: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer"
msgstr "Velké číslo (8 bajtů)"
#: db/models/fields/__init__.py:912
#: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False."
msgstr "Hodnota musí být buď Nic (None), Ano (True) nebo Ne (False)."
#: db/models/fields/__init__.py:914
#: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)"
msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))"
#: db/models/fields/__init__.py:1005
#: db/models/fields/__init__.py:1013
msgid "Text"
msgstr "Text"
#: db/models/fields/__init__.py:1021
#: db/models/fields/__init__.py:1029
msgid "Time"
msgstr "Čas"
#: db/models/fields/__init__.py:1025
#: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Vložte platný čas ve tvaru HH:MM[:ss[.uuuuuu]]"
#: db/models/fields/__init__.py:1109
#: db/models/fields/__init__.py:1125
msgid "XML text"
msgstr "XML text"
@ -4669,22 +4681,22 @@ msgstr "Položka typu %(model)s s primárním klíčem %(pk)r neexistuje."
msgid "Foreign Key (type determined by related field)"
msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)"
#: db/models/fields/related.py:918
#: db/models/fields/related.py:919
msgid "One-to-one relationship"
msgstr "Vazba jedna-jedna"
#: db/models/fields/related.py:980
#: db/models/fields/related.py:981
msgid "Many-to-many relationship"
msgstr "Vazba mnoho-mnoho"
#: db/models/fields/related.py:1000
#: db/models/fields/related.py:1001
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Výběr více než jedné položky je možný přidržením klávesy \"Control\" (nebo "
"\"Command\" na Macu)."
#: db/models/fields/related.py:1061
#: db/models/fields/related.py:1062
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@ -4697,74 +4709,74 @@ msgstr[2] "Vložte platné ID položky %(self)s. Hodnoty %(value)r jsou neplatn
msgid "This field is required."
msgstr "Pole je povinné."
#: forms/fields.py:204
#: forms/fields.py:203
msgid "Enter a whole number."
msgstr "Vložte celé číslo."
#: forms/fields.py:235 forms/fields.py:256
#: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number."
msgstr "Vložte číslo."
#: forms/fields.py:259
#: forms/fields.py:258
#, python-format
msgid "Ensure that there are no more than %s digits in total."
msgstr "Hodnota nesmí celkem mít více než %s cifer."
#: forms/fields.py:260
#: forms/fields.py:259
#, python-format
msgid "Ensure that there are no more than %s decimal places."
msgstr "Hodnota nesmí mít za desetinnou čárkou více než %s cifer."
#: forms/fields.py:261
#: forms/fields.py:260
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Hodnota nesmí mít před desetinnou čárkou více než %s cifer."
#: forms/fields.py:323 forms/fields.py:838
#: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date."
msgstr "Vložte platné datum."
#: forms/fields.py:351 forms/fields.py:839
#: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time."
msgstr "Vložte platný čas."
#: forms/fields.py:377
#: forms/fields.py:376
msgid "Enter a valid date/time."
msgstr "Vložte platné datum a čas."
#: forms/fields.py:435
#: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře."
#: forms/fields.py:436
#: forms/fields.py:435
msgid "No file was submitted."
msgstr "Žádný soubor nebyl odeslán."
#: forms/fields.py:437
#: forms/fields.py:436
msgid "The submitted file is empty."
msgstr "Odeslaný soubor je prázdný."
#: forms/fields.py:438
#: forms/fields.py:437
#, python-format
msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr ""
"Délka názvu souboru má být nejvýše %(max)d znaků, ale nyní je %(length)d."
#: forms/fields.py:473
#: forms/fields.py:472
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
"Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen."
#: forms/fields.py:596 forms/fields.py:671
#: forms/fields.py:595 forms/fields.py:670
#, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002
#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values."
msgstr "Vložte seznam hodnot."

View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-09 14:30+0200\n"
"PO-Revision-Date: 2010-05-09 14:04+0100\n"
"POT-Creation-Date: 2010-08-06 18:35+0200\n"
"PO-Revision-Date: 2010-08-06 18:34+0100\n"
"Last-Translator: Vlada Macek <macek@sandbox.cz>\n"
"Language-Team: Czech\n"
"MIME-Version: 1.0\n"

View File

@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-26 15:49+0200\n"
"PO-Revision-Date: 2008-08-13 22:00+0200\n"
"Last-Translator: Finn Gruwier Larsen<finn@gruwier.dk>\n"
"POT-Creation-Date: 2010-08-07 11:57+0200\n"
"PO-Revision-Date: 2010-08-07 22:00+0200\n"
"Last-Translator: Finn Gruwier Larsen<finngruwierlarsen@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -44,13 +44,42 @@ msgstr "Foretag dit/dine valg og klik "
msgid "Clear all"
msgstr "Fravælg alle"
#: contrib/admin/media/js/actions.js:17
#: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s af %(cnt)s valgt"
msgstr[1] "%(sel)s af %(cnt)s valgt"
#: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
msgstr ""
"Du har ugemte ændringer af et eller flere redigerbare felter. Hvis du "
"udfører en handling fra drop-down-menuen, vil du miste disse ændringer."
#: contrib/admin/media/js/actions.js:121
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, but you haven't saved your changes to "
"individual fields yet. Please click OK to save. You'll need to re-run the "
"action."
msgstr ""
"Du har valgt en handling, men du har ikke gemt dine ændringer til et eller "
"flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen."
#: contrib/admin/media/js/actions.js:123
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, and you haven't made any changes on individual "
"fields. You're probably looking for the Go button rather than the Save "
"button."
msgstr ""
"Du har valgt en handling, og du har ikke udført nogen ændringer på felter. "
"Det, du søger er formentlig Udfør-knappen i stedet for Gem-knappen."
#: contrib/admin/media/js/calendar.js:24
#: contrib/admin/media/js/dateparse.js:32
msgid ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-13 15:30+0200\n"
"POT-Creation-Date: 2010-08-06 18:53+0200\n"
"PO-Revision-Date: 2010-04-26 13:53+0100\n"
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
"Language-Team: \n"
@ -72,7 +72,7 @@ msgid "Spanish"
msgstr "Spanisch"
#: conf/global_settings.py:57
msgid "Argentinean Spanish"
msgid "Argentinian Spanish"
msgstr "Argentinisches Spanisch"
#: conf/global_settings.py:58
@ -168,98 +168,102 @@ msgid "Macedonian"
msgstr "Mazedonisch"
#: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayalam"
#: conf/global_settings.py:82
msgid "Mongolian"
msgstr "Mongolisch"
#: conf/global_settings.py:82
#: conf/global_settings.py:83
msgid "Dutch"
msgstr "Holländisch"
#: conf/global_settings.py:83
#: conf/global_settings.py:84
msgid "Norwegian"
msgstr "Norwegisch"
#: conf/global_settings.py:84
#: conf/global_settings.py:85
msgid "Norwegian Bokmal"
msgstr "Norwegisch (Bokmål)"
#: conf/global_settings.py:85
#: conf/global_settings.py:86
msgid "Norwegian Nynorsk"
msgstr "Norwegisch (Nynorsk)"
#: conf/global_settings.py:86
#: conf/global_settings.py:87
msgid "Polish"
msgstr "Polnisch"
#: conf/global_settings.py:87
#: conf/global_settings.py:88
msgid "Portuguese"
msgstr "Portugiesisch"
#: conf/global_settings.py:88
#: conf/global_settings.py:89
msgid "Brazilian Portuguese"
msgstr "Brasilianisches Portugiesisch"
#: conf/global_settings.py:89
#: conf/global_settings.py:90
msgid "Romanian"
msgstr "Rumänisch"
#: conf/global_settings.py:90
#: conf/global_settings.py:91
msgid "Russian"
msgstr "Russisch"
#: conf/global_settings.py:91
#: conf/global_settings.py:92
msgid "Slovak"
msgstr "Slowakisch"
#: conf/global_settings.py:92
#: conf/global_settings.py:93
msgid "Slovenian"
msgstr "Slowenisch"
#: conf/global_settings.py:93
#: conf/global_settings.py:94
msgid "Albanian"
msgstr "Albanisch"
#: conf/global_settings.py:94
#: conf/global_settings.py:95
msgid "Serbian"
msgstr "Serbisch"
#: conf/global_settings.py:95
#: conf/global_settings.py:96
msgid "Serbian Latin"
msgstr "Serbisch (Latein)"
#: conf/global_settings.py:96
#: conf/global_settings.py:97
msgid "Swedish"
msgstr "Schwedisch"
#: conf/global_settings.py:97
#: conf/global_settings.py:98
msgid "Tamil"
msgstr "Tamilisch"
#: conf/global_settings.py:98
#: conf/global_settings.py:99
msgid "Telugu"
msgstr "Telugisch"
#: conf/global_settings.py:99
#: conf/global_settings.py:100
msgid "Thai"
msgstr "Thailändisch"
#: conf/global_settings.py:100
#: conf/global_settings.py:101
msgid "Turkish"
msgstr "Türkisch"
#: conf/global_settings.py:101
#: conf/global_settings.py:102
msgid "Ukrainian"
msgstr "Ukrainisch"
#: conf/global_settings.py:102
#: conf/global_settings.py:103
msgid "Vietnamese"
msgstr "Vietnamesisch"
#: conf/global_settings.py:103
#: conf/global_settings.py:104
msgid "Simplified Chinese"
msgstr "Vereinfachtes Chinesisch"
#: conf/global_settings.py:104
#: conf/global_settings.py:105
msgid "Traditional Chinese"
msgstr "Traditionelles Chinesisch"
@ -311,15 +315,15 @@ msgstr "Diesen Monat"
msgid "This year"
msgstr "Dieses Jahr"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes"
msgstr "Ja"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No"
msgstr "Nein"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown"
msgstr "Unbekannt"
@ -696,7 +700,7 @@ msgid "Filter"
msgstr "Filter"
#: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete"
msgstr "Löschen"
@ -859,7 +863,7 @@ msgstr "Sichern und neu hinzufügen"
msgid "Save and continue editing"
msgstr "Sichern und weiter bearbeiten"
#: contrib/admin/templates/admin/auth/user/add_form.html:5
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
@ -867,6 +871,10 @@ msgstr ""
"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
"Optionen für den Benutzer geändert werden."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Bitte einen Benutzernamen und ein Passwort eingeben."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1437,8 +1445,8 @@ msgstr "Mitteilung"
msgid "Logged out"
msgstr "Abgemeldet"
#: contrib/auth/management/commands/createsuperuser.py:23
#: core/validators.py:120 forms/fields.py:428
#: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address."
msgstr "Bitte eine gültige E-Mail-Adresse eingeben."
@ -1506,7 +1514,7 @@ msgid "Email address"
msgstr "E-Mail-Adresse"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL"
msgstr "Adresse (URL)"
@ -1557,7 +1565,7 @@ msgstr "Kommentar"
msgid "date/time submitted"
msgstr "Datum/Zeit Erstellung"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896
#: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address"
msgstr "IP-Adresse"
@ -4509,22 +4517,22 @@ msgstr "Sites"
msgid "Enter a valid value."
msgstr "Bitte einen gültigen Wert eingeben."
#: core/validators.py:87 forms/fields.py:529
#: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL."
msgstr "Bitte eine gültige Adresse eingeben."
#: core/validators.py:89 forms/fields.py:530
#: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link."
msgstr "Diese Adresse scheint nicht gültig zu sein."
#: core/validators.py:123 forms/fields.py:873
#: core/validators.py:123 forms/fields.py:877
msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr ""
"Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen "
"und Bindestrichen, eingeben."
#: core/validators.py:126 forms/fields.py:866
#: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address."
msgstr "Bitte eine gültige IPv4-Adresse eingeben."
@ -4539,12 +4547,12 @@ msgstr ""
"Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist %(show_value)"
"s)"
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257
#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258
#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein."
@ -4595,13 +4603,13 @@ msgstr "Dieses Feld darf nicht leer sein."
msgid "Field of type: %(field_type)s"
msgstr "Feldtyp: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
#: db/models/fields/__init__.py:999
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:1007
msgid "Integer"
msgstr "Ganzzahl"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer."
msgstr "Dieser Wert muss eine Ganzzahl sein."
@ -4613,7 +4621,7 @@ msgstr "Dieser Wert muss True oder False sein."
msgid "Boolean (Either True or False)"
msgstr "Boolescher Wert (True oder False)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format
msgid "String (up to %(max_length)s)"
msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)"
@ -4657,44 +4665,44 @@ msgstr "Dezimalzahl"
msgid "E-mail address"
msgstr "E-Mail-Adresse"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220
#: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331
msgid "File path"
msgstr "Dateipfad"
#: db/models/fields/__init__.py:822
#: db/models/fields/__init__.py:830
msgid "This value must be a float."
msgstr "Dieser Wert muss eine Gleitkommazahl sein."
#: db/models/fields/__init__.py:824
#: db/models/fields/__init__.py:832
msgid "Floating point number"
msgstr "Gleitkommazahl"
#: db/models/fields/__init__.py:883
#: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer"
msgstr "Große Ganzzahl (8 Byte)"
#: db/models/fields/__init__.py:912
#: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False."
msgstr "Dieser Wert muss None, True oder False sein."
#: db/models/fields/__init__.py:914
#: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)"
msgstr "Boolescher Wert (True, False oder None)"
#: db/models/fields/__init__.py:1005
#: db/models/fields/__init__.py:1013
msgid "Text"
msgstr "Text"
#: db/models/fields/__init__.py:1021
#: db/models/fields/__init__.py:1029
msgid "Time"
msgstr "Zeit"
#: db/models/fields/__init__.py:1025
#: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Bitte eine gültige Zeit im Format HH:MM[:ss[.uuuuuu]] eingeben."
#: db/models/fields/__init__.py:1109
#: db/models/fields/__init__.py:1125
msgid "XML text"
msgstr "XML-Text"
@ -4707,22 +4715,22 @@ msgstr "Modell %(model)s mit dem Primärschlüssel %(pk)r ist nicht vorhanden."
msgid "Foreign Key (type determined by related field)"
msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)"
#: db/models/fields/related.py:918
#: db/models/fields/related.py:919
msgid "One-to-one relationship"
msgstr "One-to-one-Beziehung"
#: db/models/fields/related.py:980
#: db/models/fields/related.py:981
msgid "Many-to-many relationship"
msgstr "Many-to-many-Beziehung"
#: db/models/fields/related.py:1000
#: db/models/fields/related.py:1001
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um "
"mehrere Einträge auszuwählen."
#: db/models/fields/related.py:1061
#: db/models/fields/related.py:1062
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@ -4736,55 +4744,55 @@ msgstr[1] ""
msgid "This field is required."
msgstr "Dieses Feld ist zwingend erforderlich."
#: forms/fields.py:204
#: forms/fields.py:203
msgid "Enter a whole number."
msgstr "Bitte eine ganze Zahl eingeben."
#: forms/fields.py:235 forms/fields.py:256
#: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number."
msgstr "Bitte eine Zahl eingeben."
#: forms/fields.py:259
#: forms/fields.py:258
#, python-format
msgid "Ensure that there are no more than %s digits in total."
msgstr "Bitte geben Sie nicht mehr als insgesamt %s Ziffern ein."
#: forms/fields.py:260
#: forms/fields.py:259
#, python-format
msgid "Ensure that there are no more than %s decimal places."
msgstr "Bitte geben Sie nicht mehr als %s Dezimalstellen ein."
#: forms/fields.py:261
#: forms/fields.py:260
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Bitte geben Sie nicht mehr als %s Ziffern vor dem Komma ein."
#: forms/fields.py:323 forms/fields.py:838
#: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date."
msgstr "Bitte ein gültiges Datum eingeben."
#: forms/fields.py:351 forms/fields.py:839
#: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time."
msgstr "Bitte eine gültige Uhrzeit eingeben."
#: forms/fields.py:377
#: forms/fields.py:376
msgid "Enter a valid date/time."
msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben."
#: forms/fields.py:435
#: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"Es wurde keine Datei übermittelt. Überprüfen Sie das Encoding des Formulars."
#: forms/fields.py:436
#: forms/fields.py:435
msgid "No file was submitted."
msgstr "Es wurde keine Datei übertragen."
#: forms/fields.py:437
#: forms/fields.py:436
msgid "The submitted file is empty."
msgstr "Die ausgewählte Datei ist leer."
#: forms/fields.py:438
#: forms/fields.py:437
#, python-format
msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
@ -4792,7 +4800,7 @@ msgstr ""
"Bitte sicherstellen, dass der Dateiname maximal %(max)d Zeichen hat. (Er hat "
"%(length)d)."
#: forms/fields.py:473
#: forms/fields.py:472
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@ -4800,17 +4808,17 @@ msgstr ""
"Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild oder ist "
"defekt."
#: forms/fields.py:596 forms/fields.py:671
#: forms/fields.py:595 forms/fields.py:670
#, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr ""
"Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002
#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values."
msgstr "Bitte eine Liste mit Werten eingeben."
#: forms/formsets.py:298 forms/formsets.py:300
#: forms/formsets.py:296 forms/formsets.py:298
msgid "Order"
msgstr "Reihenfolge"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-11 08:35-0300\n"
"PO-Revision-Date: 2010-05-17 10:52-0300\n"
"POT-Creation-Date: 2010-08-06 15:38-0300\n"
"PO-Revision-Date: 2010-08-06 16:02-0300\n"
"Last-Translator: Ramiro <rm0@gmx.net>\n"
"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
"Language: es_AR\n"
@ -70,7 +70,7 @@ msgid "Spanish"
msgstr "español"
#: conf/global_settings.py:57
msgid "Argentinean Spanish"
msgid "Argentinian Spanish"
msgstr "español de Argentina"
#: conf/global_settings.py:58
@ -166,98 +166,102 @@ msgid "Macedonian"
msgstr "macedonio"
#: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayalam"
#: conf/global_settings.py:82
msgid "Mongolian"
msgstr "mongol"
#: conf/global_settings.py:82
#: conf/global_settings.py:83
msgid "Dutch"
msgstr "holandés"
#: conf/global_settings.py:83
#: conf/global_settings.py:84
msgid "Norwegian"
msgstr "noruego"
#: conf/global_settings.py:84
#: conf/global_settings.py:85
msgid "Norwegian Bokmal"
msgstr "bokmål"
#: conf/global_settings.py:85
#: conf/global_settings.py:86
msgid "Norwegian Nynorsk"
msgstr "nynorsk"
#: conf/global_settings.py:86
#: conf/global_settings.py:87
msgid "Polish"
msgstr "polaco"
#: conf/global_settings.py:87
#: conf/global_settings.py:88
msgid "Portuguese"
msgstr "portugués"
#: conf/global_settings.py:88
#: conf/global_settings.py:89
msgid "Brazilian Portuguese"
msgstr "portugués de Brasil"
#: conf/global_settings.py:89
#: conf/global_settings.py:90
msgid "Romanian"
msgstr "rumano"
#: conf/global_settings.py:90
#: conf/global_settings.py:91
msgid "Russian"
msgstr "ruso"
#: conf/global_settings.py:91
#: conf/global_settings.py:92
msgid "Slovak"
msgstr "eslovaco"
#: conf/global_settings.py:92
#: conf/global_settings.py:93
msgid "Slovenian"
msgstr "esloveno"
#: conf/global_settings.py:93
#: conf/global_settings.py:94
msgid "Albanian"
msgstr "albanés"
#: conf/global_settings.py:94
#: conf/global_settings.py:95
msgid "Serbian"
msgstr "serbio"
#: conf/global_settings.py:95
#: conf/global_settings.py:96
msgid "Serbian Latin"
msgstr "Latín de Serbia"
#: conf/global_settings.py:96
#: conf/global_settings.py:97
msgid "Swedish"
msgstr "sueco"
#: conf/global_settings.py:97
#: conf/global_settings.py:98
msgid "Tamil"
msgstr "tamil"
#: conf/global_settings.py:98
#: conf/global_settings.py:99
msgid "Telugu"
msgstr "telugu"
#: conf/global_settings.py:99
#: conf/global_settings.py:100
msgid "Thai"
msgstr "tailandés"
#: conf/global_settings.py:100
#: conf/global_settings.py:101
msgid "Turkish"
msgstr "turco"
#: conf/global_settings.py:101
#: conf/global_settings.py:102
msgid "Ukrainian"
msgstr "ucraniano"
#: conf/global_settings.py:102
#: conf/global_settings.py:103
msgid "Vietnamese"
msgstr "vietnamita"
#: conf/global_settings.py:103
#: conf/global_settings.py:104
msgid "Simplified Chinese"
msgstr "chino simplificado"
#: conf/global_settings.py:104
#: conf/global_settings.py:105
msgid "Traditional Chinese"
msgstr "chino tradicional"
@ -309,15 +313,15 @@ msgstr "Este mes"
msgid "This year"
msgstr "Este año"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes"
msgstr "Sí"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No"
msgstr "No"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown"
msgstr "Desconocido"
@ -363,7 +367,7 @@ msgid "Changed %s."
msgstr "Modifica %s."
#: contrib/admin/options.py:559 contrib/admin/options.py:569
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845
#: forms/models.py:568
msgid "and"
msgstr "y"
@ -692,7 +696,7 @@ msgid "Filter"
msgstr "Filtrar"
#: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete"
msgstr "Eliminar"
@ -855,13 +859,17 @@ msgstr "Guardar y agregar otro"
msgid "Save and continue editing"
msgstr "Guardar y continuar editando"
#: contrib/admin/templates/admin/auth/user/add_form.html:5
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
msgstr ""
"Primero, introduzca un nombre de usuario y una contraseña. Luego podrá "
"configurar opciones adicionales."
"Primero introduzca un nombre de usuario y una contraseña. Luego podrá "
"configurar opciones adicionales acerca del usuario."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Introduzca un nombre de usuario y una contraseña."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
@ -1435,8 +1443,8 @@ msgstr "mensaje"
msgid "Logged out"
msgstr "Sesión cerrada"
#: contrib/auth/management/commands/createsuperuser.py:23
#: core/validators.py:120 forms/fields.py:428
#: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address."
msgstr "Introduzca una dirección de correo electrónico válida"
@ -1504,7 +1512,7 @@ msgid "Email address"
msgstr "Dirección de correo electrónico"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL"
msgstr "URL"
@ -1553,7 +1561,7 @@ msgstr "comentario"
msgid "date/time submitted"
msgstr "fecha/hora de envío"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896
#: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address"
msgstr "Dirección IP"
@ -4503,20 +4511,20 @@ msgstr "sitios"
msgid "Enter a valid value."
msgstr "Introduzca un valor válido."
#: core/validators.py:87 forms/fields.py:529
#: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL."
msgstr "Introduzca una URL válida."
#: core/validators.py:89 forms/fields.py:530
#: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link."
msgstr "La URL parece ser un enlace roto."
#: core/validators.py:123 forms/fields.py:873
#: core/validators.py:123 forms/fields.py:877
msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "Introduzca un 'slug' válido consistente de letras, números o guiones."
#: core/validators.py:126 forms/fields.py:866
#: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address."
msgstr "Introduzca una dirección IPv4 válida"
@ -4528,15 +4536,15 @@ msgstr "Introduzca sólo dígitos separados por comas."
#, python-format
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr ""
"Asegúrese de que este valor sea %(limit_value)s (actualmente es %(show_value)"
"s)."
"Asegúrese de que este valor sea %(limit_value)s (actualmente es "
"%(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257
#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258
#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
@ -4544,8 +4552,8 @@ msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
#: core/validators.py:164
#, python-format
msgid ""
"Ensure this value has at least %(limit_value)d characters (it has %"
"(show_value)d)."
"Ensure this value has at least %(limit_value)d characters (it has "
"%(show_value)d)."
msgstr ""
"Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene "
"%(show_value)d)."
@ -4553,20 +4561,20 @@ msgstr ""
#: core/validators.py:170
#, python-format
msgid ""
"Ensure this value has at most %(limit_value)d characters (it has %"
"(show_value)d)."
"Ensure this value has at most %(limit_value)d characters (it has "
"%(show_value)d)."
msgstr ""
"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres "
"(tiene %(show_value)d)."
#: db/models/base.py:822
#: db/models/base.py:823
#, python-format
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
msgstr ""
"%(field_name)s debe ser único/a para un %(lookup)s %(date_field)s "
"determinado."
#: db/models/base.py:837 db/models/base.py:845
#: db/models/base.py:838 db/models/base.py:846
#, python-format
msgid "%(model_name)s with this %(field_label)s already exists."
msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s."
@ -4589,13 +4597,13 @@ msgstr "Este campo no puede estar en blanco."
msgid "Field of type: %(field_type)s"
msgstr "Campo tipo: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
#: db/models/fields/__init__.py:999
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:1007
msgid "Integer"
msgstr "Entero"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer."
msgstr "Este valor debe ser un número entero."
@ -4607,7 +4615,7 @@ msgstr "Este valor debe ser True o False."
msgid "Boolean (Either True or False)"
msgstr "Booleano (Verdadero o Falso)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format
msgid "String (up to %(max_length)s)"
msgstr "Cadena (máximo %(max_length)s)"
@ -4651,44 +4659,44 @@ msgstr "Número decimal"
msgid "E-mail address"
msgstr "Dirección de correo electrónico"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220
#: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331
msgid "File path"
msgstr "Ruta de archivo"
#: db/models/fields/__init__.py:822
#: db/models/fields/__init__.py:830
msgid "This value must be a float."
msgstr "Este valor debe ser un valor en representación de punto flotante."
#: db/models/fields/__init__.py:824
#: db/models/fields/__init__.py:832
msgid "Floating point number"
msgstr "Número de punto flotante"
#: db/models/fields/__init__.py:883
#: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer"
msgstr "Entero grande (8 bytes)"
#: db/models/fields/__init__.py:912
#: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False."
msgstr "Este valor debe ser None, True o False."
#: db/models/fields/__init__.py:914
#: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)"
#: db/models/fields/__init__.py:1005
#: db/models/fields/__init__.py:1013
msgid "Text"
msgstr "Texto"
#: db/models/fields/__init__.py:1021
#: db/models/fields/__init__.py:1029
msgid "Time"
msgstr "Hora"
#: db/models/fields/__init__.py:1025
#: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Introduzca un valor de hora válido en formato HH:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:1109
#: db/models/fields/__init__.py:1125
msgid "XML text"
msgstr "Texto XML"
@ -4701,22 +4709,22 @@ msgstr "No existe un modelo %(model)s con una clave primaria %(pk)r."
msgid "Foreign Key (type determined by related field)"
msgstr "Clave foránea (el tipo está determinado por el campo relacionado)"
#: db/models/fields/related.py:918
#: db/models/fields/related.py:919
msgid "One-to-one relationship"
msgstr "Relación uno-a-uno"
#: db/models/fields/related.py:980
#: db/models/fields/related.py:981
msgid "Many-to-many relationship"
msgstr "Relación muchos-a-muchos"
#: db/models/fields/related.py:1000
#: db/models/fields/related.py:1001
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
"más de uno."
#: db/models/fields/related.py:1061
#: db/models/fields/related.py:1062
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@ -4732,55 +4740,55 @@ msgstr[1] ""
msgid "This field is required."
msgstr "Este campo es obligatorio."
#: forms/fields.py:204
#: forms/fields.py:203
msgid "Enter a whole number."
msgstr "Introduzca un número entero."
#: forms/fields.py:235 forms/fields.py:256
#: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number."
msgstr "Introduzca un número."
#: forms/fields.py:259
#: forms/fields.py:258
#, python-format
msgid "Ensure that there are no more than %s digits in total."
msgstr "Asegúrese de que no existan en total mas de %s dígitos."
#: forms/fields.py:260
#: forms/fields.py:259
#, python-format
msgid "Ensure that there are no more than %s decimal places."
msgstr "Asegúrese de que no existan mas de %s lugares decimales."
#: forms/fields.py:261
#: forms/fields.py:260
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Asegúrese de que no existan mas de %s dígitos antes del punto decimal."
#: forms/fields.py:323 forms/fields.py:838
#: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date."
msgstr "Introduzca una fecha válida."
#: forms/fields.py:351 forms/fields.py:839
#: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time."
msgstr "Introduzca un valor de hora válido."
#: forms/fields.py:377
#: forms/fields.py:376
msgid "Enter a valid date/time."
msgstr "Introduzca un valor de fecha/hora válido."
#: forms/fields.py:435
#: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"No se envió un archivo. Verifique el tipo de codificación en el formulario."
#: forms/fields.py:436
#: forms/fields.py:435
msgid "No file was submitted."
msgstr "No se envió ningún archivo."
#: forms/fields.py:437
#: forms/fields.py:436
msgid "The submitted file is empty."
msgstr "El archivo enviado está vacío."
#: forms/fields.py:438
#: forms/fields.py:437
#, python-format
msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
@ -4788,7 +4796,7 @@ msgstr ""
"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres "
"(tiene %(length)d)."
#: forms/fields.py:473
#: forms/fields.py:472
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@ -4796,18 +4804,18 @@ msgstr ""
"Seleccione una imagen válida. El archivo que ha seleccionado no es una "
"imagen o es un un archivo de imagen corrupto."
#: forms/fields.py:596 forms/fields.py:671
#: forms/fields.py:595 forms/fields.py:670
#, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr ""
"Seleccione una opción válida. %(value)s no es una de las opciones "
"disponibles."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002
#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values."
msgstr "Introduzca una lista de valores."
#: forms/formsets.py:298 forms/formsets.py:300
#: forms/formsets.py:296 forms/formsets.py:298
msgid "Order"
msgstr "Ordenar"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-04 22:01-0300\n"
"PO-Revision-Date: 2010-05-04 22:10-0300\n"
"POT-Creation-Date: 2010-08-06 15:47-0300\n"
"PO-Revision-Date: 2010-08-06 15:52-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
"Language: es_AR\n"
@ -17,45 +17,17 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.1\n"
#: contrib/admin/media/js/SelectFilter2.js:37
#, perl-format
msgid "Available %s"
msgstr "%s disponibles"
#: contrib/admin/media/js/SelectFilter2.js:45
msgid "Choose all"
msgstr "Seleccionar todos"
#: contrib/admin/media/js/SelectFilter2.js:50
msgid "Add"
msgstr "Agregar"
#: contrib/admin/media/js/SelectFilter2.js:52
msgid "Remove"
msgstr "Eliminar"
#: contrib/admin/media/js/SelectFilter2.js:57
#, perl-format
msgid "Chosen %s"
msgstr "%s elegidos"
#: contrib/admin/media/js/SelectFilter2.js:58
msgid "Select your choice(s) and click "
msgstr "Seleccione los items a agregar y haga click en "
#: contrib/admin/media/js/SelectFilter2.js:63
msgid "Clear all"
msgstr "Eliminar todos"
#: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s de %(cnt)s seleccionado/a"
msgstr[1] "%(sel)s de %(cnt)s seleccionados/as"
#: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,156 @@
# Translation of Django Js files to malayalam.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Rajeesh Nair <rajeeshrnair@gmail.com>, 2010.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Django SVN\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-28 15:32+0530\n"
"PO-Revision-Date: 2010-05-28 15:45+0530\n"
"Last-Translator: Rajeesh Nair <rajeeshrnair@gmail.com>\n"
"Language-Team: Malayalam <ml@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Malayalam\n"
"X-Poedit-Country: INDIA\n"
#: contrib/admin/media/js/SelectFilter2.js:37
#, perl-format
msgid "Available %s"
msgstr "ലഭ്യമായ %s"
#: contrib/admin/media/js/SelectFilter2.js:45
msgid "Choose all"
msgstr "എല്ലാം തെരഞ്ഞെടുക്കുക"
#: contrib/admin/media/js/SelectFilter2.js:50
msgid "Add"
msgstr "പുതിയത് ചേര്‍ക്കൂ"
#: contrib/admin/media/js/SelectFilter2.js:52
msgid "Remove"
msgstr "നീക്കം ചെയ്യൂ"
#: contrib/admin/media/js/SelectFilter2.js:57
#, perl-format
msgid "Chosen %s"
msgstr "തെരഞ്ഞെടുത്ത %s"
#: contrib/admin/media/js/SelectFilter2.js:58
msgid "Select your choice(s) and click "
msgstr "ഉചിതമായത് തെരഞ്ഞെടുത്ത ശേഷം ക്ളിക് ചെയ്യൂ"
#: contrib/admin/media/js/SelectFilter2.js:63
msgid "Clear all"
msgstr "എല്ലാം ക്ളിയര്‍ ചെയ്യൂ"
#: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(cnt)sല് %(sel)s തെരഞ്ഞെടുത്തു"
msgstr[1] "%(cnt)sല് %(sel)s എണ്ണം തെരഞ്ഞെടുത്തു"
#: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
msgstr "വരുത്തിയ മാറ്റങ്ങള്‍ സേവ് ചെയ്തിട്ടില്ല. ഒരു ആക്ഷന്‍ പ്രയോഗിച്ചാല്‍ സേവ് ചെയ്യാത്ത "
"മാറ്റങ്ങളെല്ലാം നഷ്ടപ്പെടും."
#: contrib/admin/media/js/actions.js:121
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, but you haven't saved your changes to "
"individual fields yet. Please click OK to save. You'll need to re-run the "
"action."
msgstr ""
"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. പക്ഷേ, കളങ്ങളിലെ മാറ്റങ്ങള്‍ ഇനിയും സേവ് ചെയ്യാനുണ്ട്. ആദ്യം സേവ്"
"ചെയ്യാനായി OK ക്ലിക് ചെയ്യുക. അതിനു ശേഷം ആക്ഷന്‍ ഒന്നു കൂടി പ്രയോഗിക്കേണ്ടി വരും."
#: contrib/admin/media/js/actions.js:123
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, and you haven't made any changes on individual "
"fields. You're probably looking for the Go button rather than the Save "
"button."
msgstr ""
"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. കളങ്ങളില്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങള്‍ ഇല്ല. നിങ്ങള്‍"
"സേവ് ബട്ടണ്‍ തന്നെയാണോ അതോ ഗോ ബട്ടണാണോ ഉദ്ദേശിച്ചത്."
#: contrib/admin/media/js/calendar.js:24
#: contrib/admin/media/js/dateparse.js:32
msgid ""
"January February March April May June July August September October November "
"December"
msgstr "ജനുവരി ഫെബൃവരി മാര്‍ച്ച് ഏപ്രില്‍ മെയ് ജൂണ്‍ ജൂലൈ ആഗസ്ത് സെപ്തംബര്‍ ഒക്ടോബര്‍ നവംബര്‍ ഡിസംബര്‍"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
msgstr "ഞാ തി ചൊ ബു വ്യാ വെ ശ"
#: contrib/admin/media/js/collapse.js:9 contrib/admin/media/js/collapse.js:21
#: contrib/admin/media/js/collapse.min.js:1
msgid "Show"
msgstr "കാണട്ടെ"
#: contrib/admin/media/js/collapse.js:16
#: contrib/admin/media/js/collapse.min.js:1
msgid "Hide"
msgstr "മറയട്ടെ"
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "ഞായര്‍ തിങ്കള്‍ ചൊവ്വ ബുധന്‍ വ്യാഴം വെള്ളി ശനി"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "Now"
msgstr "ഇപ്പോള്‍"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:52
msgid "Clock"
msgstr "ഘടികാരം (ക്ലോക്ക്)"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:79
msgid "Choose a time"
msgstr "സമയം തെരഞ്ഞെടുക്കൂ"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Midnight"
msgstr "അര്‍ധരാത്രി"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:85
msgid "6 a.m."
msgstr "6 a.m."
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:86
msgid "Noon"
msgstr "ഉച്ച"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:90
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:187
msgid "Cancel"
msgstr "റദ്ദാക്കൂ"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:181
msgid "Today"
msgstr "ഇന്ന്"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:136
msgid "Calendar"
msgstr "കലണ്ടര്‍"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Yesterday"
msgstr "ഇന്നലെ"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Tomorrow"
msgstr "നാളെ"

View File

View File

@ -0,0 +1,38 @@
# -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package.
#
DATE_FORMAT = 'N j, Y'
TIME_FORMAT = 'P'
DATETIME_FORMAT = 'N j, Y, P'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'F j'
SHORT_DATE_FORMAT = 'm/d/Y'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
FIRST_DAY_OF_WEEK = 0 # Sunday
DATE_INPUT_FORMATS = (
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
# '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
# '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
# '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
# '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
)
TIME_INPUT_FORMATS = (
'%H:%M:%S', # '14:30:59'
'%H:%M', # '14:30'
)
DATETIME_INPUT_FORMATS = (
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06'
)
DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = ','
NUMBER_GROUPING = 3

View File

@ -4,17 +4,18 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-07 20:44+0200\n"
"PO-Revision-Date: 2010-03-23 23:39+0100\n"
"POT-Creation-Date: 2010-08-06 19:53+0200\n"
"PO-Revision-Date: 2010-08-06 19:47+0100\n"
"Last-Translator: Janos Guljas <janos@janos.in.rs>\n"
"Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas "
"<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail."
"com>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: conf/global_settings.py:44
msgid "Arabic"
@ -69,7 +70,7 @@ msgid "Spanish"
msgstr "шпански"
#: conf/global_settings.py:57
msgid "Argentinean Spanish"
msgid "Argentinian Spanish"
msgstr "аргентински шпански"
#: conf/global_settings.py:58
@ -121,138 +122,146 @@ msgid "Hungarian"
msgstr "мађарски"
#: conf/global_settings.py:70
msgid "Indonesian"
msgstr "индонежански"
#: conf/global_settings.py:71
msgid "Icelandic"
msgstr "исландски"
#: conf/global_settings.py:71
#: conf/global_settings.py:72
msgid "Italian"
msgstr "италијански"
#: conf/global_settings.py:72
#: conf/global_settings.py:73
msgid "Japanese"
msgstr "јапански"
#: conf/global_settings.py:73
#: conf/global_settings.py:74
msgid "Georgian"
msgstr "грузијски"
#: conf/global_settings.py:74
#: conf/global_settings.py:75
msgid "Khmer"
msgstr "камбодијски"
#: conf/global_settings.py:75
#: conf/global_settings.py:76
msgid "Kannada"
msgstr "канада"
#: conf/global_settings.py:76
#: conf/global_settings.py:77
msgid "Korean"
msgstr "корејски"
#: conf/global_settings.py:77
#: conf/global_settings.py:78
msgid "Lithuanian"
msgstr "литвански"
#: conf/global_settings.py:78
#: conf/global_settings.py:79
msgid "Latvian"
msgstr "латвијски"
#: conf/global_settings.py:79
#: conf/global_settings.py:80
msgid "Macedonian"
msgstr "македонски"
#: conf/global_settings.py:80
#: conf/global_settings.py:81
msgid "Malayalam"
msgstr "малајаламски"
#: conf/global_settings.py:82
msgid "Mongolian"
msgstr "монголски"
#: conf/global_settings.py:81
#: conf/global_settings.py:83
msgid "Dutch"
msgstr "холандски"
#: conf/global_settings.py:82
#: conf/global_settings.py:84
msgid "Norwegian"
msgstr "норвешки"
#: conf/global_settings.py:83
#: conf/global_settings.py:85
msgid "Norwegian Bokmal"
msgstr "норвешки кнјжевни"
#: conf/global_settings.py:84
#: conf/global_settings.py:86
msgid "Norwegian Nynorsk"
msgstr "норвешки нови"
#: conf/global_settings.py:85
#: conf/global_settings.py:87
msgid "Polish"
msgstr "пољски"
#: conf/global_settings.py:86
#: conf/global_settings.py:88
msgid "Portuguese"
msgstr "португалски"
#: conf/global_settings.py:87
#: conf/global_settings.py:89
msgid "Brazilian Portuguese"
msgstr "бразилски португалски"
#: conf/global_settings.py:88
#: conf/global_settings.py:90
msgid "Romanian"
msgstr "румунски"
#: conf/global_settings.py:89
#: conf/global_settings.py:91
msgid "Russian"
msgstr "руски"
#: conf/global_settings.py:90
#: conf/global_settings.py:92
msgid "Slovak"
msgstr "словачки"
#: conf/global_settings.py:91
#: conf/global_settings.py:93
msgid "Slovenian"
msgstr "словеначки"
#: conf/global_settings.py:92
#: conf/global_settings.py:94
msgid "Albanian"
msgstr "албански"
#: conf/global_settings.py:93
#: conf/global_settings.py:95
msgid "Serbian"
msgstr "српски"
#: conf/global_settings.py:94
#: conf/global_settings.py:96
msgid "Serbian Latin"
msgstr "српски (латиница)"
#: conf/global_settings.py:95
#: conf/global_settings.py:97
msgid "Swedish"
msgstr "шведски"
#: conf/global_settings.py:96
#: conf/global_settings.py:98
msgid "Tamil"
msgstr "тамилски"
#: conf/global_settings.py:97
#: conf/global_settings.py:99
msgid "Telugu"
msgstr "телугу"
#: conf/global_settings.py:98
#: conf/global_settings.py:100
msgid "Thai"
msgstr "тајландски"
#: conf/global_settings.py:99
#: conf/global_settings.py:101
msgid "Turkish"
msgstr "турски"
#: conf/global_settings.py:100
#: conf/global_settings.py:102
msgid "Ukrainian"
msgstr "украјински"
#: conf/global_settings.py:101
#: conf/global_settings.py:103
msgid "Vietnamese"
msgstr "вијетнамски"
#: conf/global_settings.py:102
#: conf/global_settings.py:104
msgid "Simplified Chinese"
msgstr "новокинески"
#: conf/global_settings.py:103
#: conf/global_settings.py:105
msgid "Traditional Chinese"
msgstr "старокинески"
@ -304,15 +313,15 @@ msgstr "Овај месец"
msgid "This year"
msgstr "Ова година"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes"
msgstr "Да"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No"
msgstr "Не"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown"
msgstr "Непознато"
@ -358,7 +367,7 @@ msgid "Changed %s."
msgstr "Измењена поља %s"
#: contrib/admin/options.py:559 contrib/admin/options.py:569
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845
#: forms/models.py:568
msgid "and"
msgstr "и"
@ -457,9 +466,9 @@ msgstr[1] "%(total_count)s изабрано"
msgstr[2] "%(total_count)s изабраних"
#: contrib/admin/options.py:1071
#, fuzzy, python-format
#, python-format
msgid "0 of %(cnt)s selected"
msgstr "0 од %(cnt)d изабрано"
msgstr "0 од %(cnt)s изабрано"
#: contrib/admin/options.py:1118
#, python-format
@ -687,7 +696,7 @@ msgid "Filter"
msgstr "Филтер"
#: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete"
msgstr "Обриши"
@ -849,7 +858,7 @@ msgstr "Сачувај и додај следећи"
msgid "Save and continue editing"
msgstr "Сачувај и настави са изменама"
#: contrib/admin/templates/admin/auth/user/add_form.html:5
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
@ -857,6 +866,10 @@ msgstr ""
"Прво унесите корисничко име и лозинку. Потом ћете моћи да мењате још "
"корисничких подешавања."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Унесите корисничко име и лозинку"
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1050,7 +1063,7 @@ msgstr "Имејл адреса:"
msgid "Reset my password"
msgstr "Ресетуј моју лозинку"
#: contrib/admin/templatetags/admin_list.py:239
#: contrib/admin/templatetags/admin_list.py:257
msgid "All dates"
msgstr "Сви датуми"
@ -1424,8 +1437,8 @@ msgstr "порука"
msgid "Logged out"
msgstr "Одјављен"
#: contrib/auth/management/commands/createsuperuser.py:23
#: core/validators.py:120 forms/fields.py:428
#: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address."
msgstr "Унесите важећу имејл адресу."
@ -1497,7 +1510,7 @@ msgid "Email address"
msgstr "Имејл адреса"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL"
msgstr "URL"
@ -1547,7 +1560,7 @@ msgstr "коментар"
msgid "date/time submitted"
msgstr "датум/време постављања"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896
#: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address"
msgstr "IP адреса"
@ -4471,22 +4484,22 @@ msgstr "сајтови"
msgid "Enter a valid value."
msgstr "Унесите исправну вредност."
#: core/validators.py:87 forms/fields.py:529
#: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL."
msgstr "Унесите исправан URL."
#: core/validators.py:89 forms/fields.py:530
#: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link."
msgstr "Овај URL изгледа не води никуда."
#: core/validators.py:123 forms/fields.py:873
#: core/validators.py:123 forms/fields.py:877
msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr ""
"Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или "
"циртица."
#: core/validators.py:126 forms/fields.py:866
#: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address."
msgstr "Унесите исправну IPv4 адресу."
@ -4499,12 +4512,12 @@ msgstr "Унесите само бројке раздвојене запетам
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257
#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258
#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико."
@ -4512,27 +4525,27 @@ msgstr "Ова вредност мора бити већа од %(limit_value)s
#: core/validators.py:164
#, python-format
msgid ""
"Ensure this value has at least %(limit_value)d characters (it has %"
"(show_value)d)."
"Ensure this value has at least %(limit_value)d characters (it has "
"%(show_value)d)."
msgstr ""
"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има %"
"(show_value)d)."
"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има "
"%(show_value)d)."
#: core/validators.py:170
#, python-format
msgid ""
"Ensure this value has at most %(limit_value)d characters (it has %"
"(show_value)d)."
"Ensure this value has at most %(limit_value)d characters (it has "
"%(show_value)d)."
msgstr ""
"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има %"
"(show_value)d)."
"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има "
"%(show_value)d)."
#: db/models/base.py:822
#: db/models/base.py:823
#, python-format
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
msgstr "%(field_name)s мора да буде јединствен за %(date_field)s %(lookup)s."
#: db/models/base.py:837 db/models/base.py:845
#: db/models/base.py:838 db/models/base.py:846
#, python-format
msgid "%(model_name)s with this %(field_label)s already exists."
msgstr "%(model_name)s са овом вредношћу %(field_label)s већ постоји."
@ -4555,13 +4568,13 @@ msgstr "Ово поље не може да остане празно."
msgid "Field of type: %(field_type)s"
msgstr "Поње типа: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
#: db/models/fields/__init__.py:999
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:1007
msgid "Integer"
msgstr "Цео број"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer."
msgstr "Ова вредност мора бити целобројна."
@ -4573,7 +4586,7 @@ msgstr "Ова вредност мора бити True или False."
msgid "Boolean (Either True or False)"
msgstr "Булова вредност (True или False)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format
msgid "String (up to %(max_length)s)"
msgstr "Стринг (највише %(max_length)s знакова)"
@ -4615,44 +4628,44 @@ msgstr "Децимални број"
msgid "E-mail address"
msgstr "Имејл адреса"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220
#: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331
msgid "File path"
msgstr "Путања фајла"
#: db/models/fields/__init__.py:822
#: db/models/fields/__init__.py:830
msgid "This value must be a float."
msgstr "Ова вредност мора бити број са клизећом запетом"
#: db/models/fields/__init__.py:824
#: db/models/fields/__init__.py:832
msgid "Floating point number"
msgstr "Број са покреном запетом"
#: db/models/fields/__init__.py:883
#: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer"
msgstr "Велики цео број"
#: db/models/fields/__init__.py:912
#: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False."
msgstr "Ова вредност мора бити или None, или True, или False."
#: db/models/fields/__init__.py:914
#: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)"
msgstr "Булова вредност (True, False или None)"
#: db/models/fields/__init__.py:1005
#: db/models/fields/__init__.py:1013
msgid "Text"
msgstr "Текст"
#: db/models/fields/__init__.py:1021
#: db/models/fields/__init__.py:1029
msgid "Time"
msgstr "Време"
#: db/models/fields/__init__.py:1025
#: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Унесите исправно време у формату ЧЧ:ММ[:сс[.уууууу]]."
#: db/models/fields/__init__.py:1109
#: db/models/fields/__init__.py:1125
msgid "XML text"
msgstr "XML текст"
@ -4665,22 +4678,22 @@ msgstr "Објекат класе %(model)s са примарним кључем
msgid "Foreign Key (type determined by related field)"
msgstr "Страни кључ (тип одређује референтно поље)"
#: db/models/fields/related.py:918
#: db/models/fields/related.py:919
msgid "One-to-one relationship"
msgstr "Релација један на један"
#: db/models/fields/related.py:980
#: db/models/fields/related.py:981
msgid "Many-to-many relationship"
msgstr "Релација више на више"
#: db/models/fields/related.py:1000
#: db/models/fields/related.py:1001
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне "
"ставке."
#: db/models/fields/related.py:1061
#: db/models/fields/related.py:1062
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@ -4693,62 +4706,62 @@ msgstr[2] "Унесите исправан %(self)s IDs. Вредности %(va
msgid "This field is required."
msgstr "Ово поље се мора попунити."
#: forms/fields.py:204
#: forms/fields.py:203
msgid "Enter a whole number."
msgstr "Унесите цео број."
#: forms/fields.py:235 forms/fields.py:256
#: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number."
msgstr "Унесите број."
#: forms/fields.py:259
#: forms/fields.py:258
#, python-format
msgid "Ensure that there are no more than %s digits in total."
msgstr "Не сме бити укупно више од %s цифара. Проверите."
#: forms/fields.py:260
#: forms/fields.py:259
#, python-format
msgid "Ensure that there are no more than %s decimal places."
msgstr "Не сме бити укупно више од %s децималних места. Проверите."
#: forms/fields.py:261
#: forms/fields.py:260
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Не сме бити укупно више од %s цифара пре запете. Проверите."
#: forms/fields.py:323 forms/fields.py:838
#: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date."
msgstr "Унесите исправан датум."
#: forms/fields.py:351 forms/fields.py:839
#: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time."
msgstr "Унесите исправно време"
#: forms/fields.py:377
#: forms/fields.py:376
msgid "Enter a valid date/time."
msgstr "Унесите исправан датум/време."
#: forms/fields.py:435
#: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form."
msgstr "Фајл није пребачен. Проверите тип енкодирања формулара."
#: forms/fields.py:436
#: forms/fields.py:435
msgid "No file was submitted."
msgstr "Фајл није пребачен."
#: forms/fields.py:437
#: forms/fields.py:436
msgid "The submitted file is empty."
msgstr "Пребачен фајл је празан."
#: forms/fields.py:438
#: forms/fields.py:437
#, python-format
msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr ""
"Назив фајла мора да садржи бар %(max)d словних места (тренутно има %(length)"
"d)."
"Назив фајла мора да садржи бар %(max)d словних места (тренутно има "
"%(length)d)."
#: forms/fields.py:473
#: forms/fields.py:472
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@ -4756,17 +4769,17 @@ msgstr ""
"Пребаците исправан фајл. Фајл који је пребачен или није слика, или је "
"оштећен."
#: forms/fields.py:596 forms/fields.py:671
#: forms/fields.py:595 forms/fields.py:670
#, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr ""
"%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002
#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values."
msgstr "Унесите листу вредности."
#: forms/formsets.py:298 forms/formsets.py:300
#: forms/formsets.py:296 forms/formsets.py:298
msgid "Order"
msgstr "Редослед"
@ -5103,23 +5116,23 @@ msgstr "%(number)d %(type)s"
msgid ", %(number)d %(type)s"
msgstr ", %(number)d %(type)s"
#: utils/translation/trans_real.py:518
#: utils/translation/trans_real.py:519
msgid "DATE_FORMAT"
msgstr "j. F Y."
#: utils/translation/trans_real.py:519
#: utils/translation/trans_real.py:520
msgid "DATETIME_FORMAT"
msgstr "j. F Y. H:i Т"
#: utils/translation/trans_real.py:520
#: utils/translation/trans_real.py:521
msgid "TIME_FORMAT"
msgstr "G:i"
#: utils/translation/trans_real.py:541
#: utils/translation/trans_real.py:542
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y."
#: utils/translation/trans_real.py:542
#: utils/translation/trans_real.py:543
msgid "MONTH_DAY_FORMAT"
msgstr "j. F"

View File

@ -4,50 +4,24 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-07 20:46+0200\n"
"POT-Creation-Date: 2010-08-06 19:53+0200\n"
"PO-Revision-Date: 2009-03-30 14:04+0200\n"
"Last-Translator: Janos Guljas <janos@janos.in.rs>\n"
"Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas "
"<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail."
"com>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: contrib/admin/media/js/SelectFilter2.js:37
#, perl-format
msgid "Available %s"
msgstr "Доступни %s"
#: contrib/admin/media/js/SelectFilter2.js:45
msgid "Choose all"
msgstr "Додај све"
#: contrib/admin/media/js/SelectFilter2.js:50
msgid "Add"
msgstr "Додај"
#: contrib/admin/media/js/SelectFilter2.js:52
msgid "Remove"
msgstr "Уклони"
#: contrib/admin/media/js/SelectFilter2.js:57
#, perl-format
msgid "Chosen %s"
msgstr "Одабрани %s"
#: contrib/admin/media/js/SelectFilter2.js:58
msgid "Select your choice(s) and click "
msgstr "Направите избор и кликните "
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: contrib/admin/media/js/SelectFilter2.js:63
msgid "Clear all"
msgstr "Врати све"
#: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s од %(cnt)s изабран"
@ -55,7 +29,6 @@ msgstr[1] "%(sel)s од %(cnt)s изабрано"
msgstr[2] "%(sel)s од %(cnt)s изабраних"
#: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
@ -151,3 +124,21 @@ msgstr "Јуче"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:184
msgid "Tomorrow"
msgstr "Сутра"
#~ msgid "Available %s"
#~ msgstr "Доступни %s"
#~ msgid "Choose all"
#~ msgstr "Додај све"
#~ msgid "Add"
#~ msgstr "Додај"
#~ msgid "Remove"
#~ msgstr "Уклони"
#~ msgid "Chosen %s"
#~ msgstr "Одабрани %s"
#~ msgid "Select your choice(s) and click "
#~ msgstr "Направите избор и кликните "

View File

@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.'
SHORT_DATETIME_FORMAT = 'j.m.Y. H:i'
FIRST_DAY_OF_WEEK = 1
DATE_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.'
'%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.'
'%Y-%m-%d', # '2006-10-25'
# '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.'
# '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.'
# '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.'
@ -23,9 +23,6 @@ TIME_INPUT_FORMATS = (
'%H:%M', # '14:30'
)
DATETIME_INPUT_FORMATS = (
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59'
'%d.%m.%Y. %H:%M', # '25.10.2006. 14:30'
'%d.%m.%Y.', # '25.10.2006.'
@ -38,7 +35,10 @@ DATETIME_INPUT_FORMATS = (
'%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59'
'%d. %m. %y. %H:%M', # '25. 10. 06. 14:30'
'%d. %m. %y.', # '25. 10. 06.'
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
)
DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = ','
DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.'
NUMBER_GROUPING = 3

File diff suppressed because it is too large Load Diff

View File

@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.'
SHORT_DATETIME_FORMAT = 'j.m.Y. H:i'
FIRST_DAY_OF_WEEK = 1
DATE_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.'
'%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.'
'%Y-%m-%d', # '2006-10-25'
# '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.'
# '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.'
# '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.'
@ -23,9 +23,6 @@ TIME_INPUT_FORMATS = (
'%H:%M', # '14:30'
)
DATETIME_INPUT_FORMATS = (
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59'
'%d.%m.%Y. %H:%M', # '25.10.2006. 14:30'
'%d.%m.%Y.', # '25.10.2006.'
@ -38,7 +35,10 @@ DATETIME_INPUT_FORMATS = (
'%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59'
'%d. %m. %y. %H:%M', # '25. 10. 06. 14:30'
'%d. %m. %y.', # '25. 10. 06.'
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
)
DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = ','
DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.'
NUMBER_GROUPING = 3

View File

@ -501,7 +501,7 @@ class ModelAdmin(BaseModelAdmin):
# Convert the actions into a SortedDict keyed by name
# and sorted by description.
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower()))
actions.sort(key=lambda k: k[2].lower())
actions = SortedDict([
(name, (func, name, desc))
for func, name, desc in actions

View File

@ -379,11 +379,11 @@ class AdminSite(object):
# Sort the apps alphabetically.
app_list = app_dict.values()
app_list.sort(lambda x, y: cmp(x['name'], y['name']))
app_list.sort(key=lambda x: x['name'])
# Sort the models alphabetically within each app.
for app in app_list:
app['models'].sort(lambda x, y: cmp(x['name'], y['name']))
app['models'].sort(key=lambda x: x['name'])
context = {
'title': _('Site administration'),
@ -443,7 +443,7 @@ class AdminSite(object):
if not app_dict:
raise http.Http404('The requested admin page does not exist.')
# Sort the models alphabetically within each app.
app_dict['models'].sort(lambda x, y: cmp(x['name'], y['name']))
app_dict['models'].sort(key=lambda x: x['name'])
context = {
'title': _('%s administration') % capfirst(app_label),
'app_list': [app_dict],

View File

@ -2,8 +2,11 @@
{% load i18n %}
{% block form_top %}
{% if not is_popup %}
<p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p>
<input type="hidden" name="_continue" value="1" />
{% else %}
<p>{% trans "Enter a username and password." %}</p>
{% endif %}
{% endblock %}
{% block after_field_sets %}

View File

@ -60,7 +60,7 @@ class CalendarPlugin(DatabrowsePlugin):
def homepage_view(self, request):
easy_model = EasyModel(self.site, self.model)
field_list = self.fields.values()
field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
field_list.sort(key=lambda k:k.verbose_name)
return render_to_response('databrowse/calendar_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
def calendar_view(self, request, field, year=None, month=None, day=None):

View File

@ -61,7 +61,7 @@ class FieldChoicePlugin(DatabrowsePlugin):
def homepage_view(self, request):
easy_model = EasyModel(self.site, self.model)
field_list = self.fields.values()
field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
field_list.sort(key=lambda k: k.verbose_name)
return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
def field_view(self, request, field, value=None):

View File

@ -6,7 +6,7 @@ class MySQLCreation(DatabaseCreation):
from django.contrib.gis.db.models.fields import GeometryField
output = super(MySQLCreation, self).sql_indexes_for_field(model, f, style)
if isinstance(f, GeometryField):
if isinstance(f, GeometryField) and f.spatial_index:
qn = self.connection.ops.quote_name
db_table = model._meta.db_table
idx_name = '%s_%s_id' % (db_table, f.column)

View File

@ -95,7 +95,7 @@ class GeoSQLCompiler(compiler.SQLCompiler):
return result
def get_default_columns(self, with_aliases=False, col_aliases=None,
start_alias=None, opts=None, as_pairs=False):
start_alias=None, opts=None, as_pairs=False, local_only=False):
"""
Computes the default columns for selecting every field in the base
model. Will sometimes be called to pull in related models (e.g. via
@ -121,6 +121,8 @@ class GeoSQLCompiler(compiler.SQLCompiler):
if start_alias:
seen = {None: start_alias}
for field, model in opts.get_fields_with_model():
if local_only and model is not None:
continue
if start_alias:
try:
alias = seen[model]

View File

@ -38,6 +38,11 @@ class Author(models.Model):
name = models.CharField(max_length=100)
objects = models.GeoManager()
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, unique=True)
objects = models.GeoManager()
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name='books', null=True)

View File

@ -4,7 +4,7 @@ from django.contrib.gis.db.models import Collect, Count, Extent, F, Union
from django.contrib.gis.geometry.backend import Geometry
from django.contrib.gis.tests.utils import mysql, oracle, postgis, spatialite, no_mysql, no_oracle, no_spatialite
from django.conf import settings
from models import City, Location, DirectoryEntry, Parcel, Book, Author
from models import City, Location, DirectoryEntry, Parcel, Book, Author, Article
cities = (('Aurora', 'TX', -97.516111, 33.058333),
('Roswell', 'NM', -104.528056, 33.387222),
@ -291,6 +291,14 @@ class RelatedGeoModelTest(unittest.TestCase):
self.assertEqual(4, len(coll))
self.assertEqual(ref_geom, coll)
def test15_invalid_select_related(self):
"Testing doing select_related on the related name manager of a unique FK. See #13934."
qs = Article.objects.select_related('author__article')
# This triggers TypeError when `get_default_columns` has no `local_only`
# keyword. The TypeError is swallowed if QuerySet is actually
# evaluated as list generation swallows TypeError in CPython.
sql = str(qs.query)
# TODO: Related tests for KML, GML, and distance lookups.
def suite():

View File

@ -58,7 +58,7 @@ class SessionStore(SessionBase):
finally:
session_file.close()
except IOError:
pass
self.create()
return session_data
def create(self):

View File

@ -1,388 +1,273 @@
r"""
>>> from django.conf import settings
>>> from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
>>> from django.contrib.sessions.backends.cache import SessionStore as CacheSession
>>> from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession
>>> from django.contrib.sessions.backends.file import SessionStore as FileSession
>>> from django.contrib.sessions.backends.base import SessionBase
>>> from django.contrib.sessions.models import Session
>>> db_session = DatabaseSession()
>>> db_session.modified
False
>>> db_session.get('cat')
>>> db_session['cat'] = "dog"
>>> db_session.modified
True
>>> db_session.pop('cat')
'dog'
>>> db_session.pop('some key', 'does not exist')
'does not exist'
>>> db_session.save()
>>> db_session.exists(db_session.session_key)
True
>>> db_session.delete(db_session.session_key)
>>> db_session.exists(db_session.session_key)
False
>>> db_session['foo'] = 'bar'
>>> db_session.save()
>>> db_session.exists(db_session.session_key)
True
>>> prev_key = db_session.session_key
>>> db_session.flush()
>>> db_session.exists(prev_key)
False
>>> db_session.session_key == prev_key
False
>>> db_session.modified, db_session.accessed
(True, True)
>>> db_session['a'], db_session['b'] = 'c', 'd'
>>> db_session.save()
>>> prev_key = db_session.session_key
>>> prev_data = db_session.items()
>>> db_session.cycle_key()
>>> db_session.session_key == prev_key
False
>>> db_session.items() == prev_data
True
# Submitting an invalid session key (either by guessing, or if the db has
# removed the key) results in a new key being generated.
>>> Session.objects.filter(pk=db_session.session_key).delete()
>>> db_session = DatabaseSession(db_session.session_key)
>>> db_session.save()
>>> DatabaseSession('1').get('cat')
#
# Cached DB session tests
#
>>> cdb_session = CacheDBSession()
>>> cdb_session.modified
False
>>> cdb_session['cat'] = "dog"
>>> cdb_session.modified
True
>>> cdb_session.pop('cat')
'dog'
>>> cdb_session.pop('some key', 'does not exist')
'does not exist'
>>> cdb_session.save()
>>> cdb_session.exists(cdb_session.session_key)
True
>>> cdb_session.delete(cdb_session.session_key)
>>> cdb_session.exists(cdb_session.session_key)
False
#
# File session tests.
#
# Do file session tests in an isolated directory, and kill it after we're done.
>>> original_session_file_path = settings.SESSION_FILE_PATH
>>> import tempfile
>>> temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp()
>>> file_session = FileSession()
>>> file_session.modified
False
>>> file_session['cat'] = "dog"
>>> file_session.modified
True
>>> file_session.pop('cat')
'dog'
>>> file_session.pop('some key', 'does not exist')
'does not exist'
>>> file_session.save()
>>> file_session.exists(file_session.session_key)
True
>>> file_session.delete(file_session.session_key)
>>> file_session.exists(file_session.session_key)
False
>>> FileSession('1').get('cat')
>>> file_session['foo'] = 'bar'
>>> file_session.save()
>>> file_session.exists(file_session.session_key)
True
>>> prev_key = file_session.session_key
>>> file_session.flush()
>>> file_session.exists(prev_key)
False
>>> file_session.session_key == prev_key
False
>>> file_session.modified, file_session.accessed
(True, True)
>>> file_session['a'], file_session['b'] = 'c', 'd'
>>> file_session.save()
>>> prev_key = file_session.session_key
>>> prev_data = file_session.items()
>>> file_session.cycle_key()
>>> file_session.session_key == prev_key
False
>>> file_session.items() == prev_data
True
>>> Session.objects.filter(pk=file_session.session_key).delete()
>>> file_session = FileSession(file_session.session_key)
>>> file_session.save()
# Make sure the file backend checks for a good storage dir
>>> settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer"
>>> FileSession()
Traceback (innermost last):
...
ImproperlyConfigured: The session storage path '/if/this/directory/exists/you/have/a/weird/computer' doesn't exist. Please set your SESSION_FILE_PATH setting to an existing directory in which Django can store session data.
# Clean up after the file tests
>>> settings.SESSION_FILE_PATH = original_session_file_path
>>> import shutil
>>> shutil.rmtree(temp_session_store)
#
# Cache-based tests
# NB: be careful to delete any sessions created; stale sessions fill up the
# /tmp and eventually overwhelm it after lots of runs (think buildbots)
#
>>> cache_session = CacheSession()
>>> cache_session.modified
False
>>> cache_session['cat'] = "dog"
>>> cache_session.modified
True
>>> cache_session.pop('cat')
'dog'
>>> cache_session.pop('some key', 'does not exist')
'does not exist'
>>> cache_session.save()
>>> cache_session.delete(cache_session.session_key)
>>> cache_session.exists(cache_session.session_key)
False
>>> cache_session['foo'] = 'bar'
>>> cache_session.save()
>>> cache_session.exists(cache_session.session_key)
True
>>> prev_key = cache_session.session_key
>>> cache_session.flush()
>>> cache_session.exists(prev_key)
False
>>> cache_session.session_key == prev_key
False
>>> cache_session.modified, cache_session.accessed
(True, True)
>>> cache_session['a'], cache_session['b'] = 'c', 'd'
>>> cache_session.save()
>>> prev_key = cache_session.session_key
>>> prev_data = cache_session.items()
>>> cache_session.cycle_key()
>>> cache_session.session_key == prev_key
False
>>> cache_session.items() == prev_data
True
>>> cache_session = CacheSession()
>>> cache_session.save()
>>> key = cache_session.session_key
>>> cache_session.exists(key)
True
>>> Session.objects.filter(pk=cache_session.session_key).delete()
>>> cache_session = CacheSession(cache_session.session_key)
>>> cache_session.save()
>>> cache_session.delete(cache_session.session_key)
>>> s = SessionBase()
>>> s._session['some key'] = 'exists' # Pre-populate the session with some data
>>> s.accessed = False # Reset to pretend this wasn't accessed previously
>>> s.accessed, s.modified
(False, False)
>>> s.pop('non existant key', 'does not exist')
'does not exist'
>>> s.accessed, s.modified
(True, False)
>>> s.setdefault('foo', 'bar')
'bar'
>>> s.setdefault('foo', 'baz')
'bar'
>>> s.accessed = False # Reset the accessed flag
>>> s.pop('some key')
'exists'
>>> s.accessed, s.modified
(True, True)
>>> s.pop('some key', 'does not exist')
'does not exist'
from datetime import datetime, timedelta
from django.conf import settings
from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
from django.contrib.sessions.backends.cache import SessionStore as CacheSession
from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession
from django.contrib.sessions.backends.file import SessionStore as FileSession
from django.contrib.sessions.backends.base import SessionBase
from django.contrib.sessions.models import Session
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
import shutil
import tempfile
import unittest
>>> s.get('update key', None)
class SessionTestsMixin(object):
# This does not inherit from TestCase to avoid any tests being run with this
# class, which wouldn't work, and to allow different TestCase subclasses to
# be used.
# test .update()
>>> s.modified = s.accessed = False # Reset to pretend this wasn't accessed previously
>>> s.update({'update key':1})
>>> s.accessed, s.modified
(True, True)
>>> s.get('update key', None)
1
backend = None # subclasses must specify
# test .has_key()
>>> s.modified = s.accessed = False # Reset to pretend this wasn't accessed previously
>>> s.has_key('update key')
True
>>> s.accessed, s.modified
(True, False)
def setUp(self):
self.session = self.backend()
# test .values()
>>> s = SessionBase()
>>> s.values()
[]
>>> s.accessed
True
>>> s['x'] = 1
>>> s.values()
[1]
def tearDown(self):
# NB: be careful to delete any sessions created; stale sessions fill up
# the /tmp (with some backends) and eventually overwhelm it after lots
# of runs (think buildbots)
self.session.delete()
# test .iterkeys()
>>> s.accessed = False
>>> i = s.iterkeys()
>>> hasattr(i,'__iter__')
True
>>> s.accessed
True
>>> list(i)
['x']
def test_new_session(self):
self.assertFalse(self.session.modified)
self.assertFalse(self.session.accessed)
# test .itervalues()
>>> s.accessed = False
>>> i = s.itervalues()
>>> hasattr(i,'__iter__')
True
>>> s.accessed
True
>>> list(i)
[1]
def test_get_empty(self):
self.assertEqual(self.session.get('cat'), None)
# test .iteritems()
>>> s.accessed = False
>>> i = s.iteritems()
>>> hasattr(i,'__iter__')
True
>>> s.accessed
True
>>> list(i)
[('x', 1)]
def test_store(self):
self.session['cat'] = "dog"
self.assertTrue(self.session.modified)
self.assertEqual(self.session.pop('cat'), 'dog')
# test .clear()
>>> s.modified = s.accessed = False
>>> s.items()
[('x', 1)]
>>> s.clear()
>>> s.items()
[]
>>> s.accessed, s.modified
(True, True)
def test_pop(self):
self.session['some key'] = 'exists'
# Need to reset these to pretend we haven't accessed it:
self.accessed = False
self.modified = False
#########################
# Custom session expiry #
#########################
self.assertEqual(self.session.pop('some key'), 'exists')
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
self.assertEqual(self.session.get('some key'), None)
>>> from django.conf import settings
>>> from datetime import datetime, timedelta
def test_pop_default(self):
self.assertEqual(self.session.pop('some key', 'does not exist'),
'does not exist')
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
>>> td10 = timedelta(seconds=10)
def test_setdefault(self):
self.assertEqual(self.session.setdefault('foo', 'bar'), 'bar')
self.assertEqual(self.session.setdefault('foo', 'baz'), 'bar')
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
# A normal session has a max age equal to settings
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
True
def test_update(self):
self.session.update({'update key': 1})
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
self.assertEqual(self.session.get('update key', None), 1)
# So does a custom session with an idle expiration time of 0 (but it'll expire
# at browser close)
>>> s.set_expiry(0)
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
True
def test_has_key(self):
self.session['some key'] = 1
self.session.modified = False
self.session.accessed = False
self.assertTrue(self.session.has_key('some key'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
# Custom session idle expiration time
>>> s.set_expiry(10)
>>> delta = s.get_expiry_date() - datetime.now()
>>> delta.seconds in (9, 10)
True
>>> age = s.get_expiry_age()
>>> age in (9, 10)
True
def test_values(self):
self.assertEqual(self.session.values(), [])
self.assertTrue(self.session.accessed)
self.session['some key'] = 1
self.assertEqual(self.session.values(), [1])
# Custom session fixed expiry date (timedelta)
>>> s.set_expiry(td10)
>>> delta = s.get_expiry_date() - datetime.now()
>>> delta.seconds in (9, 10)
True
>>> age = s.get_expiry_age()
>>> age in (9, 10)
True
def test_iterkeys(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
i = self.session.iterkeys()
self.assertTrue(hasattr(i, '__iter__'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
self.assertEqual(list(i), ['x'])
# Custom session fixed expiry date (fixed datetime)
>>> s.set_expiry(datetime.now() + td10)
>>> delta = s.get_expiry_date() - datetime.now()
>>> delta.seconds in (9, 10)
True
>>> age = s.get_expiry_age()
>>> age in (9, 10)
True
def test_iterkeys(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
i = self.session.itervalues()
self.assertTrue(hasattr(i, '__iter__'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
self.assertEqual(list(i), [1])
# Set back to default session age
>>> s.set_expiry(None)
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
True
def test_iteritems(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
i = self.session.iteritems()
self.assertTrue(hasattr(i, '__iter__'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
self.assertEqual(list(i), [('x',1)])
# Allow to set back to default session age even if no alternate has been set
>>> s.set_expiry(None)
def test_clear(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
self.assertEqual(self.session.items(), [('x',1)])
self.session.clear()
self.assertEqual(self.session.items(), [])
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
def test_save(self):
self.session.save()
self.assertTrue(self.session.exists(self.session.session_key))
def test_delete(self):
self.session.delete(self.session.session_key)
self.assertFalse(self.session.exists(self.session.session_key))
def test_flush(self):
self.session['foo'] = 'bar'
self.session.save()
prev_key = self.session.session_key
self.session.flush()
self.assertFalse(self.session.exists(prev_key))
self.assertNotEqual(self.session.session_key, prev_key)
self.assertTrue(self.session.modified)
self.assertTrue(self.session.accessed)
def test_cycle(self):
self.session['a'], self.session['b'] = 'c', 'd'
self.session.save()
prev_key = self.session.session_key
prev_data = self.session.items()
self.session.cycle_key()
self.assertNotEqual(self.session.session_key, prev_key)
self.assertEqual(self.session.items(), prev_data)
def test_invalid_key(self):
# Submitting an invalid session key (either by guessing, or if the db has
# removed the key) results in a new key being generated.
session = self.backend('1')
session.save()
self.assertNotEqual(session.session_key, '1')
self.assertEqual(session.get('cat'), None)
session.delete()
# Custom session expiry
def test_default_expiry(self):
# A normal session has a max age equal to settings
self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
# So does a custom session with an idle expiration time of 0 (but it'll
# expire at browser close)
self.session.set_expiry(0)
self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
def test_custom_expiry_seconds(self):
# Using seconds
self.session.set_expiry(10)
delta = self.session.get_expiry_date() - datetime.now()
self.assertTrue(delta.seconds in (9, 10))
age = self.session.get_expiry_age()
self.assertTrue(age in (9, 10))
def test_custom_expiry_timedelta(self):
# Using timedelta
self.session.set_expiry(timedelta(seconds=10))
delta = self.session.get_expiry_date() - datetime.now()
self.assertTrue(delta.seconds in (9, 10))
age = self.session.get_expiry_age()
self.assertTrue(age in (9, 10))
def test_custom_expiry_timedelta(self):
# Using timedelta
self.session.set_expiry(datetime.now() + timedelta(seconds=10))
delta = self.session.get_expiry_date() - datetime.now()
self.assertTrue(delta.seconds in (9, 10))
age = self.session.get_expiry_age()
self.assertTrue(age in (9, 10))
def test_custom_expiry_reset(self):
self.session.set_expiry(None)
self.session.set_expiry(10)
self.session.set_expiry(None)
self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
def test_get_expire_at_browser_close(self):
# Tests get_expire_at_browser_close with different settings and different
# set_expiry calls
try:
original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
self.session.set_expiry(10)
self.assertFalse(self.session.get_expire_at_browser_close())
self.session.set_expiry(0)
self.assertTrue(self.session.get_expire_at_browser_close())
self.session.set_expiry(None)
self.assertFalse(self.session.get_expire_at_browser_close())
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
self.session.set_expiry(10)
self.assertFalse(self.session.get_expire_at_browser_close())
self.session.set_expiry(0)
self.assertTrue(self.session.get_expire_at_browser_close())
self.session.set_expiry(None)
self.assertTrue(self.session.get_expire_at_browser_close())
except:
raise
finally:
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close
# We're changing the setting then reverting back to the original setting at the
# end of these tests.
>>> original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
class DatabaseSessionTests(SessionTestsMixin, TestCase):
# Custom session age
>>> s.set_expiry(10)
>>> s.get_expire_at_browser_close()
False
backend = DatabaseSession
# Custom expire-at-browser-close
>>> s.set_expiry(0)
>>> s.get_expire_at_browser_close()
True
# Default session age
>>> s.set_expiry(None)
>>> s.get_expire_at_browser_close()
False
class CacheDBSessionTests(SessionTestsMixin, TestCase):
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
backend = CacheDBSession
# Custom session age
>>> s.set_expiry(10)
>>> s.get_expire_at_browser_close()
False
# Don't need DB flushing for these tests, so can use unittest.TestCase as base class
class FileSessionTests(SessionTestsMixin, unittest.TestCase):
# Custom expire-at-browser-close
>>> s.set_expiry(0)
>>> s.get_expire_at_browser_close()
True
backend = FileSession
# Default session age
>>> s.set_expiry(None)
>>> s.get_expire_at_browser_close()
True
def setUp(self):
super(FileSessionTests, self).setUp()
# Do file session tests in an isolated directory, and kill it after we're done.
self.original_session_file_path = settings.SESSION_FILE_PATH
self.temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp()
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close
"""
def tearDown(self):
settings.SESSION_FILE_PATH = self.original_session_file_path
shutil.rmtree(self.temp_session_store)
super(FileSessionTests, self).tearDown()
if __name__ == '__main__':
import doctest
doctest.testmod()
def test_configuration_check(self):
# Make sure the file backend checks for a good storage dir
settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer"
self.assertRaises(ImproperlyConfigured, self.backend)
class CacheSessionTests(SessionTestsMixin, unittest.TestCase):
backend = CacheSession

View File

@ -1,7 +1,7 @@
"Database cache backend."
from django.core.cache.backends.base import BaseCache
from django.db import connection, transaction, DatabaseError
from django.db import connections, router, transaction, DatabaseError
import base64, time
from datetime import datetime
try:
@ -9,10 +9,31 @@ try:
except ImportError:
import pickle
class Options(object):
"""A class that will quack like a Django model _meta class.
This allows cache operations to be controlled by the router
"""
def __init__(self, table):
self.db_table = table
self.app_label = 'django_cache'
self.module_name = 'cacheentry'
self.verbose_name = 'cache entry'
self.verbose_name_plural = 'cache entries'
self.object_name = 'CacheEntry'
self.abstract = False
self.managed = True
self.proxy = False
class CacheClass(BaseCache):
def __init__(self, table, params):
BaseCache.__init__(self, params)
self._table = connection.ops.quote_name(table)
self._table = table
class CacheEntry(object):
_meta = Options(table)
self.cache_model_class = CacheEntry
max_entries = params.get('max_entries', 300)
try:
self._max_entries = int(max_entries)
@ -25,17 +46,22 @@ class CacheClass(BaseCache):
self._cull_frequency = 3
def get(self, key, default=None):
cursor = connection.cursor()
cursor.execute("SELECT cache_key, value, expires FROM %s WHERE cache_key = %%s" % self._table, [key])
db = router.db_for_read(self.cache_model_class)
table = connections[db].ops.quote_name(self._table)
cursor = connections[db].cursor()
cursor.execute("SELECT cache_key, value, expires FROM %s WHERE cache_key = %%s" % table, [key])
row = cursor.fetchone()
if row is None:
return default
now = datetime.now()
if row[2] < now:
cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
transaction.commit_unless_managed()
db = router.db_for_write(self.cache_model_class)
cursor = connections[db].cursor()
cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % table, [key])
transaction.commit_unless_managed(using=db)
return default
value = connection.ops.process_clob(row[1])
value = connections[db].ops.process_clob(row[1])
return pickle.loads(base64.decodestring(value))
def set(self, key, value, timeout=None):
@ -47,56 +73,67 @@ class CacheClass(BaseCache):
def _base_set(self, mode, key, value, timeout=None):
if timeout is None:
timeout = self.default_timeout
cursor = connection.cursor()
cursor.execute("SELECT COUNT(*) FROM %s" % self._table)
db = router.db_for_write(self.cache_model_class)
table = connections[db].ops.quote_name(self._table)
cursor = connections[db].cursor()
cursor.execute("SELECT COUNT(*) FROM %s" % table)
num = cursor.fetchone()[0]
now = datetime.now().replace(microsecond=0)
exp = datetime.fromtimestamp(time.time() + timeout).replace(microsecond=0)
if num > self._max_entries:
self._cull(cursor, now)
self._cull(db, cursor, now)
encoded = base64.encodestring(pickle.dumps(value, 2)).strip()
cursor.execute("SELECT cache_key, expires FROM %s WHERE cache_key = %%s" % self._table, [key])
cursor.execute("SELECT cache_key, expires FROM %s WHERE cache_key = %%s" % table, [key])
try:
result = cursor.fetchone()
if result and (mode == 'set' or
(mode == 'add' and result[1] < now)):
cursor.execute("UPDATE %s SET value = %%s, expires = %%s WHERE cache_key = %%s" % self._table,
[encoded, connection.ops.value_to_db_datetime(exp), key])
cursor.execute("UPDATE %s SET value = %%s, expires = %%s WHERE cache_key = %%s" % table,
[encoded, connections[db].ops.value_to_db_datetime(exp), key])
else:
cursor.execute("INSERT INTO %s (cache_key, value, expires) VALUES (%%s, %%s, %%s)" % self._table,
[key, encoded, connection.ops.value_to_db_datetime(exp)])
cursor.execute("INSERT INTO %s (cache_key, value, expires) VALUES (%%s, %%s, %%s)" % table,
[key, encoded, connections[db].ops.value_to_db_datetime(exp)])
except DatabaseError:
# To be threadsafe, updates/inserts are allowed to fail silently
transaction.rollback_unless_managed()
transaction.rollback_unless_managed(using=db)
return False
else:
transaction.commit_unless_managed()
transaction.commit_unless_managed(using=db)
return True
def delete(self, key):
cursor = connection.cursor()
cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
transaction.commit_unless_managed()
db = router.db_for_write(self.cache_model_class)
table = connections[db].ops.quote_name(self._table)
cursor = connections[db].cursor()
cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % table, [key])
transaction.commit_unless_managed(using=db)
def has_key(self, key):
db = router.db_for_read(self.cache_model_class)
table = connections[db].ops.quote_name(self._table)
cursor = connections[db].cursor()
now = datetime.now().replace(microsecond=0)
cursor = connection.cursor()
cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s and expires > %%s" % self._table,
[key, connection.ops.value_to_db_datetime(now)])
cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s and expires > %%s" % table,
[key, connections[db].ops.value_to_db_datetime(now)])
return cursor.fetchone() is not None
def _cull(self, cursor, now):
def _cull(self, db, cursor, now):
if self._cull_frequency == 0:
self.clear()
else:
cursor.execute("DELETE FROM %s WHERE expires < %%s" % self._table,
[connection.ops.value_to_db_datetime(now)])
cursor.execute("SELECT COUNT(*) FROM %s" % self._table)
cursor.execute("DELETE FROM %s WHERE expires < %%s" % table,
[connections[db].ops.value_to_db_datetime(now)])
cursor.execute("SELECT COUNT(*) FROM %s" % table)
num = cursor.fetchone()[0]
if num > self._max_entries:
cursor.execute("SELECT cache_key FROM %s ORDER BY cache_key LIMIT 1 OFFSET %%s" % self._table, [num / self._cull_frequency])
cursor.execute("DELETE FROM %s WHERE cache_key < %%s" % self._table, [cursor.fetchone()[0]])
cursor.execute("SELECT cache_key FROM %s ORDER BY cache_key LIMIT 1 OFFSET %%s" % table, [num / self._cull_frequency])
cursor.execute("DELETE FROM %s WHERE cache_key < %%s" % table, [cursor.fetchone()[0]])
def clear(self):
cursor = connection.cursor()
cursor.execute('DELETE FROM %s' % self._table)
db = router.db_for_write(self.cache_model_class)
table = connections[db].ops.quote_name(self._table)
cursor = connections[db].cursor()
cursor.execute('DELETE FROM %s' % table)

View File

@ -250,15 +250,15 @@ class ManagementUtility(object):
"""
try:
app_name = get_commands()[subcommand]
if isinstance(app_name, BaseCommand):
# If the command is already loaded, use it directly.
klass = app_name
else:
klass = load_command_class(app_name, subcommand)
except KeyError:
sys.stderr.write("Unknown command: %r\nType '%s help' for usage.\n" % \
(subcommand, self.prog_name))
sys.exit(1)
if isinstance(app_name, BaseCommand):
# If the command is already loaded, use it directly.
klass = app_name
else:
klass = load_command_class(app_name, subcommand)
return klass
def autocomplete(self):

View File

@ -118,7 +118,7 @@ class BaseCommand(object):
# Metadata about this command.
option_list = (
make_option('-v', '--verbosity', action='store', dest='verbosity', default='1',
type='choice', choices=['0', '1', '2'],
type='choice', choices=['0', '1', '2', '3'],
help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
make_option('--settings',
help='The Python path to a settings module, e.g. "myproject.settings.main". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.'),

View File

@ -16,11 +16,12 @@ class Command(BaseCommand):
default=DEFAULT_DB_ALIAS, help='Nominates a specific database to load '
'fixtures into. Defaults to the "default" database.'),
make_option('-e', '--exclude', dest='exclude',action='append', default=[],
help='App to exclude (use multiple --exclude to exclude multiple apps).'),
help='An appname or appname.ModelName to exclude (use multiple --exclude to exclude multiple apps/models).'),
make_option('-n', '--natural', action='store_true', dest='use_natural_keys', default=False,
help='Use natural keys if they are available.'),
)
help = 'Output the contents of the database as a fixture of the given format.'
help = ("Output the contents of the database as a fixture of the given "
"format (using each model's default manager).")
args = '[appname appname.ModelName ...]'
def handle(self, *app_labels, **options):
@ -30,11 +31,25 @@ class Command(BaseCommand):
indent = options.get('indent',None)
using = options.get('database', DEFAULT_DB_ALIAS)
connection = connections[using]
exclude = options.get('exclude',[])
excludes = options.get('exclude',[])
show_traceback = options.get('traceback', False)
use_natural_keys = options.get('use_natural_keys', False)
excluded_apps = set(get_app(app_label) for app_label in exclude)
excluded_apps = set()
excluded_models = set()
for exclude in excludes:
if '.' in exclude:
app_label, model_name = exclude.split('.', 1)
model_obj = get_model(app_label, model_name)
if not model_obj:
raise CommandError('Unknown model in excludes: %s' % exclude)
excluded_models.add(model_obj)
else:
try:
app_obj = get_app(exclude)
excluded_apps.add(app_obj)
except ImproperlyConfigured:
raise CommandError('Unknown app in excludes: %s' % exclude)
if len(app_labels) == 0:
app_list = SortedDict((app, None) for app in get_apps() if app not in excluded_apps)
@ -47,7 +62,8 @@ class Command(BaseCommand):
app = get_app(app_label)
except ImproperlyConfigured:
raise CommandError("Unknown application: %s" % app_label)
if app in excluded_apps:
continue
model = get_model(app_label, model_label)
if model is None:
raise CommandError("Unknown model: %s.%s" % (app_label, model_label))
@ -64,6 +80,8 @@ class Command(BaseCommand):
app = get_app(app_label)
except ImproperlyConfigured:
raise CommandError("Unknown application: %s" % app_label)
if app in excluded_apps:
continue
app_list[app] = None
# Check that the serialization format exists; this is a shortcut to
@ -79,6 +97,8 @@ class Command(BaseCommand):
# Now collate the objects to be serialized.
objects = []
for model in sort_dependencies(app_list.items()):
if model in excluded_models:
continue
if not model._meta.proxy and router.allow_syncdb(using, model):
objects.extend(model._default_manager.using(using).all())
@ -163,4 +183,4 @@ def sort_dependencies(app_list):
)
model_dependencies = skipped
return model_list
return model_list

View File

@ -1,7 +1,7 @@
from optparse import make_option
from django.conf import settings
from django.db import connections, transaction, models, DEFAULT_DB_ALIAS
from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
from django.core.management import call_command
from django.core.management.base import NoArgsCommand, CommandError
from django.core.management.color import no_style
@ -64,7 +64,13 @@ Are you sure you want to do this?
# Emit the post sync signal. This allows individual
# applications to respond as if the database had been
# sync'd from scratch.
emit_post_sync_signal(models.get_models(), verbosity, interactive, db)
all_models = []
for app in models.get_apps():
all_models.extend([
m for m in models.get_models(app, include_auto_created=True)
if router.allow_syncdb(db, m)
])
emit_post_sync_signal(all_models, verbosity, interactive, db)
# Reinstall the initial_data fixture.
kwargs = options.copy()

View File

@ -112,7 +112,7 @@ class Command(BaseCommand):
formats = []
if formats:
if verbosity > 1:
if verbosity >= 2:
self.stdout.write("Loading '%s' fixtures...\n" % fixture_name)
else:
sys.stderr.write(
@ -128,7 +128,7 @@ class Command(BaseCommand):
fixture_dirs = app_fixtures + list(settings.FIXTURE_DIRS) + ['']
for fixture_dir in fixture_dirs:
if verbosity > 1:
if verbosity >= 2:
self.stdout.write("Checking %s for fixtures...\n" % humanize(fixture_dir))
label_found = False
@ -141,7 +141,7 @@ class Command(BaseCommand):
if p
)
if verbosity > 1:
if verbosity >= 3:
self.stdout.write("Trying %s for %s fixture '%s'...\n" % \
(humanize(fixture_dir), file_name, fixture_name))
full_path = os.path.join(fixture_dir, file_name)
@ -158,7 +158,7 @@ class Command(BaseCommand):
else:
fixture_count += 1
objects_in_fixture = 0
if verbosity > 0:
if verbosity >= 2:
self.stdout.write("Installing %s fixture '%s' from %s.\n" % \
(format, fixture_name, humanize(fixture_dir)))
try:
@ -198,7 +198,7 @@ class Command(BaseCommand):
return
except Exception, e:
if verbosity > 1:
if verbosity >= 2:
self.stdout.write("No %s fixture '%s' in %s.\n" % \
(format, fixture_name, humanize(fixture_dir)))
@ -207,7 +207,7 @@ class Command(BaseCommand):
if object_count > 0:
sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
if sequence_sql:
if verbosity > 1:
if verbosity >= 2:
self.stdout.write("Resetting sequences\n")
for line in sequence_sql:
cursor.execute(line)
@ -217,10 +217,10 @@ class Command(BaseCommand):
transaction.leave_transaction_management(using=using)
if object_count == 0:
if verbosity > 0:
if verbosity >= 1:
self.stdout.write("No fixtures found.\n")
else:
if verbosity > 0:
if verbosity >= 1:
self.stdout.write("Installed %d object(s) from %d fixture(s)\n" % (object_count, fixture_count))
# Close the DB connection. This is required as a workaround for an

View File

@ -76,10 +76,12 @@ class Command(NoArgsCommand):
)
# Create the tables for each model
if verbosity >= 1:
print "Creating tables ..."
for app_name, model_list in manifest.items():
for model in model_list:
# Create the model's database table, if it doesn't already exist.
if verbosity >= 2:
if verbosity >= 3:
print "Processing %s.%s model" % (app_name, model._meta.object_name)
sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
seen_models.add(model)
@ -107,12 +109,14 @@ class Command(NoArgsCommand):
# Install custom SQL for the app (but only if this
# is a model we've just created)
if verbosity >= 1:
print "Installing custom SQL ..."
for app_name, model_list in manifest.items():
for model in model_list:
if model in created_models:
custom_sql = custom_sql_for_model(model, self.style, connection)
if custom_sql:
if verbosity >= 1:
if verbosity >= 2:
print "Installing custom SQL for %s.%s model" % (app_name, model._meta.object_name)
try:
for sql in custom_sql:
@ -127,16 +131,18 @@ class Command(NoArgsCommand):
else:
transaction.commit_unless_managed(using=db)
else:
if verbosity >= 2:
if verbosity >= 3:
print "No custom SQL for %s.%s model" % (app_name, model._meta.object_name)
if verbosity >= 1:
print "Installing indexes ..."
# Install SQL indicies for all newly created models
for app_name, model_list in manifest.items():
for model in model_list:
if model in created_models:
index_sql = connection.creation.sql_indexes_for_model(model, self.style)
if index_sql:
if verbosity >= 1:
if verbosity >= 2:
print "Installing index for %s.%s model" % (app_name, model._meta.object_name)
try:
for sql in index_sql:

View File

@ -30,6 +30,40 @@ _prefixes = {}
# Overridden URLconfs for each thread are stored here.
_urlconfs = {}
class ResolverMatch(object):
def __init__(self, func, args, kwargs, url_name=None, app_name=None, namespaces=None):
self.func = func
self.args = args
self.kwargs = kwargs
self.app_name = app_name
if namespaces:
self.namespaces = [x for x in namespaces if x]
else:
self.namespaces = []
if not url_name:
if not hasattr(func, '__name__'):
# An instance of a callable class
url_name = '.'.join([func.__class__.__module__, func.__class__.__name__])
else:
# A function
url_name = '.'.join([func.__module__, func.__name__])
self.url_name = url_name
def namespace(self):
return ':'.join(self.namespaces)
namespace = property(namespace)
def view_name(self):
return ':'.join([ x for x in [ self.namespace, self.url_name ] if x ])
view_name = property(view_name)
def __getitem__(self, index):
return (self.func, self.args, self.kwargs)[index]
def __repr__(self):
return "ResolverMatch(func=%s, args=%s, kwargs=%s, url_name='%s', app_name='%s', namespace='%s')" % (
self.func, self.args, self.kwargs, self.url_name, self.app_name, self.namespace)
class Resolver404(Http404):
pass
@ -120,7 +154,7 @@ class RegexURLPattern(object):
# In both cases, pass any extra_kwargs as **kwargs.
kwargs.update(self.default_args)
return self.callback, args, kwargs
return ResolverMatch(self.callback, args, kwargs, self.name)
def _get_callback(self):
if self._callback is not None:
@ -183,7 +217,8 @@ class RegexURLResolver(object):
else:
bits = normalize(p_pattern)
lookups.appendlist(pattern.callback, (bits, p_pattern))
lookups.appendlist(pattern.name, (bits, p_pattern))
if pattern.name is not None:
lookups.appendlist(pattern.name, (bits, p_pattern))
self._reverse_dict = lookups
self._namespace_dict = namespaces
self._app_dict = apps
@ -224,9 +259,9 @@ class RegexURLResolver(object):
if sub_match:
sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()])
sub_match_dict.update(self.default_kwargs)
for k, v in sub_match[2].iteritems():
for k, v in sub_match.kwargs.iteritems():
sub_match_dict[smart_str(k)] = v
return sub_match[0], sub_match[1], sub_match_dict
return ResolverMatch(sub_match.func, sub_match.args, sub_match_dict, sub_match.url_name, self.app_name or sub_match.app_name, [self.namespace] + sub_match.namespaces)
tried.append(pattern.regex.pattern)
raise Resolver404({'tried': tried, 'path': new_path})
raise Resolver404({'path' : path})

View File

@ -35,6 +35,8 @@ if DEFAULT_DB_ALIAS not in settings.DATABASES:
raise ImproperlyConfigured("You must default a '%s' database" % DEFAULT_DB_ALIAS)
for alias, database in settings.DATABASES.items():
if 'ENGINE' not in database:
raise ImproperlyConfigured("You must specify a 'ENGINE' for database '%s'" % alias)
if database['ENGINE'] in ("postgresql", "postgresql_psycopg2", "sqlite3", "mysql", "oracle"):
import warnings
if 'django.contrib.gis' in settings.INSTALLED_APPS:

View File

@ -359,12 +359,17 @@ class BaseDatabaseCreation(object):
can_rollback = self._rollback_works()
self.connection.settings_dict["SUPPORTS_TRANSACTIONS"] = can_rollback
call_command('syncdb', verbosity=verbosity, interactive=False, database=self.connection.alias)
# Report syncdb messages at one level lower than that requested.
# This ensures we don't get flooded with messages during testing
# (unless you really ask to be flooded)
call_command('syncdb', verbosity=max(verbosity - 1, 0), interactive=False, database=self.connection.alias)
if settings.CACHE_BACKEND.startswith('db://'):
from django.core.cache import parse_backend_uri
_, cache_name, _ = parse_backend_uri(settings.CACHE_BACKEND)
call_command('createcachetable', cache_name)
from django.core.cache import parse_backend_uri, cache
from django.db import router
if router.allow_syncdb(self.connection.alias, cache.cache_model_class):
_, cache_name, _ = parse_backend_uri(settings.CACHE_BACKEND)
call_command('createcachetable', cache_name, database=self.connection.alias)
# Get a cursor (even though we don't need one yet). This has
# the side effect of initializing the test database.
@ -397,10 +402,8 @@ class BaseDatabaseCreation(object):
if autoclobber or confirm == 'yes':
try:
if verbosity >= 1:
print "Destroying old test database..."
print "Destroying old test database '%s'..." % self.connection.alias
cursor.execute("DROP DATABASE %s" % qn(test_database_name))
if verbosity >= 1:
print "Creating test database..."
cursor.execute("CREATE DATABASE %s %s" % (qn(test_database_name), suffix))
except Exception, e:
sys.stderr.write("Got an error recreating the test database: %s\n" % e)

View File

@ -61,8 +61,6 @@ class DatabaseCreation(BaseDatabaseCreation):
cursor = self.connection.cursor()
if self._test_database_create():
if verbosity >= 1:
print 'Creating test database...'
try:
self._execute_test_db_creation(cursor, parameters, verbosity)
except Exception, e:
@ -72,10 +70,8 @@ class DatabaseCreation(BaseDatabaseCreation):
if autoclobber or confirm == 'yes':
try:
if verbosity >= 1:
print "Destroying old test database..."
print "Destroying old test database '%s'..." % self.connection.alias
self._execute_test_db_destruction(cursor, parameters, verbosity)
if verbosity >= 1:
print "Creating test database..."
self._execute_test_db_creation(cursor, parameters, verbosity)
except Exception, e:
sys.stderr.write("Got an error recreating the test database: %s\n" % e)

View File

@ -64,7 +64,7 @@ class DatabaseCreation(BaseDatabaseCreation):
# a second index that specifies their operator class, which is
# needed when performing correct LIKE queries outside the
# C locale. See #12234.
db_type = f.db_type()
db_type = f.db_type(connection=self.connection)
if db_type.startswith('varchar'):
output.append(get_index_sql('%s_%s_like' % (db_table, f.column),
' varchar_pattern_ops'))

View File

@ -55,7 +55,8 @@ class DatabaseOperations(BaseDatabaseOperations):
def last_insert_id(self, cursor, table_name, pk_name):
# Use pg_get_serial_sequence to get the underlying sequence name
# from the table name and column name (available since PostgreSQL 8)
cursor.execute("SELECT CURRVAL(pg_get_serial_sequence('%s','%s'))" % (table_name, pk_name))
cursor.execute("SELECT CURRVAL(pg_get_serial_sequence('%s','%s'))" % (
self.quote_name(table_name), pk_name))
return cursor.fetchone()[0]
def no_limit_value(self):
@ -97,7 +98,7 @@ class DatabaseOperations(BaseDatabaseOperations):
column_name = 'id'
sql.append("%s setval(pg_get_serial_sequence('%s','%s'), 1, false);" % \
(style.SQL_KEYWORD('SELECT'),
style.SQL_TABLE(table_name),
style.SQL_TABLE(self.quote_name(table_name)),
style.SQL_FIELD(column_name))
)
return sql
@ -119,7 +120,7 @@ class DatabaseOperations(BaseDatabaseOperations):
if isinstance(f, models.BaseAutoField):
output.append("%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
(style.SQL_KEYWORD('SELECT'),
style.SQL_TABLE(model._meta.db_table),
style.SQL_TABLE(qn(model._meta.db_table)),
style.SQL_FIELD(f.column),
style.SQL_FIELD(qn(f.column)),
style.SQL_FIELD(qn(f.column)),
@ -131,7 +132,7 @@ class DatabaseOperations(BaseDatabaseOperations):
if not f.rel.through:
output.append("%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
(style.SQL_KEYWORD('SELECT'),
style.SQL_TABLE(model._meta.db_table),
style.SQL_TABLE(qn(f.m2m_db_table())),
style.SQL_FIELD('id'),
style.SQL_FIELD(qn('id')),
style.SQL_FIELD(qn('id')),

View File

@ -43,14 +43,12 @@ class DatabaseCreation(BaseDatabaseCreation):
if test_database_name and test_database_name != ":memory:":
# Erase the old test database
if verbosity >= 1:
print "Destroying old test database..."
print "Destroying old test database '%s'..." % self.connection.alias
if os.access(test_database_name, os.F_OK):
if not autoclobber:
confirm = raw_input("Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: " % test_database_name)
if autoclobber or confirm == 'yes':
try:
if verbosity >= 1:
print "Destroying old test database..."
os.remove(test_database_name)
except Exception, e:
sys.stderr.write("Got an error deleting the old test database: %s\n" % e)
@ -58,8 +56,6 @@ class DatabaseCreation(BaseDatabaseCreation):
else:
print "Tests cancelled."
sys.exit(1)
if verbosity >= 1:
print "Creating test database..."
else:
test_database_name = ":memory:"
return test_database_name

View File

@ -456,7 +456,7 @@ class Model(object):
meta = cls._meta
if origin and not meta.auto_created:
signals.pre_save.send(sender=origin, instance=self, raw=raw)
signals.pre_save.send(sender=origin, instance=self, raw=raw, using=using)
# If we are in a raw save, save the object exactly as presented.
# That means that we don't try to be smart about saving attributes
@ -542,7 +542,7 @@ class Model(object):
# Signal that the save is complete
if origin and not meta.auto_created:
signals.post_save.send(sender=origin, instance=self,
created=(not record_exists), raw=raw)
created=(not record_exists), raw=raw, using=using)
save_base.alters_data = True

View File

@ -469,6 +469,9 @@ class AutoField(BaseAutoField):
'invalid': _(u'This value must be an integer.'),
}
def get_internal_type(self):
return "AutoField"
def to_python(self, value):
if value is None:
return value
@ -801,6 +804,14 @@ class EmailField(CharField):
kwargs['max_length'] = kwargs.get('max_length', 75)
CharField.__init__(self, *args, **kwargs)
def formfield(self, **kwargs):
# As with CharField, this will cause email validation to be performed twice
defaults = {
'form_class': forms.EmailField,
}
defaults.update(kwargs)
return super(EmailField, self).formfield(**defaults)
class FilePathField(Field):
description = _("File path")
@ -1111,6 +1122,14 @@ class URLField(CharField):
CharField.__init__(self, verbose_name, name, **kwargs)
self.validators.append(validators.URLValidator(verify_exists=verify_exists))
def formfield(self, **kwargs):
# As with CharField, this will cause URL validation to be performed twice
defaults = {
'form_class': forms.URLField,
}
defaults.update(kwargs)
return super(URLField, self).formfield(**defaults)
class XMLField(TextField):
description = _("XML text")

View File

@ -566,7 +566,7 @@ def create_many_related_manager(superclass, rel=False):
# duplicate data row for symmetrical reverse entries.
signals.m2m_changed.send(sender=rel.through, action='pre_add',
instance=self.instance, reverse=self.reverse,
model=self.model, pk_set=new_ids)
model=self.model, pk_set=new_ids, using=db)
# Add the ones that aren't there already
for obj_id in new_ids:
self.through._default_manager.using(db).create(**{
@ -578,7 +578,7 @@ def create_many_related_manager(superclass, rel=False):
# duplicate data row for symmetrical reverse entries.
signals.m2m_changed.send(sender=rel.through, action='post_add',
instance=self.instance, reverse=self.reverse,
model=self.model, pk_set=new_ids)
model=self.model, pk_set=new_ids, using=db)
def _remove_items(self, source_field_name, target_field_name, *objs):
# source_col_name: the PK colname in join_table for the source object
@ -594,14 +594,16 @@ def create_many_related_manager(superclass, rel=False):
old_ids.add(obj.pk)
else:
old_ids.add(obj)
# Work out what DB we're operating on
db = router.db_for_write(self.through.__class__, instance=self.instance)
# Send a signal to the other end if need be.
if self.reverse or source_field_name == self.source_field_name:
# Don't send the signal when we are deleting the
# duplicate data row for symmetrical reverse entries.
signals.m2m_changed.send(sender=rel.through, action="pre_remove",
instance=self.instance, reverse=self.reverse,
model=self.model, pk_set=old_ids)
model=self.model, pk_set=old_ids, using=db)
# Remove the specified objects from the join table
db = router.db_for_write(self.through.__class__, instance=self.instance)
self.through._default_manager.using(db).filter(**{
source_field_name: self._pk_val,
'%s__in' % target_field_name: old_ids
@ -611,17 +613,17 @@ def create_many_related_manager(superclass, rel=False):
# duplicate data row for symmetrical reverse entries.
signals.m2m_changed.send(sender=rel.through, action="post_remove",
instance=self.instance, reverse=self.reverse,
model=self.model, pk_set=old_ids)
model=self.model, pk_set=old_ids, using=db)
def _clear_items(self, source_field_name):
db = router.db_for_write(self.through.__class__, instance=self.instance)
# source_col_name: the PK colname in join_table for the source object
if self.reverse or source_field_name == self.source_field_name:
# Don't send the signal when we are clearing the
# duplicate data rows for symmetrical reverse entries.
signals.m2m_changed.send(sender=rel.through, action="pre_clear",
instance=self.instance, reverse=self.reverse,
model=self.model, pk_set=None)
db = router.db_for_write(self.through.__class__, instance=self.instance)
model=self.model, pk_set=None, using=db)
self.through._default_manager.using(db).filter(**{
source_field_name: self._pk_val
}).delete()
@ -630,7 +632,7 @@ def create_many_related_manager(superclass, rel=False):
# duplicate data rows for symmetrical reverse entries.
signals.m2m_changed.send(sender=rel.through, action="post_clear",
instance=self.instance, reverse=self.reverse,
model=self.model, pk_set=None)
model=self.model, pk_set=None, using=db)
return ManyRelatedManager
@ -812,6 +814,9 @@ class ForeignKey(RelatedField, Field):
to_field = to_field or (to._meta.pk and to._meta.pk.name)
kwargs['verbose_name'] = kwargs.get('verbose_name', None)
if 'db_index' not in kwargs:
kwargs['db_index'] = True
kwargs['rel'] = rel_class(to, to_field,
related_name=kwargs.pop('related_name', None),
limit_choices_to=kwargs.pop('limit_choices_to', None),
@ -819,8 +824,6 @@ class ForeignKey(RelatedField, Field):
parent_link=kwargs.pop('parent_link', False))
Field.__init__(self, **kwargs)
self.db_index = True
def validate(self, value, model_instance):
if self.rel.parent_link:
return

View File

@ -1312,7 +1312,8 @@ def delete_objects(seen_objs, using):
# Pre-notify all instances to be deleted.
for pk_val, instance in items:
if not cls._meta.auto_created:
signals.pre_delete.send(sender=cls, instance=instance)
signals.pre_delete.send(sender=cls, instance=instance,
using=using)
pk_list = [pk for pk,instance in items]
@ -1344,7 +1345,7 @@ def delete_objects(seen_objs, using):
setattr(instance, field.attname, None)
if not cls._meta.auto_created:
signals.post_delete.send(sender=cls, instance=instance)
signals.post_delete.send(sender=cls, instance=instance, using=using)
setattr(instance, cls._meta.pk.attname, None)
if forced_managed:

View File

@ -5,12 +5,12 @@ class_prepared = Signal(providing_args=["class"])
pre_init = Signal(providing_args=["instance", "args", "kwargs"])
post_init = Signal(providing_args=["instance"])
pre_save = Signal(providing_args=["instance", "raw"])
post_save = Signal(providing_args=["instance", "raw", "created"])
pre_save = Signal(providing_args=["instance", "raw", "using"])
post_save = Signal(providing_args=["instance", "raw", "created", "using"])
pre_delete = Signal(providing_args=["instance"])
post_delete = Signal(providing_args=["instance"])
pre_delete = Signal(providing_args=["instance", "using"])
post_delete = Signal(providing_args=["instance", "using"])
post_syncdb = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive"])
m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set"])
m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"])

View File

@ -1076,14 +1076,9 @@ class Query(object):
# exclude the "foo__in=[]" case from this handling, because
# it's short-circuited in the Where class.
# We also need to handle the case where a subquery is provided
entry = self.where_class()
entry.add((
Constraint(alias, col, None, eliminatable_if=lambda connection: not getattr(connection.features, "sql_nulls", True)),
'isnull',
True
), AND)
entry.negate()
self.where.add(entry, AND)
self.where.add(
(Constraint(alias, col, None, eliminatable_if=lambda connection: not getattr(connection.features, "sql_nulls", True)), 'isnull', False), AND
)
if can_reuse is not None:
can_reuse.update(join_list)

View File

@ -35,7 +35,7 @@ def get_declared_fields(bases, attrs, with_base_fields=True):
Also integrates any additional media definitions
"""
fields = [(field_name, attrs.pop(field_name)) for field_name, obj in attrs.items() if isinstance(obj, Field)]
fields.sort(lambda x, y: cmp(x[1].creation_counter, y[1].creation_counter))
fields.sort(key=lambda x: x[1].creation_counter)
# If this class is subclassing another Form, add that Form's fields.
# Note that we loop over the bases in *reverse*. This is necessary in
@ -213,7 +213,7 @@ class BaseForm(StrAndUnicode):
normal_row = u'<tr%(html_class_attr)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>',
error_row = u'<tr><td colspan="2">%s</td></tr>',
row_ender = u'</td></tr>',
help_text_html = u'<br />%s',
help_text_html = u'<br /><span class="helptext">%s</span>',
errors_on_separate_row = False)
def as_ul(self):
@ -222,7 +222,7 @@ class BaseForm(StrAndUnicode):
normal_row = u'<li%(html_class_attr)s>%(errors)s%(label)s %(field)s%(help_text)s</li>',
error_row = u'<li>%s</li>',
row_ender = '</li>',
help_text_html = u' %s',
help_text_html = u' <span class="helptext">%s</span>',
errors_on_separate_row = False)
def as_p(self):
@ -231,7 +231,7 @@ class BaseForm(StrAndUnicode):
normal_row = u'<p%(html_class_attr)s>%(label)s %(field)s%(help_text)s</p>',
error_row = u'%s',
row_ender = '</p>',
help_text_html = u' %s',
help_text_html = u' <span class="helptext">%s</span>',
errors_on_separate_row = True)
def non_field_errors(self):

View File

@ -199,14 +199,12 @@ class BaseFormSet(StrAndUnicode):
# A sort function to order things numerically ascending, but
# None should be sorted below anything else. Allowing None as
# a comparison value makes it so we can leave ordering fields
# blamk.
def compare_ordering_values(x, y):
if x[1] is None:
return 1
if y[1] is None:
return -1
return x[1] - y[1]
self._ordering.sort(compare_ordering_values)
# blank.
def compare_ordering_key(k):
if k[1] is None:
return (1, 0) # +infinity, larger than any number
return (0, k[1])
self._ordering.sort(key=compare_ordering_key)
# Return a list of form.cleaned_data dicts in the order spcified by
# the form data.
return [self.forms[i[0]] for i in self._ordering]

View File

@ -229,7 +229,7 @@ class TextInput(Input):
class PasswordInput(Input):
input_type = 'password'
def __init__(self, attrs=None, render_value=True):
def __init__(self, attrs=None, render_value=False):
super(PasswordInput, self).__init__(attrs)
self.render_value = render_value
@ -308,9 +308,13 @@ class DateInput(Input):
super(DateInput, self).__init__(attrs)
if format:
self.format = format
self.manual_format = True
else:
self.format = formats.get_format('DATE_INPUT_FORMATS')[0]
self.manual_format = False
def _format_value(self, value):
if self.is_localized:
if self.is_localized and not self.manual_format:
return formats.localize_input(value)
elif hasattr(value, 'strftime'):
value = datetime_safe.new_date(value)
@ -336,9 +340,13 @@ class DateTimeInput(Input):
super(DateTimeInput, self).__init__(attrs)
if format:
self.format = format
self.manual_format = True
else:
self.format = formats.get_format('DATETIME_INPUT_FORMATS')[0]
self.manual_format = False
def _format_value(self, value):
if self.is_localized:
if self.is_localized and not self.manual_format:
return formats.localize_input(value)
elif hasattr(value, 'strftime'):
value = datetime_safe.new_datetime(value)
@ -364,9 +372,13 @@ class TimeInput(Input):
super(TimeInput, self).__init__(attrs)
if format:
self.format = format
self.manual_format = True
else:
self.format = formats.get_format('TIME_INPUT_FORMATS')[0]
self.manual_format = False
def _format_value(self, value):
if self.is_localized:
if self.is_localized and not self.manual_format:
return formats.localize_input(value)
elif hasattr(value, 'strftime'):
return value.strftime(self.format)
@ -751,12 +763,8 @@ class SplitDateTimeWidget(MultiWidget):
time_format = TimeInput.format
def __init__(self, attrs=None, date_format=None, time_format=None):
if date_format:
self.date_format = date_format
if time_format:
self.time_format = time_format
widgets = (DateInput(attrs=attrs, format=self.date_format),
TimeInput(attrs=attrs, format=self.time_format))
widgets = (DateInput(attrs=attrs, format=date_format),
TimeInput(attrs=attrs, format=time_format))
super(SplitDateTimeWidget, self).__init__(widgets, attrs)
def decompress(self, value):

View File

@ -11,9 +11,10 @@ except ImportError:
from django.template import Variable, Library
from django.conf import settings
from django.utils import formats
from django.utils.translation import ugettext, ungettext
from django.utils.encoding import force_unicode, iri_to_uri
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe, SafeData
from django.utils.translation import ugettext, ungettext
register = Library()
@ -255,6 +256,8 @@ def truncatewords(value, arg):
Truncates a string after a certain number of words.
Argument: Number of words to truncate after.
Newlines within the string are removed.
"""
from django.utils.text import truncate_words
try:
@ -270,6 +273,8 @@ def truncatewords_html(value, arg):
Truncates HTML after a certain number of words.
Argument: Number of words to truncate after.
Newlines in the HTML are preserved.
"""
from django.utils.text import truncate_html_words
try:
@ -496,10 +501,9 @@ def join(value, arg, autoescape=None):
"""
value = map(force_unicode, value)
if autoescape:
from django.utils.html import conditional_escape
value = [conditional_escape(v) for v in value]
try:
data = arg.join(value)
data = conditional_escape(arg).join(value)
except AttributeError: # fail silently but nicely
return value
return mark_safe(data)

View File

@ -3,6 +3,7 @@ from urlparse import urlparse, urlunparse, urlsplit
import sys
import os
import re
import mimetypes
try:
from cStringIO import StringIO
except ImportError:
@ -138,11 +139,14 @@ def encode_multipart(boundary, data):
def encode_file(boundary, key, file):
to_str = lambda s: smart_str(s, settings.DEFAULT_CHARSET)
content_type = mimetypes.guess_type(file.name)[0]
if content_type is None:
content_type = 'application/octet-stream'
return [
'--' + boundary,
'Content-Disposition: form-data; name="%s"; filename="%s"' \
% (to_str(key), to_str(os.path.basename(file.name))),
'Content-Type: application/octet-stream',
'Content-Type: %s' % content_type,
'',
file.read()
]

View File

@ -347,7 +347,7 @@ class TransactionTestCase(unittest.TestCase):
def assertContains(self, response, text, count=None, status_code=200,
msg_prefix=''):
"""
Asserts that a response indicates that a page was retrieved
Asserts that a response indicates that some content was retrieved
successfully, (i.e., the HTTP status code was as expected), and that
``text`` occurs ``count`` times in the content of the response.
If ``count`` is None, the count doesn't matter - the assertion is true
@ -357,7 +357,7 @@ class TransactionTestCase(unittest.TestCase):
msg_prefix += ": "
self.assertEqual(response.status_code, status_code,
msg_prefix + "Couldn't retrieve page: Response code was %d"
msg_prefix + "Couldn't retrieve content: Response code was %d"
" (expected %d)" % (response.status_code, status_code))
text = smart_str(text, response._charset)
real_count = response.content.count(text)
@ -372,7 +372,7 @@ class TransactionTestCase(unittest.TestCase):
def assertNotContains(self, response, text, status_code=200,
msg_prefix=''):
"""
Asserts that a response indicates that a page was retrieved
Asserts that a response indicates that some content was retrieved
successfully, (i.e., the HTTP status code was as expected), and that
``text`` doesn't occurs in the content of the response.
"""
@ -380,7 +380,7 @@ class TransactionTestCase(unittest.TestCase):
msg_prefix += ": "
self.assertEqual(response.status_code, status_code,
msg_prefix + "Couldn't retrieve page: Response code was %d"
msg_prefix + "Couldn't retrieve content: Response code was %d"
" (expected %d)" % (response.status_code, status_code))
text = smart_str(text, response._charset)
self.assertEqual(response.content.count(text), 0,

View File

@ -19,6 +19,12 @@ class ContextList(list):
else:
return super(ContextList, self).__getitem__(key)
def __contains__(self, key):
try:
value = self[key]
except KeyError:
return False
return True
def instrumented_test_render(self, context):
"""

View File

@ -39,7 +39,10 @@ wrap = allow_lazy(wrap, unicode)
def truncate_words(s, num, end_text='...'):
"""Truncates a string after a certain number of words. Takes an optional
argument of what should be used to notify that the string has been
truncated, defaults to ellipsis (...)"""
truncated, defaulting to ellipsis (...)
Newlines in the string will be stripped.
"""
s = force_unicode(s)
length = int(num)
words = s.split()
@ -51,10 +54,13 @@ def truncate_words(s, num, end_text='...'):
truncate_words = allow_lazy(truncate_words, unicode)
def truncate_html_words(s, num, end_text='...'):
"""Truncates html to a certain number of words (not counting tags and
"""Truncates HTML to a certain number of words (not counting tags and
comments). Closes opened tags if they were correctly closed in the given
html. Takes an optional argument of what should be used to notify that the
string has been truncated, defaults to ellipsis (...)."""
string has been truncated, defaulting to ellipsis (...).
Newlines in the HTML are preserved.
"""
s = force_unicode(s)
length = int(num)
if length <= 0:

View File

@ -496,7 +496,7 @@ def parse_accept_lang_header(lang_string):
return []
priority = priority and float(priority) or 1.0
result.append((lang, priority))
result.sort(lambda x, y: -cmp(x[1], y[1]))
result.sort(key=lambda k: k[1], reverse=True)
return result
# get_date_formats and get_partial_date_formats aren't used anymore by Django

View File

@ -12,20 +12,26 @@ PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
@ -40,6 +46,11 @@ dirhtml:
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@ -65,12 +76,42 @@ qthelp:
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/django"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
"run these through (pdf)latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
make -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes

View File

@ -1,9 +1,9 @@
"""
Sphinx plugins for Django documentation.
"""
import os
import docutils.nodes
import docutils.transforms
from docutils import nodes, transforms
try:
import json
except ImportError:
@ -14,26 +14,12 @@ except ImportError:
from django.utils import simplejson as json
except ImportError:
json = None
import os
import sphinx
import sphinx.addnodes
try:
from sphinx import builders
except ImportError:
import sphinx.builder as builders
try:
import sphinx.builders.html as builders_html
except ImportError:
builders_html = builders
from sphinx import addnodes, roles
from sphinx.builders.html import StandaloneHTMLBuilder
from sphinx.writers.html import SmartyPantsHTMLTranslator
from sphinx.util.console import bold
import sphinx.directives
import sphinx.environment
try:
import sphinx.writers.html as sphinx_htmlwriter
except ImportError:
import sphinx.htmlwriter as sphinx_htmlwriter
import sphinx.roles
from docutils import nodes
def setup(app):
app.add_crossref_type(
@ -74,21 +60,20 @@ def setup(app):
app.add_transform(SuppressBlockquotes)
app.add_builder(DjangoStandaloneHTMLBuilder)
# Monkeypatch PickleHTMLBuilder so that it doesn't die in Sphinx 0.4.2
if sphinx.__version__ == '0.4.2':
monkeypatch_pickle_builder()
def parse_version_directive(name, arguments, options, content, lineno,
content_offset, block_text, state, state_machine):
env = state.document.settings.env
is_nextversion = env.config.django_next_version == arguments[0]
ret = []
node = sphinx.addnodes.versionmodified()
node = addnodes.versionmodified()
ret.append(node)
if not is_nextversion:
if len(arguments) == 1:
linktext = 'Please, see the release notes <releases-%s>' % (arguments[0])
xrefs = sphinx.roles.xfileref_role('ref', linktext, linktext, lineno, state)
try:
xrefs = roles.XRefRole()('ref', linktext, linktext, lineno, state) # Sphinx >= 1.0
except:
xrefs = roles.xfileref_role('ref', linktext, linktext, lineno, state) # Sphinx < 1.0
node.extend(xrefs[0])
node['version'] = arguments[0]
else:
@ -103,29 +88,29 @@ def parse_version_directive(name, arguments, options, content, lineno,
env.note_versionchange(node['type'], node['version'], node, lineno)
return ret
class SuppressBlockquotes(docutils.transforms.Transform):
class SuppressBlockquotes(transforms.Transform):
"""
Remove the default blockquotes that encase indented list, tables, etc.
"""
default_priority = 300
suppress_blockquote_child_nodes = (
docutils.nodes.bullet_list,
docutils.nodes.enumerated_list,
docutils.nodes.definition_list,
docutils.nodes.literal_block,
docutils.nodes.doctest_block,
docutils.nodes.line_block,
docutils.nodes.table
nodes.bullet_list,
nodes.enumerated_list,
nodes.definition_list,
nodes.literal_block,
nodes.doctest_block,
nodes.line_block,
nodes.table
)
def apply(self):
for node in self.document.traverse(docutils.nodes.block_quote):
for node in self.document.traverse(nodes.block_quote):
if len(node.children) == 1 and isinstance(node.children[0], self.suppress_blockquote_child_nodes):
node.replace_self(node.children[0])
class DjangoHTMLTranslator(sphinx_htmlwriter.SmartyPantsHTMLTranslator):
class DjangoHTMLTranslator(SmartyPantsHTMLTranslator):
"""
Django-specific reST to HTML tweaks.
"""
@ -133,42 +118,41 @@ class DjangoHTMLTranslator(sphinx_htmlwriter.SmartyPantsHTMLTranslator):
# Don't use border=1, which docutils does by default.
def visit_table(self, node):
self.body.append(self.starttag(node, 'table', CLASS='docutils'))
# <big>? Really?
def visit_desc_parameterlist(self, node):
self.body.append('(')
self.first_param = 1
def depart_desc_parameterlist(self, node):
self.body.append(')')
pass
#
# Don't apply smartypants to literal blocks
#
def visit_literal_block(self, node):
self.no_smarty += 1
sphinx_htmlwriter.SmartyPantsHTMLTranslator.visit_literal_block(self, node)
SmartyPantsHTMLTranslator.visit_literal_block(self, node)
def depart_literal_block(self, node):
sphinx_htmlwriter.SmartyPantsHTMLTranslator.depart_literal_block(self, node)
SmartyPantsHTMLTranslator.depart_literal_block(self, node)
self.no_smarty -= 1
#
# Turn the "new in version" stuff (versoinadded/versionchanged) into a
# Turn the "new in version" stuff (versionadded/versionchanged) into a
# better callout -- the Sphinx default is just a little span,
# which is a bit less obvious that I'd like.
#
# FIXME: these messages are all hardcoded in English. We need to chanage
# FIXME: these messages are all hardcoded in English. We need to change
# that to accomodate other language docs, but I can't work out how to make
# that work and I think it'll require Sphinx 0.5 anyway.
# that work.
#
version_text = {
'deprecated': 'Deprecated in Django %s',
'versionchanged': 'Changed in Django %s',
'versionadded': 'New in Django %s',
}
def visit_versionmodified(self, node):
self.body.append(
self.starttag(node, 'div', CLASS=node['type'])
@ -178,41 +162,31 @@ class DjangoHTMLTranslator(sphinx_htmlwriter.SmartyPantsHTMLTranslator):
len(node) and ":" or "."
)
self.body.append('<span class="title">%s</span> ' % title)
def depart_versionmodified(self, node):
self.body.append("</div>\n")
# Give each section a unique ID -- nice for custom CSS hooks
# This is different on docutils 0.5 vs. 0.4...
if hasattr(sphinx_htmlwriter.SmartyPantsHTMLTranslator, 'start_tag_with_title') and sphinx.__version__ == '0.4.2':
def start_tag_with_title(self, node, tagname, **atts):
node = {
'classes': node.get('classes', []),
'ids': ['s-%s' % i for i in node.get('ids', [])]
}
return self.starttag(node, tagname, **atts)
else:
def visit_section(self, node):
old_ids = node.get('ids', [])
node['ids'] = ['s-' + i for i in old_ids]
if sphinx.__version__ != '0.4.2':
node['ids'].extend(old_ids)
sphinx_htmlwriter.SmartyPantsHTMLTranslator.visit_section(self, node)
node['ids'] = old_ids
def visit_section(self, node):
old_ids = node.get('ids', [])
node['ids'] = ['s-' + i for i in old_ids]
node['ids'].extend(old_ids)
SmartyPantsHTMLTranslator.visit_section(self, node)
node['ids'] = old_ids
def parse_django_admin_node(env, sig, signode):
command = sig.split(' ')[0]
env._django_curr_admin_command = command
title = "django-admin.py %s" % sig
signode += sphinx.addnodes.desc_name(title, title)
signode += addnodes.desc_name(title, title)
return sig
def parse_django_adminopt_node(env, sig, signode):
"""A copy of sphinx.directives.CmdoptionDesc.parse_signature()"""
from sphinx import addnodes
from sphinx.directives.desc import option_desc_re
try:
from sphinx.domains.std import option_desc_re # Sphinx >= 1.0
except:
from sphinx.directives.desc import option_desc_re # Sphinx < 1.0
count = 0
firstname = ''
for m in option_desc_re.finditer(sig):
@ -228,44 +202,8 @@ def parse_django_adminopt_node(env, sig, signode):
raise ValueError
return firstname
def monkeypatch_pickle_builder():
import shutil
from os import path
try:
import cPickle as pickle
except ImportError:
import pickle
def handle_finish(self):
# dump the global context
outfilename = path.join(self.outdir, 'globalcontext.pickle')
f = open(outfilename, 'wb')
try:
pickle.dump(self.globalcontext, f, 2)
finally:
f.close()
self.info(bold('dumping search index...'))
self.indexer.prune(self.env.all_docs)
f = open(path.join(self.outdir, 'searchindex.pickle'), 'wb')
try:
self.indexer.dump(f, 'pickle')
finally:
f.close()
# copy the environment file from the doctree dir to the output dir
# as needed by the web app
shutil.copyfile(path.join(self.doctreedir, builders.ENV_PICKLE_FILENAME),
path.join(self.outdir, builders.ENV_PICKLE_FILENAME))
# touch 'last build' file, used by the web application to determine
# when to reload its environment and clear the cache
open(path.join(self.outdir, builders.LAST_BUILD_FILENAME), 'w').close()
builders.PickleHTMLBuilder.handle_finish = handle_finish
class DjangoStandaloneHTMLBuilder(builders_html.StandaloneHTMLBuilder):
class DjangoStandaloneHTMLBuilder(StandaloneHTMLBuilder):
"""
Subclass to add some extra things we need.
"""
@ -278,9 +216,14 @@ class DjangoStandaloneHTMLBuilder(builders_html.StandaloneHTMLBuilder):
self.warn("cannot create templatebuiltins.js due to missing simplejson dependency")
return
self.info(bold("writing templatebuiltins.js..."))
xrefs = self.env.reftargets.keys()
templatebuiltins = dict([('ttags', [n for (t,n) in xrefs if t == 'ttag']),
('tfilters', [n for (t,n) in xrefs if t == 'tfilter'])])
try:
xrefs = self.env.reftargets.keys()
templatebuiltins = dict([('ttags', [n for (t,n) in xrefs if t == 'ttag']),
('tfilters', [n for (t,n) in xrefs if t == 'tfilter'])])
except AttributeError:
xrefs = self.env.domaindata["std"]["objects"]
templatebuiltins = dict([('ttags', [n for (t,n) in xrefs if t == 'templatetag']),
('tfilters', [n for (t,n) in xrefs if t == 'templatefilter'])])
outfilename = os.path.join(self.outdir, "templatebuiltins.js")
f = open(outfilename, 'wb')
f.write('var django_template_builtins = ')

View File

@ -1,4 +1,4 @@
{% extends "!genindex.html" %}
{% extends "basic/genindex.html" %}
{% block bodyclass %}{% endblock %}
{% block sidebarwrapper %}{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "!layout.html" %}
{% extends "basic/layout.html" %}
{%- macro secondnav() %}
{%- if prev %}
@ -61,7 +61,7 @@
<a title="Home page" href="{{ pathto('index') }}">Home</a> {{ reldelim2 }}
<a title="Table of contents" href="{{ pathto('contents') }}">Table of contents</a> {{ reldelim2 }}
<a title="Global index" href="{{ pathto('genindex') }}">Index</a> {{ reldelim2 }}
<a title="Module index" href="{{ pathto('modindex') }}">Modules</a>
<a title="Module index" href="{{ pathto('py-modindex') }}">Modules</a>
</div>
<div class="nav">{{ secondnav() }}</div>
</div>

View File

@ -1,3 +1,3 @@
{% extends "!modindex.html" %}
{% extends "basic/modindex.html" %}
{% block bodyclass %}{% endblock %}
{% block sidebarwrapper %}{% endblock %}

View File

@ -1,3 +1,3 @@
{% extends "!search.html" %}
{% extends "basic/search.html" %}
{% block bodyclass %}{% endblock %}
{% block sidebarwrapper %}{% endblock %}

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1013 B

After

Width:  |  Height:  |  Size: 1013 B

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

4
docs/_theme/djangodocs/theme.conf vendored Normal file
View File

@ -0,0 +1,4 @@
[theme]
inherit = basic
stylesheet = default.css
pygments_style = trac

View File

@ -8,28 +8,35 @@
# The contents of this file are pickled, so don't put values in the namespace
# that aren't pickleable (module imports are okay, they're removed automatically).
#
# All configuration values have a default value; values that are commented out
# serve to show the default value.
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If your extensions are in another directory, add it here.
sys.path.append(os.path.join(os.path.dirname(__file__), "_ext"))
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext")))
# General configuration
# ---------------------
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ["djangodocs"]
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
# templates_path = []
# The suffix of source filenames.
source_suffix = '.txt'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'contents'
@ -37,8 +44,10 @@ master_doc = 'contents'
project = 'Django'
copyright = 'Django Software Foundation and contributors'
# The default replacements for |version| and |release|, also used in various
# other places throughout the built documents.
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.2'
@ -47,14 +56,22 @@ release = version
# The next version to be released
django_next_version = '1.3'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%B %d, %Y'
# List of documents that shouldn't be included in the build.
#unused_docs = []
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
@ -75,13 +92,35 @@ pygments_style = 'trac'
# Note: exclude_dirnames is new in Sphinx 0.5
exclude_dirnames = ['.svn']
# Options for HTML output
# -----------------------
# -- Options for HTML output ---------------------------------------------------
# The style sheet to use for HTML and HTML Help pages. A file of that name
# must exist either in Sphinx' static/ path, or in one of the custom paths
# given in html_static_path.
html_style = 'default.css'
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = "djangodocs"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ["_theme"]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
@ -110,17 +149,38 @@ html_translator_class = "djangodocs.DjangoHTMLTranslator"
html_additional_pages = {}
# If false, no module index is generated.
#html_use_modindex = True
#html_domain_indices = True
# If true, the reST sources are included in the HTML build as _sources/<name>.
html_copy_source = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'Djangodoc'
modindex_common_prefix = ["django."]
# Options for LaTeX output
# ------------------------
# -- Options for LaTeX output --------------------------------------------------
# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
@ -132,9 +192,24 @@ htmlhelp_basename = 'Djangodoc'
# (source start file, target name, title, author, document class [howto/manual]).
#latex_documents = []
latex_documents = [
('contents', 'django.tex', 'Django Documentation', 'Django Software Foundation', 'manual'),
('contents', 'django.tex', u'Django Documentation',
u'Django Software Foundation', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
@ -142,10 +217,53 @@ latex_documents = [
#latex_appendices = []
# If false, no module index is generated.
#latex_use_modindex = True
#latex_domain_indices = True
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# If this isn't set to True, the LaTex writer can only handle six levels of headers.
latex_use_parts = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('contents', 'django', 'Django Documentation', ['Django Software Foundation'], 1)
]
# -- Options for Epub output ---------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = u'Django'
epub_author = u'Django Software Foundation'
epub_publisher = u'Django Software Foundation'
epub_copyright = u'2010, Django Software Foundation'
# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
#epub_exclude_files = []
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True

View File

@ -19,7 +19,7 @@ What are Django's prerequisites?
--------------------------------
Django requires Python_, specifically any version of Python from 2.4
through 2.6. No other Python libraries are required for basic Django
through 2.7. No other Python libraries are required for basic Django
usage.
For a development environment -- if you just want to experiment with Django --

View File

@ -145,7 +145,11 @@ and time availability), claim it by following these steps:
* Claim the ticket by clicking the radio button next to "Accept ticket"
near the bottom of the page, then clicking "Submit changes."
If you have an account but have forgotten your password, you can reset it
using the `password reset page`_.
.. _Create an account: http://www.djangoproject.com/accounts/register/
.. _password reset page: http://www.djangoproject.com/accounts/password/reset/
Ticket claimers' responsibility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -15,6 +15,11 @@ __ http://docutils.sourceforge.net/
To actually build the documentation locally, you'll currently need to install
Sphinx -- ``easy_install Sphinx`` should do the trick.
.. note::
Generation of the Django documentation will work with Sphinx version 0.6
or newer, but we recommend going straigh to Sphinx 1.0 or newer.
Then, building the html is easy; just ``make html`` from the ``docs`` directory.
To get started contributing, you'll want to read the `ReStructuredText

View File

@ -474,17 +474,16 @@ change list page. By default, this is set to ``100``.
.. attribute:: ModelAdmin.list_select_related
Set ``list_select_related`` to tell Django to use ``select_related()`` in
retrieving the list of objects on the admin change list page. This can save you
a bunch of database queries.
Set ``list_select_related`` to tell Django to use
:meth:`~django.db.models.QuerySet.select_related` in retrieving the list of
objects on the admin change list page. This can save you a bunch of database
queries.
The value should be either ``True`` or ``False``. Default is ``False``.
Note that Django will use ``select_related()``, regardless of this setting,
if one of the ``list_display`` fields is a ``ForeignKey``.
For more on ``select_related()``, see
:ref:`the select_related() docs <select-related>`.
Note that Django will use :meth:`~django.db.models.QuerySet.select_related`,
regardless of this setting, if one of the ``list_display`` fields is a
``ForeignKey``.
.. attribute:: ModelAdmin.inlines
@ -595,11 +594,16 @@ This should be set to a list of field names that will be searched whenever
somebody submits a search query in that text box.
These fields should be some kind of text field, such as ``CharField`` or
``TextField``. You can also perform a related lookup on a ``ForeignKey`` with
the lookup API "follow" notation::
``TextField``. You can also perform a related lookup on a ``ForeignKey`` or
``ManyToManyField`` with the lookup API "follow" notation::
search_fields = ['foreign_key__related_fieldname']
For example, if you have a blog entry with an author, the following definition
would enable search blog entries by the email address of the author::
search_fields = ['user__email']
When somebody does a search in the admin search box, Django splits the search
query into words and returns all objects that contain each of the words, case
insensitive, where each word must be in at least one of ``search_fields``. For
@ -865,11 +869,26 @@ return a subset of objects for this foreign key field based on the user::
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "car":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return db_field.formfield(**kwargs)
return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
This uses the ``HttpRequest`` instance to filter the ``Car`` foreign key field
to only the cars owned by the ``User`` instance.
to only display the cars owned by the ``User`` instance.
.. method:: ModelAdmin.formfield_for_manytomany(self, db_field, request, **kwargs)
.. versionadded:: 1.1
Like the ``formfield_for_foreignkey`` method, the ``formfield_for_manytomany``
method can be overridden to change the default formfield for a many to many
field. For example, if an owner can own multiple cars and cars can belong
to multiple owners -- a many to many relationship -- you could filter the
``Car`` foreign key field to only display the cars owned by the ``User``::
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "cars":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
.. method:: ModelAdmin.queryset(self, request)
@ -1027,90 +1046,88 @@ The difference between these two is merely the template used to render them.
The ``InlineModelAdmin`` class is a subclass of ``ModelAdmin`` so it inherits
all the same functionality as well as some of its own:
``model``
~~~~~~~~~
.. attribute:: InlineModelAdmin.model
The model in which the inline is using. This is required.
The model in which the inline is using. This is required.
``fk_name``
~~~~~~~~~~~
.. attribute:: InlineModelAdmin.fk_name
The name of the foreign key on the model. In most cases this will be dealt
with automatically, but ``fk_name`` must be specified explicitly if there are
more than one foreign key to the same parent model.
The name of the foreign key on the model. In most cases this will be dealt
with automatically, but ``fk_name`` must be specified explicitly if there
are more than one foreign key to the same parent model.
``formset``
~~~~~~~~~~~
.. attribute:: InlineModelAdmin.formset
This defaults to ``BaseInlineFormSet``. Using your own formset can give you
many possibilities of customization. Inlines are built around
:ref:`model formsets <model-formsets>`.
This defaults to ``BaseInlineFormSet``. Using your own formset can give you
many possibilities of customization. Inlines are built around
:ref:`model formsets <model-formsets>`.
``form``
~~~~~~~~
.. attribute:: InlineModelAdmin.form
The value for ``form`` defaults to ``ModelForm``. This is what is
passed through to ``inlineformset_factory`` when creating the formset for this
inline.
The value for ``form`` defaults to ``ModelForm``. This is what is passed
through to ``inlineformset_factory`` when creating the formset for this
inline.
.. _ref-contrib-admin-inline-extra:
``extra``
~~~~~~~~~
.. attribute:: InlineModelAdmin.extra
This controls the number of extra forms the formset will display in addition
to the initial forms. See the
:ref:`formsets documentation <topics-forms-formsets>` for more information.
.. versionadded:: 1.2
This controls the number of extra forms the formset will display in addition
to the initial forms. See the
:ref:`formsets documentation <topics-forms-formsets>` for more information.
For users with JavaScript-enabled browsers, an "Add another" link is
provided to enable any number of additional inlines to be added in
addition to those provided as a result of the ``extra`` argument.
.. versionadded:: 1.2
The dynamic link will not appear if the number of currently displayed
forms exceeds ``max_num``, or if the user does not have JavaScript
enabled.
For users with JavaScript-enabled browsers, an "Add another" link is
provided to enable any number of additional inlines to be added in addition
to those provided as a result of the ``extra`` argument.
The dynamic link will not appear if the number of currently displayed forms
exceeds ``max_num``, or if the user does not have JavaScript enabled.
.. _ref-contrib-admin-inline-max-num:
``max_num``
~~~~~~~~~~~
.. attribute:: InlineModelAdmin.max_num
This controls the maximum number of forms to show in the inline. This doesn't
directly correlate to the number of objects, but can if the value is small
enough. See :ref:`model-formsets-max-num` for more information.
This controls the maximum number of forms to show in the inline. This
doesn't directly correlate to the number of objects, but can if the value
is small enough. See :ref:`model-formsets-max-num` for more information.
``raw_id_fields``
~~~~~~~~~~~~~~~~~
.. attribute:: InlineModelAdmin.raw_id_fields
By default, Django's admin uses a select-box interface (<select>) for
fields that are ``ForeignKey``. Sometimes you don't want to incur the
overhead of having to select all the related instances to display in the
drop-down.
By default, Django's admin uses a select-box interface (<select>) for
fields that are ``ForeignKey``. Sometimes you don't want to incur the
overhead of having to select all the related instances to display in the
drop-down.
``raw_id_fields`` is a list of fields you would like to change
into a ``Input`` widget for either a ``ForeignKey`` or ``ManyToManyField``::
``raw_id_fields`` is a list of fields you would like to change into a
``Input`` widget for either a ``ForeignKey`` or ``ManyToManyField``::
class BookInline(admin.TabularInline):
model = Book
raw_id_fields = ("pages",)
class BookInline(admin.TabularInline):
model = Book
raw_id_fields = ("pages",)
``template``
~~~~~~~~~~~~
The template used to render the inline on the page.
.. attribute:: InlineModelAdmin.template
``verbose_name``
~~~~~~~~~~~~~~~~
The template used to render the inline on the page.
An override to the ``verbose_name`` found in the model's inner ``Meta`` class.
.. attribute:: InlineModelAdmin.verbose_name
``verbose_name_plural``
~~~~~~~~~~~~~~~~~~~~~~~
An override to the ``verbose_name`` found in the model's inner ``Meta``
class.
.. attribute:: InlineModelAdmin.verbose_name_plural
An override to the ``verbose_name_plural`` found in the model's inner
``Meta`` class.
.. attribute:: InlineModelAdmin.can_delete
Specifies whether or not inline objects can be deleted in the inline.
Defaults to ``True``.
An override to the ``verbose_name_plural`` found in the model's inner ``Meta``
class.
Working with a model with two or more foreign keys to the same parent model
---------------------------------------------------------------------------

View File

@ -324,15 +324,19 @@ same types of lookups manually::
... object_id=b.id)
[<TaggedItem: django>, <TaggedItem: python>]
Note that if the model with a :class:`~django.contrib.contenttypes.generic.GenericForeignKey`
that you're referring to uses a non-default value for ``ct_field`` or ``fk_field``
(e.g. the :mod:`django.contrib.comments` app uses ``ct_field="object_pk"``),
you'll need to pass ``content_type_field`` and ``object_id_field`` to
:class:`~django.contrib.contenttypes.generic.GenericRelation`.::
Note that if the model in a
:class:`~django.contrib.contenttypes.generic.GenericRelation` uses a
non-default value for ``ct_field`` or ``fk_field`` in its
:class:`~django.contrib.contenttypes.generic.GenericForeignKey` (e.g. the
:mod:`django.contrib.comments` app uses ``ct_field="object_pk"``),
you'll need to set ``content_type_field`` and/or ``object_id_field`` in
the :class:`~django.contrib.contenttypes.generic.GenericRelation` to
match the ``ct_field`` and ``fk_field``, respectively, in the
:class:`~django.contrib.contenttypes.generic.GenericForeignKey`::
comments = generic.GenericRelation(Comment, content_type_field="content_type", object_id_field="object_pk")
comments = generic.GenericRelation(Comment, object_id_field="object_pk")
Note that if you delete an object that has a
Note also, that if you delete an object that has a
:class:`~django.contrib.contenttypes.generic.GenericRelation`, any objects
which have a :class:`~django.contrib.contenttypes.generic.GenericForeignKey`
pointing at it will be deleted as well. In the example above, this means that

View File

@ -189,8 +189,10 @@ for the wizard to work properly.
Hooking the wizard into a URLconf
=================================
Finally, give your new :class:`FormWizard` object a URL in ``urls.py``. The
wizard takes a list of your :class:`~django.forms.Form` objects as arguments::
Finally, we need to specify which forms to use in the wizard, and then
deploy the new :class:`FormWizard` object a URL in ``urls.py``. The
wizard takes a list of your :class:`~django.forms.Form` objects as
arguments when you instantiate the Wizard::
from django.conf.urls.defaults import *
from mysite.testapp.forms import ContactForm1, ContactForm2, ContactWizard

View File

@ -227,6 +227,11 @@ pretty-print the output with a number of indentation spaces.
The :djadminopt:`--exclude` option may be provided to prevent specific
applications from being dumped.
.. versionadded:: 1.3
The :djadminopt:`--exclude` option may also be provided to prevent specific
models (specified as in the form of ``appname.ModelName``) from being dumped.
.. versionadded:: 1.1
In addition to specifying application names, you can provide a list of
@ -957,6 +962,7 @@ that ``django-admin.py`` should print to the console.
* ``0`` means no output.
* ``1`` means normal output (default).
* ``2`` means verbose output.
* ``3`` means *very* verbose output.
Common options
==============

View File

@ -6,7 +6,7 @@ Widgets
.. module:: django.forms.widgets
:synopsis: Django's built-in form widgets.
.. currentmodule:: django.forms
A widget is Django's representation of a HTML input element. The widget
@ -29,7 +29,12 @@ commonly used groups of widgets:
.. attribute:: PasswordInput.render_value
Determines whether the widget will have a value filled in when the
form is re-displayed after a validation error (default is ``True``).
form is re-displayed after a validation error (default is ``False``).
.. versionchanged:: 1.3
The default value for
:attr:`~PasswordInput.render_value` was
changed from ``True`` to ``False``
.. class:: HiddenInput
@ -50,7 +55,7 @@ commonly used groups of widgets:
Date input as a simple text box: ``<input type='text' ...>``
Takes one optional argument:
.. attribute:: DateInput.format
The format in which this field's initial value will be displayed.
@ -64,11 +69,11 @@ commonly used groups of widgets:
Date/time input as a simple text box: ``<input type='text' ...>``
Takes one optional argument:
.. attribute:: DateTimeInput.format
The format in which this field's initial value will be displayed.
If no ``format`` argument is provided, the default format is ``'%Y-%m-%d
%H:%M:%S'``.
@ -77,11 +82,11 @@ commonly used groups of widgets:
Time input as a simple text box: ``<input type='text' ...>``
Takes one optional argument:
.. attribute:: TimeInput.format
The format in which this field's initial value will be displayed.
If no ``format`` argument is provided, the default format is ``'%H:%M:%S'``.
.. versionchanged:: 1.1
@ -98,15 +103,15 @@ commonly used groups of widgets:
Takes one optional argument:
.. attribute:: CheckboxInput.check_test
A callable that takes the value of the CheckBoxInput
A callable that takes the value of the CheckBoxInput
and returns ``True`` if the checkbox should be checked for
that value.
that value.
.. class:: Select
Select widget: ``<select><option ...>...</select>``
Requires that your field provides :attr:`~Field.choices`.
.. class:: NullBooleanSelect
@ -123,22 +128,22 @@ commonly used groups of widgets:
.. class:: RadioSelect
A list of radio buttons:
.. code-block:: html
<ul>
<li><input type='radio' ...></li>
...
</ul>
Requires that your field provides :attr:`~Field.choices`.
.. class:: CheckboxSelectMultiple
A list of checkboxes:
.. code-block:: html
<ul>
<li><input type='checkbox' ...></li>
...
@ -155,7 +160,7 @@ commonly used groups of widgets:
Takes two optional arguments, ``date_format`` and ``time_format``, which
work just like the ``format`` argument for ``DateInput`` and ``TimeInput``.
.. versionchanged:: 1.1
The ``date_format`` and ``time_format`` arguments were not supported in Django 1.0.

View File

@ -107,7 +107,7 @@ special key that is used for errors that are tied to the entire model instead
of to a specific field. You can access these errors with ``NON_FIELD_ERRORS``::
from django.core.validators import ValidationError, NON_FIELD_ERRORS
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
try:
article.full_clean()
except ValidationError, e:

View File

@ -332,8 +332,6 @@ a model which defines a default ordering, or when using
ordering was undefined prior to calling ``reverse()``, and will remain
undefined afterward).
.. _queryset-distinct:
``distinct()``
~~~~~~~~~~~~~~
@ -367,9 +365,6 @@ query spans multiple tables, it's possible to get duplicate results when a
``values()`` together, be careful when ordering by fields not in the
``values()`` call.
.. _queryset-values:
``values(*fields)``
~~~~~~~~~~~~~~~~~~~
@ -679,8 +674,6 @@ related object.
``OneToOneFields`` will not be traversed in the reverse direction if you
are performing a depth-based ``select_related``.
.. _queryset-extra:
``extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -843,8 +836,6 @@ of the arguments is required, but you should use at least one of them.
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
.. _queryset-defer:
``defer(*fields)``
~~~~~~~~~~~~~~~~~~
@ -1143,8 +1134,6 @@ Example::
If you pass ``in_bulk()`` an empty list, you'll get an empty dictionary.
.. _queryset-iterator:
``iterator()``
~~~~~~~~~~~~~~

View File

@ -498,11 +498,11 @@ Methods
.. method:: HttpResponse.__delitem__(header)
Deletes the header with the given name. Fails silently if the header
doesn't exist. Case-sensitive.
doesn't exist. Case-insensitive.
.. method:: HttpResponse.__getitem__(header)
Returns the value for the given header name. Case-sensitive.
Returns the value for the given header name. Case-insensitive.
.. method:: HttpResponse.has_header(header)

View File

@ -152,18 +152,6 @@ Default: ``600``
The default number of seconds to cache a page when the caching middleware or
``cache_page()`` decorator is used.
.. setting:: CSRF_COOKIE_NAME
CSRF_COOKIE_NAME
----------------
.. versionadded:: 1.2
Default: ``'csrftoken'``
The name of the cookie to use for the CSRF authentication token. This can be whatever you
want. See :ref:`ref-contrib-csrf`.
.. setting:: CSRF_COOKIE_DOMAIN
CSRF_COOKIE_DOMAIN
@ -179,6 +167,18 @@ request forgery protection. It should be set to a string such as
``".lawrence.com"`` to allow a POST request from a form on one subdomain to be
accepted by accepted by a view served from another subdomain.
.. setting:: CSRF_COOKIE_NAME
CSRF_COOKIE_NAME
----------------
.. versionadded:: 1.2
Default: ``'csrftoken'``
The name of the cookie to use for the CSRF authentication token. This can be whatever you
want. See :ref:`ref-contrib-csrf`.
.. setting:: CSRF_FAILURE_VIEW
CSRF_FAILURE_VIEW
@ -573,18 +573,6 @@ Default: ``'webmaster@localhost'``
Default e-mail address to use for various automated correspondence from the
site manager(s).
.. setting:: DEFAULT_TABLESPACE
DEFAULT_TABLESPACE
------------------
.. versionadded:: 1.0
Default: ``''`` (Empty string)
Default tablespace to use for models that don't specify one, if the
backend supports it.
.. setting:: DEFAULT_INDEX_TABLESPACE
DEFAULT_INDEX_TABLESPACE
@ -597,6 +585,18 @@ Default: ``''`` (Empty string)
Default tablespace to use for indexes on fields that don't specify
one, if the backend supports it.
.. setting:: DEFAULT_TABLESPACE
DEFAULT_TABLESPACE
------------------
.. versionadded:: 1.0
Default: ``''`` (Empty string)
Default tablespace to use for models that don't specify one, if the
backend supports it.
.. setting:: DISALLOWED_USER_AGENTS
DISALLOWED_USER_AGENTS
@ -738,21 +738,6 @@ Default: ``2621440`` (i.e. 2.5 MB).
The maximum size (in bytes) that an upload will be before it gets streamed to
the file system. See :ref:`topics-files` for details.
.. setting:: FILE_UPLOAD_TEMP_DIR
FILE_UPLOAD_TEMP_DIR
--------------------
.. versionadded:: 1.0
Default: ``None``
The directory to store data temporarily while uploading files. If ``None``,
Django will use the standard temporary directory for the operating system. For
example, this will default to '/tmp' on \*nix-style operating systems.
See :ref:`topics-files` for details.
.. setting:: FILE_UPLOAD_PERMISSIONS
FILE_UPLOAD_PERMISSIONS
@ -781,6 +766,21 @@ system's standard umask.
.. _documentation for os.chmod: http://docs.python.org/library/os.html#os.chmod
.. setting:: FILE_UPLOAD_TEMP_DIR
FILE_UPLOAD_TEMP_DIR
--------------------
.. versionadded:: 1.0
Default: ``None``
The directory to store data temporarily while uploading files. If ``None``,
Django will use the standard temporary directory for the operating system. For
example, this will default to '/tmp' on \*nix-style operating systems.
See :ref:`topics-files` for details.
.. setting:: FIRST_DAY_OF_WEEK
FIRST_DAY_OF_WEEK
@ -1227,27 +1227,6 @@ Default: ``'root@localhost'``
The e-mail address that error messages come from, such as those sent to
``ADMINS`` and ``MANAGERS``.
.. setting:: SESSION_ENGINE
SESSION_ENGINE
--------------
.. versionadded:: 1.0
.. versionchanged:: 1.1
The ``cached_db`` backend was added
Default: ``django.contrib.sessions.backends.db``
Controls where Django stores session data. Valid values are:
* ``'django.contrib.sessions.backends.db'``
* ``'django.contrib.sessions.backends.file'``
* ``'django.contrib.sessions.backends.cache'``
* ``'django.contrib.sessions.backends.cached_db'``
See :ref:`topics-http-sessions`.
.. setting:: SESSION_COOKIE_AGE
SESSION_COOKIE_AGE
@ -1306,6 +1285,27 @@ Whether to use a secure cookie for the session cookie. If this is set to
ensure that the cookie is only sent under an HTTPS connection.
See the :ref:`topics-http-sessions`.
.. setting:: SESSION_ENGINE
SESSION_ENGINE
--------------
.. versionadded:: 1.0
.. versionchanged:: 1.1
The ``cached_db`` backend was added
Default: ``django.contrib.sessions.backends.db``
Controls where Django stores session data. Valid values are:
* ``'django.contrib.sessions.backends.db'``
* ``'django.contrib.sessions.backends.file'``
* ``'django.contrib.sessions.backends.cache'``
* ``'django.contrib.sessions.backends.cached_db'``
See :ref:`topics-http-sessions`.
.. setting:: SESSION_EXPIRE_AT_BROWSER_CLOSE
SESSION_EXPIRE_AT_BROWSER_CLOSE
@ -1601,6 +1601,20 @@ A boolean that specifies whether to output the "Etag" header. This saves
bandwidth but slows down performance. This is only used if ``CommonMiddleware``
is installed (see :ref:`topics-http-middleware`).
.. setting:: USE_I18N
USE_I18N
--------
Default: ``True``
A boolean that specifies whether Django's internationalization system should be
enabled. This provides an easy way to turn it off, for performance. If this is
set to ``False``, Django will make some optimizations so as not to load the
internationalization machinery.
See also ``USE_L10N``
.. setting:: USE_L10N
USE_L10N
@ -1616,20 +1630,6 @@ format of the current locale.
See also ``USE_I18N`` and ``LANGUAGE_CODE``
.. setting:: USE_I18N
USE_I18N
--------
Default: ``True``
A boolean that specifies whether Django's internationalization system should be
enabled. This provides an easy way to turn it off, for performance. If this is
set to ``False``, Django will make some optimizations so as not to load the
internationalization machinery.
See also ``USE_L10N``
.. setting:: USE_THOUSAND_SEPARATOR
USE_THOUSAND_SEPARATOR

View File

@ -33,9 +33,9 @@ module system.
If you override these methods on your model, you must call the parent class'
methods for this signals to be sent.
Note also that Django stores signal handlers as weak references by default,
so if your handler is a local function, it may be garbage collected. To
prevent this, pass ``weak=False`` when you call the signal's :meth:`~django.dispatch.Signal.connect`.
Note also that Django stores signal handlers as weak references by default,
so if your handler is a local function, it may be garbage collected. To
prevent this, pass ``weak=False`` when you call the signal's :meth:`~django.dispatch.Signal.connect`.
pre_init
--------
@ -113,6 +113,9 @@ Arguments sent with this signal:
``instance``
The actual instance being saved.
``using``
The database alias being used.
post_save
---------
@ -133,6 +136,9 @@ Arguments sent with this signal:
``created``
A boolean; ``True`` if a new record was created.
``using``
The database alias being used.
pre_delete
----------
@ -150,6 +156,9 @@ Arguments sent with this signal:
``instance``
The actual instance being deleted.
``using``
The database alias being used.
post_delete
-----------
@ -170,6 +179,9 @@ Arguments sent with this signal:
Note that the object will no longer be in the database, so be very
careful what you do with this instance.
``using``
The database alias being used.
m2m_changed
-----------
@ -215,8 +227,8 @@ Arguments sent with this signal:
Sent *after* the relation is cleared
``reverse``
Indicates which side of the relation is updated (i.e., if it is the
forward or reverse relation that is being modified).
Indicates which side of the relation is updated (i.e., if it is the
forward or reverse relation that is being modified).
``model``
The class of the objects that are added to, removed from or cleared
@ -228,6 +240,9 @@ Arguments sent with this signal:
For the ``"clear"`` action, this is ``None``.
``using``
The database alias being used.
For example, if a ``Pizza`` can have multiple ``Topping`` objects, modeled
like this:
@ -266,6 +281,8 @@ the arguments sent to a :data:`m2m_changed` handler would be:
``Pizza``)
``pk_set`` ``[t.id]`` (since only ``Topping t`` was added to the relation)
``using`` ``"default"`` (since the default router sends writes here)
============== ============================================================
And if we would then do something like this:
@ -293,6 +310,8 @@ the arguments sent to a :data:`m2m_changed` handler would be:
``pk_set`` ``[p.id]`` (since only ``Pizza p`` was removed from the
relation)
``using`` ``"default"`` (since the default router sends writes here)
============== ============================================================
class_prepared

View File

@ -1883,6 +1883,8 @@ For example::
If ``value`` is ``"Joel is a slug"``, the output will be ``"Joel is ..."``.
Newlines within the string will be removed.
.. templatefilter:: truncatewords_html
truncatewords_html
@ -1902,6 +1904,8 @@ For example::
If ``value`` is ``"<p>Joel is a slug</p>"``, the output will be
``"<p>Joel is ...</p>"``.
Newlines in the HTML content will be preserved.
.. templatefilter:: unordered_list
unordered_list

View File

@ -71,8 +71,9 @@ processing to convert them to Python objects. If you know you don't need those
particular fields, you can now tell Django not to retrieve them from the
database.
You'll do this with the :ref:`new queryset methods <queryset-defer>`
``defer()`` and ``only()``.
You'll do this with the new queryset methods
:meth:`~django.db.models.QuerySet.defer` and
:meth:`~django.db.models.QuerySet.only`.
New admin features
------------------
@ -108,13 +109,13 @@ A couple of small but very useful improvements have been made to the
* The test :class:`Client` now can automatically follow redirects with the
``follow`` argument to :meth:`Client.get` and :meth:`Client.post`. This
makes testing views that issue redirects simpler.
* It's now easier to get at the template context in the response returned
the test client: you'll simply access the context as
``request.context[key]``. The old way, which treats ``request.context``
as a list of contexts, one for each rendered template, is still
available if you need it.
Conditional view processing
---------------------------
@ -133,23 +134,23 @@ release, including:
* The :djadmin:`dumpdata` management command now accepts individual
model names as arguments, allowing you to export the data just from
particular models.
* There's a new :tfilter:`safeseq` template filter which works just like
:tfilter:`safe` for lists, marking each item in the list as safe.
* :ref:`Cache backends <topics-cache>` now support ``incr()`` and
``decr()`` commands to increment and decrement the value of a cache key.
On cache backends that support atomic increment/decrement -- most
notably, the memcached backend -- these operations will be atomic, and
quite fast.
* Django now can :ref:`easily delegate authentication to the web server
<howto-auth-remote-user>` via a new authentication backend that supports
the standard ``REMOTE_USER`` environment variable used for this purpose.
* There's a new :func:`django.shortcuts.redirect` function that makes it
easier to issue redirects given an object, a view name, or a URL.
* The ``postgresql_psycopg2`` backend now supports :ref:`native PostgreSQL
autocommit <postgresql-notes>`. This is an advanced, PostgreSQL-specific
feature, that can make certain read-heavy applications a good deal
@ -183,7 +184,7 @@ central place to search for open issues:
* http://code.djangoproject.com/timeline
Please open new tickets if no existing ticket corresponds to a problem you're
running into.
running into.
Additionally, discussion of Django development, including progress toward the
1.1 release, takes place daily on the django-developers mailing list:
@ -195,7 +196,7 @@ interested in helping out with Django's development, feel free to join the
discussions there.
Django's online documentation also includes pointers on how to contribute to
Django:
Django:
* :ref:`How to contribute to Django <internals-contributing>`

View File

@ -258,8 +258,9 @@ processing to convert them to Python objects. If you know you don't need those
particular fields, you can now tell Django not to retrieve them from the
database.
You'll do this with the :ref:`new queryset methods <queryset-defer>`
``defer()`` and ``only()``.
You'll do this with the new queryset methods
:meth:`~django.db.models.QuerySet.defer` and
:meth:`~django.db.models.QuerySet.only`.
Testing improvements
--------------------

View File

@ -18,6 +18,31 @@ fixes and an easy upgrade path from Django 1.2.
Backwards-incompatible changes in 1.3
=====================================
PasswordInput default rendering behavior
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prior to Django 1.3, a :class:`~django.forms.PasswordInput` would render
data values like any other form. If a form submission raised an error,
the password that was submitted would be reflected to the client as form
data populating the form for resubmission.
This had the potential to leak passwords, as any failed password
attempt would cause the password that was typed to be sent back to the
client.
In Django 1.3, the default behavior of
:class:`~django.forms.PasswordInput` is to suppress the display of
password values. This change doesn't alter the way form data is
validated or handled. It only affects the user experience with
passwords on a form when they make an error submitting form data (such
as on unsuccessful logins, or when completing a registration form).
If you want restore the pre-Django 1.3 behavior, you need to pass in a
custom widget to your form that sets the ``render_value`` argument::
class LoginForm(forms.Form):
username = forms.CharField(max_length=100)
password = forms.PasswordField(widget=forms.PasswordInput(render_value=True))
Features deprecated in 1.3

Some files were not shown because too many files have changed in this diff Show More