diff --git a/AUTHORS b/AUTHORS
index bfaf6db6ca..7ee19bae66 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -95,6 +95,7 @@ answer newbie questions, and generally made Django that much better:
Sengtha Chay
ivan.chelubeev@gmail.com
Bryan Chow
+ Antonis Christofides
Michal Chruszcz
Can Burak Çilingir
Ian Clelland
@@ -195,6 +196,7 @@ answer newbie questions, and generally made Django that much better:
jcrasta@gmail.com
jdetaeye
Zak Johnson
+ Nis Jørgensen
Michael Josephson
jpellerin@gmail.com
junzhang.jn@gmail.com
diff --git a/django/conf/locale/mk/LC_MESSAGES/django.mo b/django/conf/locale/mk/LC_MESSAGES/django.mo
index 21e3ff7c5d..6dfd651e76 100644
Binary files a/django/conf/locale/mk/LC_MESSAGES/django.mo and b/django/conf/locale/mk/LC_MESSAGES/django.mo differ
diff --git a/django/conf/locale/mk/LC_MESSAGES/django.po b/django/conf/locale/mk/LC_MESSAGES/django.po
index c28d098515..5e531a4d12 100644
--- a/django/conf/locale/mk/LC_MESSAGES/django.po
+++ b/django/conf/locale/mk/LC_MESSAGES/django.po
@@ -1,12 +1,12 @@
# translation of django.po to Macedonian
#
-# Georgi Stanojevski , 2006, 2007.
+# Georgi Stanojevski , 2006, 2007, 2008.
msgid ""
msgstr ""
-"Project-Id-Version: Django\n"
+"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-04-07 19:51+0200\n"
-"PO-Revision-Date: 2007-04-07 20:29+0200\n"
+"POT-Creation-Date: 2008-06-18 12:26+0200\n"
+"PO-Revision-Date: 2008-06-28 16:36+0200\n"
"Last-Translator: Georgi Stanojevski \n"
"Language-Team: Macedonian \n"
"MIME-Version: 1.0\n"
@@ -15,750 +15,195 @@ msgstr ""
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: db/models/manipulators.py:307
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s од овој тип %(type)s веќе постои за даденото %(field)s."
-
-#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
-#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
-msgid "and"
-msgstr "и"
-
-#: db/models/fields/related.py:53
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Ве молам внесете правилно %s."
-
-#: db/models/fields/related.py:642
-msgid "Separate multiple IDs with commas."
-msgstr "Одвојте ги идентификационите броеви со запирки."
-
-#: db/models/fields/related.py:644
-msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr "Држете го „Control“ или „Command“ на Мекинтош за да изберете повеќе од едно."
-
-#: db/models/fields/related.py:691
-#, python-format
-msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
-msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] ""
-"Ве молам внесете правилен %(self)s идентификацион број. Оваа вредност %"
-"(value)r е неправилна."
-msgstr[1] ""
-"Ве молам внесете правилен %(self)s идентификацион број. Вредностите %(value)"
-"r се неправилни."
-
-#: db/models/fields/__init__.py:42
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s со ова %(fieldname)s веќе постои."
-
-#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
-#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
-#: oldforms/__init__.py:357 newforms/fields.py:80 newforms/fields.py:376
-#: newforms/fields.py:452 newforms/fields.py:463 newforms/models.py:178
-msgid "This field is required."
-msgstr "Ова поле е задолжително."
-
-#: db/models/fields/__init__.py:367
-msgid "This value must be an integer."
-msgstr "Оваа вредност мора да биде цел број."
-
-#: db/models/fields/__init__.py:402
-msgid "This value must be either True or False."
-msgstr "Оваа вредност мора да биде или точно или неточно."
-
-#: db/models/fields/__init__.py:423
-msgid "This field cannot be null."
-msgstr "Оваа вредност неможе да биде null."
-
-#: db/models/fields/__init__.py:457 core/validators.py:148
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Внесете правилен датум во форматот ГГГГ-ММ-ДД."
-
-#: db/models/fields/__init__.py:526 core/validators.py:157
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Внесете правилен датум/време во форматот ГГГГ-ММ-ДД ЧЧ:ММ."
-
-#: db/models/fields/__init__.py:630
-msgid "Enter a valid filename."
-msgstr "Внесите правилно име на датотека."
-
-#: db/models/fields/__init__.py:751
-msgid "This value must be either None, True or False."
-msgstr "Оваа вредност мора да биде празна, точно или неточно."
-
-#: conf/global_settings.py:39
+#: conf/global_settings.py:44
msgid "Arabic"
msgstr "Арапски"
-#: conf/global_settings.py:40
+#: conf/global_settings.py:45
msgid "Bengali"
msgstr "Бенгалски"
-#: conf/global_settings.py:41
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Бугарски"
+
+#: conf/global_settings.py:47
msgid "Catalan"
msgstr "Каталански"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:48
msgid "Czech"
msgstr "Чешки"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:49
msgid "Welsh"
msgstr "Велшки"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:50
msgid "Danish"
msgstr "Дански"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:51
msgid "German"
msgstr "Германски"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:52
msgid "Greek"
msgstr "Грчки"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:53
msgid "English"
msgstr "Англиски"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:54
msgid "Spanish"
msgstr "Шпански"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:55
msgid "Argentinean Spanish"
msgstr "Аргентиско шпански"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:56
+msgid "Basque"
+msgstr "Баскиски"
+
+#: conf/global_settings.py:57
+msgid "Persian"
+msgstr "Персиски"
+
+#: conf/global_settings.py:58
msgid "Finnish"
msgstr "Фински"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:59
msgid "French"
msgstr "Француски"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:60
+msgid "Irish"
+msgstr "Ирски"
+
+#: conf/global_settings.py:61
msgid "Galician"
msgstr "Галски"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:62
msgid "Hungarian"
msgstr "Унгарски"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:63
msgid "Hebrew"
msgstr "Еврејски"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:64
+msgid "Croatian"
+msgstr "Хрватски"
+
+#: conf/global_settings.py:65
msgid "Icelandic"
msgstr "Исландски"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:66
msgid "Italian"
msgstr "Италијански"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:67
msgid "Japanese"
msgstr "Јапонски"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:68
+msgid "Georgian"
+msgstr "Грузиски"
+
+#: conf/global_settings.py:69
+msgid "Korean"
+msgstr "Корејски"
+
+#: conf/global_settings.py:70
+msgid "Khmer"
+msgstr "Кмер"
+
+#: conf/global_settings.py:71
msgid "Kannada"
msgstr "Канада"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:72
msgid "Latvian"
msgstr "Латвиски"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:73
msgid "Macedonian"
msgstr "Македонски"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:74
msgid "Dutch"
msgstr "Холандски"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:75
msgid "Norwegian"
msgstr "Норвешки"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:76
msgid "Polish"
msgstr "Полски"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:77
msgid "Portugese"
msgstr "Португалкски"
-#: conf/global_settings.py:65
-msgid "Brazilian"
-msgstr "Бразилски"
+#: conf/global_settings.py:78
+msgid "Brazilian Portuguese"
+msgstr "Бразилско португалски"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:79
msgid "Romanian"
msgstr "Романски"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:80
msgid "Russian"
msgstr "Руски"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:81
msgid "Slovak"
msgstr "Словачки"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:82
msgid "Slovenian"
msgstr "Словенечки"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:83
msgid "Serbian"
msgstr "Српски"
-#: conf/global_settings.py:71
+#: conf/global_settings.py:84
msgid "Swedish"
msgstr "Шведски"
-#: conf/global_settings.py:72
+#: conf/global_settings.py:85
msgid "Tamil"
msgstr "Тамил"
-#: conf/global_settings.py:73
+#: conf/global_settings.py:86
msgid "Telugu"
msgstr "Телугу"
-#: conf/global_settings.py:74
+#: conf/global_settings.py:87
msgid "Turkish"
msgstr "Турски"
-#: conf/global_settings.py:75
+#: conf/global_settings.py:88
msgid "Ukrainian"
msgstr "Украински"
-#: conf/global_settings.py:76
+#: conf/global_settings.py:89
msgid "Simplified Chinese"
msgstr "Упростен кинески"
-#: conf/global_settings.py:77
+#: conf/global_settings.py:90
msgid "Traditional Chinese"
msgstr "Традиционален кинески"
-#: core/validators.py:64
-msgid "This value must contain only letters, numbers and underscores."
-msgstr "Оваа вредност смее да има само букви, бројки или долни црти."
-
-#: core/validators.py:68
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr "Оваа вредност смее да има само букви, бројки, долни црти, црти или коси црти."
-
-#: core/validators.py:72
-msgid "This value must contain only letters, numbers, underscores or hyphens."
-msgstr "Оваа вредност смее да содржи само букви, бројки, долни црти или црти."
-
-#: core/validators.py:76
-msgid "Uppercase letters are not allowed here."
-msgstr "Големи букви не се дозволени."
-
-#: core/validators.py:80
-msgid "Lowercase letters are not allowed here."
-msgstr "Мали букви не се дозволени."
-
-#: core/validators.py:87
-msgid "Enter only digits separated by commas."
-msgstr "Внесете само цифри одделени со запирки."
-
-#: core/validators.py:99
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Внесете валидни адреси за е-пошта одделени со запирки."
-
-#: core/validators.py:103
-msgid "Please enter a valid IP address."
-msgstr "Ве молам внесете валидна ИП адреса."
-
-#: core/validators.py:107
-msgid "Empty values are not allowed here."
-msgstr "Празни вредности не се дозволени."
-
-#: core/validators.py:111
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Ненумерички знаци не се дозволени тука."
-
-#: core/validators.py:115
-msgid "This value can't be comprised solely of digits."
-msgstr "Оваа вредност не смее да биде само од цифри."
-
-#: core/validators.py:120 newforms/fields.py:128
-msgid "Enter a whole number."
-msgstr "Внеси цел број."
-
-#: core/validators.py:124
-msgid "Only alphabetical characters are allowed here."
-msgstr "Дозволени се само букви."
-
-#: core/validators.py:139
-msgid "Year must be 1900 or later."
-msgstr "Годината мора да биде 1900 или покасно."
-
-#: core/validators.py:143
-#, python-format
-msgid "Invalid date: %s"
-msgstr "Неправилен датум: %s"
-
-#: core/validators.py:153
-msgid "Enter a valid time in HH:MM format."
-msgstr "Внесете правилно време во форматот HH:MM."
-
-#: core/validators.py:162 newforms/fields.py:271
-msgid "Enter a valid e-mail address."
-msgstr "Внесeте правилна адреса за е-пошта."
-
-#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
-msgid "No file was submitted. Check the encoding type on the form."
-msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата."
-
-#: core/validators.py:178
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Качете валидна фотографија. Датотеката која ја качивте или не беше "
-"фотографија или беше расипана датотеката."
-
-#: core/validators.py:185
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "Адресата %s не покажува кон валидна фотографија."
-
-#: core/validators.py:189
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Телефонските броеви мора да бидат во XXX-XXX-XXXX форматот. „%s“ не е "
-"валиден."
-
-#: core/validators.py:197
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "Адресата „%s“ не покажува кон QuickTime видео."
-
-#: core/validators.py:201
-msgid "A valid URL is required."
-msgstr "Задолжителна е правилна адреса."
-
-#: core/validators.py:215
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Задолжителен е правилен HTML. Грешките се:\n"
-"%s"
-
-#: core/validators.py:222
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "Неправилно формиран XML: %s"
-
-#: core/validators.py:239
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "Неправилна адреса: %s"
-
-#: core/validators.py:244 core/validators.py:246
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "Адресата %s е скршена врска."
-
-#: core/validators.py:252
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Внесете правилна скратеница за држава во САД."
-
-#: core/validators.py:266
-#, python-format
-msgid "Watch your mouth! The word %s is not allowed here."
-msgid_plural "Watch your mouth! The words %s are not allowed here."
-msgstr[0] "Внимавајте на јазикот. Тука не е дозволен зборот %s."
-msgstr[1] "Внимавајте на јазикот. Тука не се дозволени зборовите %s."
-
-#: core/validators.py:273
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Ова поле мора да соодејствува со полето „%s“."
-
-#: core/validators.py:292
-msgid "Please enter something for at least one field."
-msgstr "Ве молам внесете нешто во барем едно поле."
-
-#: core/validators.py:301 core/validators.py:312
-msgid "Please enter both fields or leave them both empty."
-msgstr "Ве молам внесете во двете полиња или оставете ги двете празни."
-
-#: core/validators.py:320
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Ова поле мора да биде зададено ако %(field)s е %(value)s"
-
-#: core/validators.py:333
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Ова поле мора да биде зададено ако %(field)s не е %(value)s"
-
-#: core/validators.py:352
-msgid "Duplicate values are not allowed."
-msgstr "Дупликат вредности не се дозволени."
-
-#: core/validators.py:367
-#, python-format
-msgid "This value must be between %(lower)s and %(upper)s."
-msgstr "Оваа вредноста мора да биде помеѓу %(lower)s и %(upper)s."
-
-#: core/validators.py:369
-#, python-format
-msgid "This value must be at least %s."
-msgstr "Оваа вредноста мора да биде најмалку %s."
-
-#: core/validators.py:371
-#, python-format
-msgid "This value must be no more than %s."
-msgstr "Оваа вредност не смее да биде поголема од %s."
-
-#: core/validators.py:407
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Оваа вредноста мора да биде степен од %s."
-
-#: core/validators.py:418
-msgid "Please enter a valid decimal number."
-msgstr "Ве молам внесете правилен децимален број."
-
-#: core/validators.py:422
-#, python-format
-msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural "Please enter a valid decimal number with at most %s total digits."
-msgstr[0] "Ве молам внесете правилен децимален број со најмногу %s цифрa."
-msgstr[1] "Ве молам внесете правилен децимален број со најмногу %s вкупно цифри."
-
-#: core/validators.py:425
-#, python-format
-msgid "Please enter a valid decimal number with a whole part of at most %s digit."
-msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
-msgstr[0] ""
-"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s "
-"цифра."
-msgstr[1] ""
-"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s "
-"цифри."
-
-#: core/validators.py:428
-#, python-format
-msgid "Please enter a valid decimal number with at most %s decimal place."
-msgid_plural "Please enter a valid decimal number with at most %s decimal places."
-msgstr[0] "Ве молам внесете правилен децимален број кој има најмногу %s децимална цифра."
-msgstr[1] "Ве молам внесете правилен децимален број кој има најмногу %s децимални цифри."
-
-#: core/validators.py:438
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Потврдете дека качената датотека има најмалку %s бајти."
-
-#: core/validators.py:439
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Потврдете дека качената датотека има најмногу %s бајти."
-
-#: core/validators.py:456
-msgid "The format for this field is wrong."
-msgstr "Форматот за ова поле е грешен."
-
-#: core/validators.py:471
-msgid "This field is invalid."
-msgstr "Ова поле не е правилно."
-
-#: core/validators.py:507
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Неможев да извадам ништо од %s."
-
-#: core/validators.py:510
-#, python-format
-msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr "Адресата %(url)s врати неправилно заглавје Content-Type „%(contenttype)s“."
-
-#: core/validators.py:543
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Ве молам затворете го отворениот %(tag)s таг од линијата %(line)s. (линијата "
-"почнува со „%(start)s“.)"
-
-#: core/validators.py:547
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Некој текст кој почнува на линијата %(line)s не е дозволен во тој контекст. "
-"(Линијата започнува со „%(start)s“.)"
-
-#: core/validators.py:552
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"„%(attr)s“ на линија %(line)s е неправилен атрибут. (линијата започнува со „%"
-"(start)s“.)"
-
-#: core/validators.py:557
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"„<%(tag)s>“ на линија %(line)s е неправилен таг. (линијата започнува со „%"
-"(start)s“.)"
-
-#: core/validators.py:561
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"На таг од линијата %(line)s му недостасува еден или повеќе од потребните "
-"атрибути (линијата започнува со „%(start)s“)."
-
-#: core/validators.py:566
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Атрибутот „%(attr)s“ на линијата %(line)s има неправилна вредност (линијата "
-"започнува со „%(start)s“)."
-
-#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
-msgid "The two password fields didn't match."
-msgstr "Двете полиња со лозинките не се совпаѓаат."
-
-#: contrib/auth/forms.py:25
-msgid "A user with that username already exists."
-msgstr "Веќе постои корисник со тоа корисничко име."
-
-#: contrib/auth/forms.py:53
-msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-"Не изгледа дека вашиот прелистувач има овозможено колачиња. Колачињата се "
-"потребни за да се најавите."
-
-#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Ве молам внесете точно корисничко име и лозинка. Имајте на ум дека и во "
-"двете полиња се битни големите и малите букви."
-
-#: contrib/auth/forms.py:62
-msgid "This account is inactive."
-msgstr "Оваа сметка е неактивна."
-
-#: contrib/auth/forms.py:85
-msgid ""
-"That e-mail address doesn't have an associated user account. Are you sure "
-"you've registered?"
-msgstr ""
-"Нема регистрирано корисник со оваа адреса за е-пошта. Сигурни ли сте дека "
-"сте регистрирани?"
-
-#: contrib/auth/forms.py:117
-msgid "The two 'new password' fields didn't match."
-msgstr "Двете нови лозинки не се совпаѓаат."
-
-#: contrib/auth/forms.py:124
-msgid "Your old password was entered incorrectly. Please enter it again."
-msgstr "Не ја внесовте точно вашата стара лозинка. Ве молам внесете ја повторно."
-
-#: contrib/auth/models.py:38 contrib/auth/models.py:58
-msgid "name"
-msgstr "име"
-
-#: contrib/auth/models.py:40
-msgid "codename"
-msgstr "кодно име"
-
-#: contrib/auth/models.py:43
-msgid "permission"
-msgstr "привилегија"
-
-#: contrib/auth/models.py:44 contrib/auth/models.py:59
-msgid "permissions"
-msgstr "привилегии"
-
-#: contrib/auth/models.py:62
-msgid "group"
-msgstr "група"
-
-#: contrib/auth/models.py:63 contrib/auth/models.py:103
-msgid "groups"
-msgstr "групи"
-
-#: contrib/auth/models.py:93
-msgid "username"
-msgstr "корисничко име"
-
-#: contrib/auth/models.py:93
-msgid ""
-"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
-"digits and underscores)."
-msgstr ""
-"Дозволени се најмногу 30 знаци. Дозволени се само алфанумерички знаци "
-"(букви, цифри и долна црта)."
-
-#: contrib/auth/models.py:94
-msgid "first name"
-msgstr "име"
-
-#: contrib/auth/models.py:95
-msgid "last name"
-msgstr "презиме"
-
-#: contrib/auth/models.py:96
-msgid "e-mail address"
-msgstr "е-пошта"
-
-#: contrib/auth/models.py:97
-msgid "password"
-msgstr "лозинка"
-
-#: contrib/auth/models.py:97
-msgid ""
-"Use '[algo]$[salt]$[hexdigest]' or use the change "
-"password form."
-msgstr ""
-"Користете '[algo]$[salt]$[hexdigest]' или користете ја формата за промена на лозинката."
-
-#: contrib/auth/models.py:98
-msgid "staff status"
-msgstr "статус на администраторите"
-
-#: contrib/auth/models.py:98
-msgid "Designates whether the user can log into this admin site."
-msgstr "Означува дали корисникот може да се логира во сајтот за администрација."
-
-#: contrib/auth/models.py:99
-msgid "active"
-msgstr "активен"
-
-#: contrib/auth/models.py:99
-msgid ""
-"Designates whether this user can log into the Django admin. Unselect this "
-"instead of deleting accounts."
-msgstr ""
-"Означува дали корисникот може да се логира. Одштиклирајте го ова наместо да "
-"бришете корисници."
-
-#: contrib/auth/models.py:100
-msgid "superuser status"
-msgstr "статус на суперкорисник"
-
-#: contrib/auth/models.py:100
-msgid ""
-"Designates that this user has all permissions without explicitly assigning "
-"them."
-msgstr ""
-"Означува дека овој корисник ги има сите привилегии без експлицитно да се "
-"доделуваат сите."
-
-#: contrib/auth/models.py:101
-msgid "last login"
-msgstr "последна најава"
-
-#: contrib/auth/models.py:102
-msgid "date joined"
-msgstr "датум на зачленување"
-
-#: contrib/auth/models.py:104
-msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
-msgstr ""
-"Како дополнување на рачно доделени привилегии, овој корисник ќе ги добие "
-"автоматски и сите привилегии за секоја група во која тој/таа членува."
-
-#: contrib/auth/models.py:105
-msgid "user permissions"
-msgstr "кориснички привилегии"
-
-#: contrib/auth/models.py:109
-msgid "user"
-msgstr "корисник"
-
-#: contrib/auth/models.py:110
-msgid "users"
-msgstr "корисници"
-
-#: contrib/auth/models.py:116
-msgid "Personal info"
-msgstr "Лични информации"
-
-#: contrib/auth/models.py:117
-msgid "Permissions"
-msgstr "Привилегии"
-
-#: contrib/auth/models.py:118
-msgid "Important dates"
-msgstr "Важни датуми"
-
-#: contrib/auth/models.py:119
-msgid "Groups"
-msgstr "Групи"
-
-#: contrib/auth/models.py:263
-msgid "message"
-msgstr "порака"
-
-#: contrib/auth/views.py:39
-msgid "Logged out"
-msgstr "Одјавен"
-
-#: contrib/admin/models.py:16
-msgid "action time"
-msgstr "време на акција"
-
-#: contrib/admin/models.py:19
-msgid "object id"
-msgstr "идентификационен број на објект"
-
-#: contrib/admin/models.py:20
-msgid "object repr"
-msgstr "object repr"
-
-#: contrib/admin/models.py:21
-msgid "action flag"
-msgstr "знакче за акција"
-
-#: contrib/admin/models.py:22
-msgid "change message"
-msgstr "измени ја пораката"
-
-#: contrib/admin/models.py:25
-msgid "log entry"
-msgstr "ставка во записникот"
-
-#: contrib/admin/models.py:26
-msgid "log entries"
-msgstr "ставки во записникот"
-
-#: contrib/admin/filterspecs.py:40
+#: contrib/admin/filterspecs.py:44
#, python-format
msgid ""
"
By %s:
\n"
@@ -767,433 +212,73 @@ msgstr ""
"
Од %s:
\n"
"
\n"
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
msgid "All"
msgstr "Сите"
-#: contrib/admin/filterspecs.py:109
+#: contrib/admin/filterspecs.py:113
msgid "Any date"
msgstr "Било кој датум"
-#: contrib/admin/filterspecs.py:110
+#: contrib/admin/filterspecs.py:114
msgid "Today"
msgstr "Денеска"
-#: contrib/admin/filterspecs.py:113
+#: contrib/admin/filterspecs.py:117
msgid "Past 7 days"
msgstr "Последните 7 дена"
-#: contrib/admin/filterspecs.py:115
+#: contrib/admin/filterspecs.py:119
msgid "This month"
msgstr "Овој месец"
-#: contrib/admin/filterspecs.py:117
+#: contrib/admin/filterspecs.py:121
msgid "This year"
msgstr "Оваа година"
-#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:577
-#: newforms/widgets.py:174
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
msgid "Yes"
msgstr "Да"
-#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:577
-#: newforms/widgets.py:174
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
msgid "No"
msgstr "Не"
-#: contrib/admin/filterspecs.py:150 oldforms/__init__.py:577
-#: newforms/widgets.py:174
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
msgid "Unknown"
msgstr "Непознато"
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Најава"
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "време на акција"
-#: contrib/admin/views/decorators.py:62
-msgid ""
-"Please log in again, because your session has expired. Don't worry: Your "
-"submission has been saved."
-msgstr ""
-"Ве молам најавете се повторно бидејќи вашата сесија е истечена. Не се "
-"грижете. Вашите внесови беа зачувани."
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "идентификационен број на објект"
-#: contrib/admin/views/decorators.py:69
-msgid ""
-"Looks like your browser isn't configured to accept cookies. Please enable "
-"cookies, reload this page, and try again."
-msgstr ""
-"Изгледа дека вашиот прелистувач не е конфигуриран да прифаќа колачиња. Ве "
-"молам овозможете ги колачињата, превчитајте ја страта и пробајте повторно."
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "object repr"
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
-msgstr "Корисничките имиња неможе да го содржат „@“ знакот."
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "знакче за акција"
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Вашата е-пошта не е вашето корисничко име. Пробајте со „%s“."
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "измени ја пораката"
-#: contrib/admin/views/main.py:223
-msgid "Site administration"
-msgstr "Администрација на сајт"
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "ставка во записникот"
-#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)s \"%(obj)s\" беше успешно додаден."
-
-#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
-#: contrib/admin/views/auth.py:24
-msgid "You may edit it again below."
-msgstr "Подолу можете повторно да го уредите."
-
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
-#, python-format
-msgid "You may add another %s below."
-msgstr "Подолу можете да додате уште еден %s."
-
-#: contrib/admin/views/main.py:289
-#, python-format
-msgid "Add %s"
-msgstr "Додади %s"
-
-#: contrib/admin/views/main.py:335
-#, python-format
-msgid "Added %s."
-msgstr "Додадено %s."
-
-#: contrib/admin/views/main.py:337
-#, python-format
-msgid "Changed %s."
-msgstr "Изменета %s."
-
-#: contrib/admin/views/main.py:339
-#, python-format
-msgid "Deleted %s."
-msgstr "Избришана %s."
-
-#: contrib/admin/views/main.py:342
-msgid "No fields changed."
-msgstr "Не беше изменето ниедно поле."
-
-#: contrib/admin/views/main.py:345
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" беше успешно изменета."
-
-#: contrib/admin/views/main.py:353
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr ""
-"%(name)s \"%(obj)s\" беше успешно додадена.Подолу можете повторно да ја "
-"уредите."
-
-#: contrib/admin/views/main.py:391
-#, python-format
-msgid "Change %s"
-msgstr "Измени %s"
-
-#: contrib/admin/views/main.py:476
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Еден или повеќе %(fieldname)s во %(name)s: %(obj)s"
-
-#: contrib/admin/views/main.py:481
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Еден или повеќе %(fieldname)s во %(name)s:"
-
-#: contrib/admin/views/main.py:514
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "%(name)s \"%(obj)s\" беше избришана успешно."
-
-#: contrib/admin/views/main.py:517
-msgid "Are you sure?"
-msgstr "Сигурни сте?"
-
-#: contrib/admin/views/main.py:539
-#, python-format
-msgid "Change history: %s"
-msgstr "Историја на измени: %s"
-
-#: contrib/admin/views/main.py:573
-#, python-format
-msgid "Select %s"
-msgstr "Изберет %s"
-
-#: contrib/admin/views/main.py:573
-#, python-format
-msgid "Select %s to change"
-msgstr "Изберете %s за измена"
-
-#: contrib/admin/views/main.py:768
-msgid "Database error"
-msgstr "Грешка во базата со податоци"
-
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
-msgid "tag:"
-msgstr "таг:"
-
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
-msgid "filter:"
-msgstr "филтер:"
-
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
-msgid "view:"
-msgstr "поглед:"
-
-#: contrib/admin/views/doc.py:164
-#, python-format
-msgid "App %r not found"
-msgstr "Не е најдена апликацијата %r"
-
-#: contrib/admin/views/doc.py:171
-#, python-format
-msgid "Model %(name)r not found in app %(label)r"
-msgstr "Моделот %(name)r не е најден во апликацијата %(label)r"
-
-#: contrib/admin/views/doc.py:183
-#, python-format
-msgid "the related `%(label)s.%(type)s` object"
-msgstr "поврзаниот`%(label)s.%(type)s` објект"
-
-#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
-#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
-msgid "model:"
-msgstr "модел:"
-
-#: contrib/admin/views/doc.py:214
-#, python-format
-msgid "related `%(label)s.%(name)s` objects"
-msgstr "поврзани `%(label)s.%(name)s` објекти"
-
-#: contrib/admin/views/doc.py:219
-#, python-format
-msgid "all %s"
-msgstr "сите %s"
-
-#: contrib/admin/views/doc.py:224
-#, python-format
-msgid "number of %s"
-msgstr "број на %s"
-
-#: contrib/admin/views/doc.py:229
-#, python-format
-msgid "Fields on %s objects"
-msgstr "Полиња на %s објекти"
-
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
-#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
-#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
-msgid "Integer"
-msgstr "Цел број"
-
-#: contrib/admin/views/doc.py:292
-msgid "Boolean (Either True or False)"
-msgstr "Логичка (или точно или неточно)"
-
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
-#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Збор (до %(maxlength)s)"
-
-#: contrib/admin/views/doc.py:294
-msgid "Comma-separated integers"
-msgstr "Целобројни вредности одделени со запирка"
-
-#: contrib/admin/views/doc.py:295
-msgid "Date (without time)"
-msgstr "Датум (без час)"
-
-#: contrib/admin/views/doc.py:296
-msgid "Date (with time)"
-msgstr "Датум (со час)"
-
-#: contrib/admin/views/doc.py:297
-msgid "E-mail address"
-msgstr "Адреса на е-пошта"
-
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
-msgid "File path"
-msgstr "Патека на датотека"
-
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
-msgstr "Децимален број"
-
-#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
-msgid "IP address"
-msgstr "ИП адреса"
-
-#: contrib/admin/views/doc.py:306
-msgid "Boolean (Either True, False or None)"
-msgstr "Логичка (точно,неточно или празно)"
-
-#: contrib/admin/views/doc.py:307
-msgid "Relation to parent model"
-msgstr "Релација со родителскиот модел"
-
-#: contrib/admin/views/doc.py:308
-msgid "Phone number"
-msgstr "Телефонски број"
-
-#: contrib/admin/views/doc.py:313
-msgid "Text"
-msgstr "Текст"
-
-#: contrib/admin/views/doc.py:314
-msgid "Time"
-msgstr "Час"
-
-#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:316
-msgid "U.S. state (two uppercase letters)"
-msgstr "Држава во САД (две големи букви)"
-
-#: contrib/admin/views/doc.py:317
-msgid "XML text"
-msgstr "XML текст"
-
-#: contrib/admin/views/doc.py:343
-#, python-format
-msgid "%s does not appear to be a urlpattern object"
-msgstr "%s не изгледа дека е url објект"
-
-#: contrib/admin/views/auth.py:30
-msgid "Add user"
-msgstr "Додади корисник"
-
-#: contrib/admin/views/auth.py:57
-msgid "Password changed successfully."
-msgstr "Успешна промена на лозинката."
-
-#: contrib/admin/views/auth.py:64
-#, python-format
-msgid "Change password: %s"
-msgstr "Промени лозинка: %s"
-
-#: contrib/admin/templatetags/admin_list.py:247
-msgid "All dates"
-msgstr "Сите датуми"
-
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Прикажи ги сите"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-msgid "Documentation"
-msgstr "Документација"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/admin/auth/user/change_password.html:15
-#: contrib/admin/templates/admin/auth/user/change_password.html:46
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-msgid "Change password"
-msgstr "Промени лозинка"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/comments/templates/comments/form.html:6
-msgid "Log out"
-msgstr "Одјава"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/auth/user/change_password.html:12
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
-msgid "Home"
-msgstr "Дома"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Избриши"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
-"related objects, but your account doesn't have permission to delete the "
-"following types of objects:"
-msgstr ""
-"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на "
-"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги "
-"бришете следните типови на објекти:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
-msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
-"All of the following related items will be deleted:"
-msgstr ""
-"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? "
-"Сите овие ставки ќе бидат избришани:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "Да, сигурен сум"
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "ставки во записникот"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -1204,60 +289,142 @@ msgstr "Страницата не е најдена"
msgid "We're sorry, but the requested page could not be found."
msgstr "Се извинуваме, но неможе да ја најдеме страницата која ја баравте."
-#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Дома"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Грешка со серверот"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Грешка со серверот (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error (500)"
+msgstr "Грешка со серверот (500)"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Имаше грешка. Истата беше пријавена на администраторите и ќе биде поправена "
+"во брзо време. Ви благодариме за вашето трпение."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Добредојдовте,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документација"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Промени лозинка"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Одјава"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Џанго администрација на сајт"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Џанго администрација"
+
+#: contrib/admin/templates/admin/change_form.html:14
#: contrib/admin/templates/admin/index.html:28
msgid "Add"
msgstr "Додади"
-#: contrib/admin/templates/admin/change_form.html:21
-#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
msgid "History"
msgstr "Историја"
-#: contrib/admin/templates/admin/change_form.html:22
+#: contrib/admin/templates/admin/change_form.html:21
msgid "View on site"
msgstr "Погледни на сајтот"
-#: contrib/admin/templates/admin/change_form.html:32
-#: contrib/admin/templates/admin/auth/user/change_password.html:24
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
msgid "Please correct the error below."
msgid_plural "Please correct the errors below."
msgstr[0] "Ве молам поправете ја грешката подолу."
msgstr[1] "Ве молам поправете ги грешките подолу."
-#: contrib/admin/templates/admin/change_form.html:50
+#: contrib/admin/templates/admin/change_form.html:49
msgid "Ordering"
msgstr "Подредување"
-#: contrib/admin/templates/admin/change_form.html:53
+#: contrib/admin/templates/admin/change_form.html:52
msgid "Order:"
msgstr "Подреди:"
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додади %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Избриши"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на "
+"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги "
+"бришете следните типови на објекти:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? "
+"Сите овие ставки ќе бидат избришани:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Да, сигурен сум"
+
#: contrib/admin/templates/admin/filter.html:2
#, python-format
msgid " By %(filter_title)s "
msgstr " Од %(filter_title)s "
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "Сними како нова"
-
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "Сними и додади уште"
-
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "Сними и продолжи со уредување"
-
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "Сними"
-
-#: contrib/admin/templates/admin/change_list.html:12
-#, python-format
-msgid "Add %(name)s"
-msgstr "Додади %(name)s"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Филтер"
#: contrib/admin/templates/admin/index.html:17
#, python-format
@@ -1289,58 +456,6 @@ msgstr "Мои акции"
msgid "None available"
msgstr "Ништо не е достапно"
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Џанго администрација на сајт"
-
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Џанго администрација"
-
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
-msgstr "Датум/час"
-
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
-msgstr "Корисник"
-
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
-msgstr "Акција"
-
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "j M Y, H:i"
-
-#: contrib/admin/templates/admin/object_history.html:36
-msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
-msgstr ""
-"Овој објект нема историја на измени. Најверојатно не бил додаден со админ "
-"сајтот."
-
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Грешка со серверот"
-
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Грешка со серверот (500)"
-
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error (500)"
-msgstr "Грешка со серверот (500)"
-
-#: contrib/admin/templates/admin/500.html:10
-msgid ""
-"There's been an error. It's been reported to the site administrators via e-"
-"mail and should be fixed shortly. Thanks for your patience."
-msgstr ""
-"Имаше грешка. Истата беше пријавена на администраторите и ќе биде поправена "
-"во брзо време. Ви благодариме за вашето трпение."
-
#: contrib/admin/templates/admin/invalid_setup.html:8
msgid ""
"Something's wrong with your database installation. Make sure the appropriate "
@@ -1351,6 +466,50 @@ msgstr ""
"соодветни табели во базата се направени и потврдете дека базата може да биде "
"прочитана од соодветниот корисник."
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Корисник:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Лозинка:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:31
+msgid "Log in"
+msgstr "Најава"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Датум/час"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Корисник"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Акција"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Овој објект нема историја на измени. Најверојатно не бил додаден со админ "
+"сајтот."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Прикажи ги сите"
+
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
msgstr "Оди"
@@ -1367,24 +526,21 @@ msgstr[1] "%(counter)s резултати"
msgid "%(full_result_count)s total"
msgstr "вкупно %(full_result_count)s"
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "Филтер"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Сними како нова"
-#: contrib/admin/templates/admin/login.html:17
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-msgid "Username:"
-msgstr "Корисник:"
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Сними и додади уште"
-#: contrib/admin/templates/admin/login.html:20
-#: contrib/comments/templates/comments/form.html:8
-msgid "Password:"
-msgstr "Лозинка:"
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Сними и продолжи со уредување"
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
-msgstr "Добредојдовте,"
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Сними"
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
@@ -1399,21 +555,21 @@ msgid "Username"
msgstr "Корисник"
#: contrib/admin/templates/admin/auth/user/add_form.html:18
-#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
msgid "Password"
msgstr "Лозинка"
#: contrib/admin/templates/admin/auth/user/add_form.html:23
-#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
msgid "Password (again)"
msgstr "Лозинка (повторно)"
#: contrib/admin/templates/admin/auth/user/add_form.html:24
-#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
msgid "Enter the same password as above, for verification."
msgstr "Заради верификација внесете ја истата лозинка како и горе."
-#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
#, python-format
msgid "Enter a new password for the user %(username)s."
msgstr "Внесете нова лозинка за корисникот %(username)s."
@@ -1422,11 +578,11 @@ msgstr "Внесете нова лозинка за корисникот To install bookmarklets, drag the link to your bookmarks\n"
@@ -1447,11 +603,11 @@ msgstr ""
"сајтот од компјутер кој е означен како „внатрешен“ (разговарајте со вашиот \n"
"администратор ако не сте сигурни).
\n"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
msgid "Documentation for this page"
msgstr "Документација за оваа страница"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid ""
"Jumps you from any page to the documentation for the view that generates "
"that page."
@@ -1459,11 +615,11 @@ msgstr ""
"Ве носи од било која страница од документацијата до погледот кој ја генерира "
"таа страница."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
msgid "Show object ID"
msgstr "Прикажи идентификационен број на објектот"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
@@ -1471,60 +627,89 @@ msgstr ""
"Го прикажува типот на содржината и уникатниот идентификационен број за "
"страници кои претставуваат единечен објект."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
msgid "Edit this object (current window)"
msgstr "Уреди го овој објект (во овој прозорец)"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Jumps to the admin page for pages that represent a single object."
msgstr "Скокнува до админ страницата за страници кои претставуваат единечен објект."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
msgid "Edit this object (new window)"
msgstr "Уреди го овој објект (во нов прозорец)"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "As above, but opens the admin page in a new window."
msgstr "Како погоре, но ја отвара админ страницата во нов прозорец."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Датум:"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ви благодариме што денеска поминавте квалитетно време со интернет страницава."
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Време:"
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Логирајте се повторно"
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Моментално:"
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Измена на лозинка"
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Измена:"
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Успешна промена на лозинката"
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Вашата лозинка беше сменета."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Заради сигурност ве молам внесете ја вашата стара лозинка и потоа внесете ја "
+"новата двапати за да може да се потврди дека правилно сте ја искуцале."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Стара лозинка:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Нова лозинка:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Потврди лозинка:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Промени ја мојата лозинка"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/password_reset_form.html:6
#: contrib/admin/templates/registration/password_reset_form.html:10
-#: contrib/admin/templates/registration/password_reset_done.html:4
msgid "Password reset"
msgstr "Ресетирање на лозинка"
-#: contrib/admin/templates/registration/password_reset_form.html:12
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Успешно е ресетирањето на лозинката"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
msgid ""
-"Forgotten your password? Enter your e-mail address below, and we'll reset "
-"your password and e-mail the new one to you."
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
msgstr ""
-"Сте ја заборавиле вашата лозинка? Внесете ја вашата е-пошта подолу, ќе ја "
-"ресетираме вашата лозинка и новата ќе ви ја пратиме по е-пошта."
-
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "Е-пошта:"
-
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "Ресетирај ја мојата лозинка"
+"Ви пративме нова лозинка на адресата која ја внесовте.Треба да ја примите за "
+"кратко време."
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
@@ -1557,298 +742,579 @@ msgstr "Ви благодариме што го користите овој са
msgid "The %(site_name)s team"
msgstr "Тимот на %(site_name)s"
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Ви благодариме што денеска поминавте квалитетно време со интернет страницава."
-
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr "Логирајте се повторно"
-
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Успешно е ресетирањето на лозинката"
-
-#: contrib/admin/templates/registration/password_reset_done.html:12
+#: contrib/admin/templates/registration/password_reset_form.html:12
msgid ""
-"We've e-mailed a new password to the e-mail address you submitted. You "
-"should be receiving it shortly."
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
msgstr ""
-"Ви пративме нова лозинка на адресата која ја внесовте.Треба да ја примите за "
-"кратко време."
+"Сте ја заборавиле вашата лозинка? Внесете ја вашата е-пошта подолу, ќе ја "
+"ресетираме вашата лозинка и новата ќе ви ја пратиме по е-пошта."
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/password_change_form.html:6
-#: contrib/admin/templates/registration/password_change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:4
-msgid "Password change"
-msgstr "Измена на лозинка"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Е-пошта:"
-#: contrib/admin/templates/registration/password_change_form.html:12
-msgid ""
-"Please enter your old password, for security's sake, and then enter your new "
-"password twice so we can verify you typed it in correctly."
-msgstr ""
-"Заради сигурност ве молам внесете ја вашата стара лозинка и потоа внесете ја "
-"новата двапати за да може да се потврди дека правилно сте ја искуцале."
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Ресетирај ја мојата лозинка"
-#: contrib/admin/templates/registration/password_change_form.html:17
-msgid "Old password:"
-msgstr "Стара лозинка:"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Датум:"
-#: contrib/admin/templates/registration/password_change_form.html:19
-msgid "New password:"
-msgstr "Нова лозинка:"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Време:"
-#: contrib/admin/templates/registration/password_change_form.html:21
-msgid "Confirm password:"
-msgstr "Потврди лозинка:"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Моментално:"
-#: contrib/admin/templates/registration/password_change_form.html:23
-msgid "Change my password"
-msgstr "Промени ја мојата лозинка"
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Измена:"
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "Успешна промена на лозинката"
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Сите датуми"
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "Вашата лозинка беше сменета."
-
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "домејн"
-
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "име кое се прикажува"
-
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "сајт"
-
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "сајтови"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "th"
-msgstr "th"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "st"
-msgstr "st"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "nd"
-msgstr "nd"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "rd"
-msgstr "rd"
-
-#: contrib/humanize/templatetags/humanize.py:47
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
#, python-format
-msgid "%(value).1f million"
-msgid_plural "%(value).1f million"
-msgstr[0] "%(value).1f милион"
-msgstr[1] "%(value).1f милион"
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" беше успешно додаден."
-#: contrib/humanize/templatetags/humanize.py:50
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Подолу можете повторно да го уредите."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Додади корисник"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Успешна промена на лозинката."
+
+#: contrib/admin/views/auth.py:65
#, python-format
-msgid "%(value).1f billion"
-msgid_plural "%(value).1f billion"
-msgstr[0] "%(value).1f милијарда"
-msgstr[1] "%(value).1f милијарда"
+msgid "Change password: %s"
+msgstr "Промени лозинка: %s"
-#: contrib/humanize/templatetags/humanize.py:53
+#: contrib/admin/views/decorators.py:17 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Ве молам внесете точно корисничко име и лозинка. Имајте на ум дека и во "
+"двете полиња се битни големите и малите букви."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Ве молам најавете се повторно бидејќи вашата сесија е истечена. Не се "
+"грижете. Вашите внесови беа зачувани."
+
+#: contrib/admin/views/decorators.py:76
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Изгледа дека вашиот прелистувач не е конфигуриран да прифаќа колачиња. Ве "
+"молам овозможете ги колачињата, превчитајте ја страта и пробајте повторно."
+
+#: contrib/admin/views/decorators.py:89
#, python-format
-msgid "%(value).1f trillion"
-msgid_plural "%(value).1f trillion"
-msgstr[0] "%(value).1f трилион"
-msgstr[1] "%(value).1f трилион"
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Вашата е-пошта не е вашето корисничко име. Пробајте со „%s“."
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "one"
-msgstr "еден"
+#: contrib/admin/views/decorators.py:93
+msgid "Usernames cannot contain the '@' character."
+msgstr "Корисничките имиња неможе да го содржат „@“ знакот."
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "two"
-msgstr "два"
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "таг:"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "three"
-msgstr "три"
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "филтер:"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "four"
-msgstr "четири"
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "поглед:"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "five"
-msgstr "пет"
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Не е најдена апликацијата %r"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "six"
-msgstr "шест"
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Моделот %(name)r не е најден во апликацијата %(label)r"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "seven"
-msgstr "седум"
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "поврзаниот`%(label)s.%(type)s` објект"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "eight"
-msgstr "осум"
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "модел:"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "nine"
-msgstr "девет"
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "поврзани `%(label)s.%(name)s` објекти"
-#: contrib/flatpages/models.py:8
-msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "сите %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "број на %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Полиња на %s објекти"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Цел број"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Логичка (или точно или неточно)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Збор (до %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Целобројни вредности одделени со запирка"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Датум (без час)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Датум (со час)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Децимален број"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Адреса на е-пошта"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Патека на датотека"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Децимален број"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "ИП адреса"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Логичка (точно,неточно или празно)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Релација со родителскиот модел"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Телефонски број"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Час"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Држава во САД (две големи букви)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "XML текст"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s не изгледа дека е url објект"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Администрација на сајт"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Подолу можете да додате уште еден %s."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Додади %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Додадено %s."
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "и"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Изменета %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Избришана %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Не беше изменето ниедно поле."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" беше успешно изменета."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"На пр. „/za/kontakt/“. Осигурајте се да имате коса црта и на крајот и на "
-"почетокот."
+"%(name)s \"%(obj)s\" беше успешно додадена.Подолу можете повторно да ја "
+"уредите."
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "наслов"
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Измени %s"
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "содржина"
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Еден или повеќе %(fieldname)s во %(name)s: %(obj)s"
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "овозможи коментари"
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Еден или повеќе %(fieldname)s во %(name)s:"
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "име на шаблонот"
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" беше избришана успешно."
-#: contrib/flatpages/models.py:13
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Сигурни сте?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Историја на измени: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Изберет %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Изберете %s за измена"
+
+#: contrib/admin/views/main.py:765
+msgid "Database error"
+msgstr "Грешка во базата со податоци"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Двете полиња со лозинките не се совпаѓаат."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Веќе постои корисник со тоа корисничко име."
+
+#: contrib/auth/forms.py:53
msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-"На пр. „flatpages/kontakt.html'. Ако не го внесете ова, системот ќе користи "
-"„flatpages/default.html“."
+"Не изгледа дека вашиот прелистувач има овозможено колачиња. Колачињата се "
+"потребни за да се најавите."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "потребна е регистрација"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Оваа сметка е неактивна."
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr ""
-"Ако ова е штиклирано, само најавените корисници ќе можат да ја гледаат оваа "
-"страница."
-
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "статична страница"
-
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "статични страници"
-
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "пренасочено од"
-
-#: contrib/redirects/models.py:8
+#: contrib/auth/forms.py:84
msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
msgstr ""
-"Ова треба да биде апсолутна патека без името на домејнот. На пр. „/nastani/"
-"prebaraj/“."
+"Нема регистрирано корисник со оваа адреса за е-пошта. Сигурни ли сте дека "
+"сте регистрирани?"
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "пренасочи кон"
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Ресетирање на лозинка на %s"
-#: contrib/redirects/models.py:10
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Двете нови лозинки не се совпаѓаат."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Не ја внесовте точно вашата стара лозинка. Ве молам внесете ја повторно."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "име"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "кодно име"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "привилегија"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "привилегии"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "група"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:148
+msgid "groups"
+msgstr "групи"
+
+#: contrib/auth/models.py:138
+msgid "username"
+msgstr "корисничко име"
+
+#: contrib/auth/models.py:138
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
msgstr ""
-"Ова може да биде или апсолутна патека (како погоре) или цела адреса "
-"почувајќи со „http://“."
+"Дозволени се најмногу 30 знаци. Дозволени се само алфанумерички знаци "
+"(букви, цифри и долна црта)."
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "пренасочување"
+#: contrib/auth/models.py:139
+msgid "first name"
+msgstr "име"
-#: contrib/redirects/models.py:14
-msgid "redirects"
-msgstr "пренасочувања"
+#: contrib/auth/models.py:140
+msgid "last name"
+msgstr "презиме"
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#: contrib/auth/models.py:141
+msgid "e-mail address"
+msgstr "е-пошта"
+
+#: contrib/auth/models.py:142
+msgid "password"
+msgstr "лозинка"
+
+#: contrib/auth/models.py:142
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the change "
+"password form."
+msgstr ""
+"Користете '[algo]$[salt]$[hexdigest]' или користете ја формата за промена на лозинката."
+
+#: contrib/auth/models.py:143
+msgid "staff status"
+msgstr "статус на администраторите"
+
+#: contrib/auth/models.py:143
+msgid "Designates whether the user can log into this admin site."
+msgstr "Означува дали корисникот може да се логира во сајтот за администрација."
+
+#: contrib/auth/models.py:144
+msgid "active"
+msgstr "активен"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Означува дали корисникот треба да биде активен. Одштиклирајте го ова наместо да "
+"бришете корисници."
+
+#: contrib/auth/models.py:145
+msgid "superuser status"
+msgstr "статус на суперкорисник"
+
+#: contrib/auth/models.py:145
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Означува дека овој корисник ги има сите привилегии без експлицитно да се "
+"доделуваат сите."
+
+#: contrib/auth/models.py:146
+msgid "last login"
+msgstr "последна најава"
+
+#: contrib/auth/models.py:147
+msgid "date joined"
+msgstr "датум на зачленување"
+
+#: contrib/auth/models.py:149
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Како дополнување на рачно доделени привилегии, овој корисник ќе ги добие "
+"автоматски и сите привилегии за секоја група во која тој/таа членува."
+
+#: contrib/auth/models.py:150
+msgid "user permissions"
+msgstr "кориснички привилегии"
+
+#: contrib/auth/models.py:154
+msgid "user"
+msgstr "корисник"
+
+#: contrib/auth/models.py:155
+msgid "users"
+msgstr "корисници"
+
+#: contrib/auth/models.py:161
+msgid "Personal info"
+msgstr "Лични информации"
+
+#: contrib/auth/models.py:162
+msgid "Permissions"
+msgstr "Привилегии"
+
+#: contrib/auth/models.py:163
+msgid "Important dates"
+msgstr "Важни датуми"
+
+#: contrib/auth/models.py:164
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:323
+msgid "message"
+msgstr "порака"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Одјавен"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
msgid "object ID"
msgstr "object ID"
-#: contrib/comments/models.py:68
+#: contrib/comments/models.py:72
msgid "headline"
msgstr "наслов"
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
msgid "comment"
msgstr "коментар"
-#: contrib/comments/models.py:70
+#: contrib/comments/models.py:74
msgid "rating #1"
msgstr "популарност #1"
-#: contrib/comments/models.py:71
+#: contrib/comments/models.py:75
msgid "rating #2"
msgstr "популарност #2"
-#: contrib/comments/models.py:72
+#: contrib/comments/models.py:76
msgid "rating #3"
msgstr "популарност #3"
-#: contrib/comments/models.py:73
+#: contrib/comments/models.py:77
msgid "rating #4"
msgstr "популарност #4"
-#: contrib/comments/models.py:74
+#: contrib/comments/models.py:78
msgid "rating #5"
msgstr "популарност #5"
-#: contrib/comments/models.py:75
+#: contrib/comments/models.py:79
msgid "rating #6"
msgstr "популарност #6"
-#: contrib/comments/models.py:76
+#: contrib/comments/models.py:80
msgid "rating #7"
msgstr "популарност #7"
-#: contrib/comments/models.py:77
+#: contrib/comments/models.py:81
msgid "rating #8"
msgstr "популарност #8"
-#: contrib/comments/models.py:82
+#: contrib/comments/models.py:86
msgid "is valid rating"
msgstr "е валидна популарност"
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
msgid "date/time submitted"
msgstr "датум/време пријавен"
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
msgid "is public"
msgstr "е јавен"
-#: contrib/comments/models.py:86
+#: contrib/comments/models.py:90
msgid "is removed"
msgstr "е отстранет"
-#: contrib/comments/models.py:86
+#: contrib/comments/models.py:90
msgid ""
"Check this box if the comment is inappropriate. A \"This comment has been "
"removed\" message will be displayed instead."
@@ -1856,15 +1322,15 @@ msgstr ""
"Штиклирајте го ова поле ако коментарот не е пригоден. Наместо него пораката "
"„Овој коментар беше отстранет“ ќе биде прикажана."
-#: contrib/comments/models.py:91
+#: contrib/comments/models.py:96
msgid "comments"
msgstr "коментари"
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
msgid "Content object"
msgstr "Content објект"
-#: contrib/comments/models.py:159
+#: contrib/comments/models.py:168
#, python-format
msgid ""
"Posted by %(user)s at %(date)s\n"
@@ -1879,48 +1345,48 @@ msgstr ""
"\n"
"http://%(domain)s%(url)s"
-#: contrib/comments/models.py:168
+#: contrib/comments/models.py:178
msgid "person's name"
msgstr "име на личноста"
-#: contrib/comments/models.py:171
+#: contrib/comments/models.py:181
msgid "ip address"
msgstr "ип адреса"
-#: contrib/comments/models.py:173
+#: contrib/comments/models.py:183
msgid "approved by staff"
msgstr "одобрено од администраторите"
-#: contrib/comments/models.py:176
+#: contrib/comments/models.py:187
msgid "free comment"
msgstr "слободен коментар"
-#: contrib/comments/models.py:177
+#: contrib/comments/models.py:188
msgid "free comments"
msgstr "слободни коментари"
-#: contrib/comments/models.py:233
+#: contrib/comments/models.py:250
msgid "score"
msgstr "поени"
-#: contrib/comments/models.py:234
+#: contrib/comments/models.py:251
msgid "score date"
msgstr "датум поени"
-#: contrib/comments/models.py:237
+#: contrib/comments/models.py:255
msgid "karma score"
msgstr "карма поен"
-#: contrib/comments/models.py:238
+#: contrib/comments/models.py:256
msgid "karma scores"
msgstr "карма поени"
-#: contrib/comments/models.py:242
+#: contrib/comments/models.py:260
#, python-format
msgid "%(score)d rating by %(user)s"
msgstr "%(score)d гласање за популарност од %(user)s"
-#: contrib/comments/models.py:258
+#: contrib/comments/models.py:277
#, python-format
msgid ""
"This comment was flagged by %(user)s:\n"
@@ -1931,121 +1397,40 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/models.py:265
+#: contrib/comments/models.py:285
msgid "flag date"
msgstr "датум на означување"
-#: contrib/comments/models.py:268
+#: contrib/comments/models.py:289
msgid "user flag"
msgstr "корисничка ознака"
-#: contrib/comments/models.py:269
+#: contrib/comments/models.py:290
msgid "user flags"
msgstr "кориснички ознаки"
-#: contrib/comments/models.py:273
+#: contrib/comments/models.py:294
#, python-format
msgid "Flag by %r"
msgstr "Означено од %r"
-#: contrib/comments/models.py:278
+#: contrib/comments/models.py:300
msgid "deletion date"
msgstr "датум на бришење"
-#: contrib/comments/models.py:280
+#: contrib/comments/models.py:303
msgid "moderator deletion"
msgstr "бришење од модератор"
-#: contrib/comments/models.py:281
+#: contrib/comments/models.py:304
msgid "moderator deletions"
msgstr "бришења од модератор"
-#: contrib/comments/models.py:285
+#: contrib/comments/models.py:308
#, python-format
msgid "Moderator deletion by %r"
msgstr "Бришење од модератор од %r"
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Анонимните корисници неможе да гласаат"
-
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "Невалидно ИД на коментарот"
-
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "Нема гласање за самиот себе"
-
-#: contrib/comments/views/comments.py:27
-msgid "This rating is required because you've entered at least one other rating."
-msgstr ""
-"Ова гласање за популарност е потребно бидејќи внесовте најмалку уште едно "
-"друго."
-
-#: contrib/comments/views/comments.py:111
-#, python-format
-msgid ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comment:\n"
-"\n"
-"%(text)s"
-msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comments:\n"
-"\n"
-"%(text)s"
-msgstr[0] ""
-"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s "
-"коментар:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s "
-"коментари:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/views/comments.py:116
-#, python-format
-msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Овој коментар беше пратен од недоверлив корисник:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Дозволено е само POST"
-
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "Едно или повеќе од потребните полиња не беше пополнето"
-
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr "Некој ја променил формата за коментари (сигурносен прекршок)"
-
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
-msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
-msgstr ""
-"Формата за коментар имаше неправилен „target“ параметар - идентификациониот "
-"број на објектот беше неправилен"
-
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "Формата за коментар не овозможи ниту „преглед“ ниту „праќање“"
-
#: contrib/comments/templates/comments/form.html:8
msgid "Forgotten your password?"
msgstr "Ја заборавите вашата лозинка?"
@@ -2082,24 +1467,427 @@ msgstr "Прегледај"
msgid "Your name:"
msgstr "Вашето име:"
-#: contrib/localflavor/br/forms.py:18
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr ""
+"Ова гласање за популарност е потребно бидејќи внесовте најмалку уште едно "
+"друго."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s "
+"коментар:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s "
+"коментари:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Овој коментар беше пратен од недоверлив корисник:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Дозволено е само POST"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Едно или повеќе од потребните полиња не беше пополнето"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Некој ја променил формата за коментари (сигурносен прекршок)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Формата за коментар имаше неправилен „target“ параметар - идентификациониот "
+"број на објектот беше неправилен"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Формата за коментар не овозможи ниту „преглед“ ниту „праќање“"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Анонимните корисници неможе да гласаат"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Невалидно ИД на коментарот"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Нема гласање за самиот себе"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "има на класата на питон моделите"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "content type"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "content types"
+
+#: contrib/flatpages/models.py:9
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"На пр. „/za/kontakt/“. Осигурајте се да имате коса црта и на крајот и на "
+"почетокот."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "наслов"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "содржина"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "овозможи коментари"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "име на шаблонот"
+
+#: contrib/flatpages/models.py:14
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"На пр. „flatpages/kontakt.html'. Ако не го внесете ова, системот ќе користи "
+"„flatpages/default.html“."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "потребна е регистрација"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ако ова е штиклирано, само најавените корисници ќе можат да ја гледаат оваа "
+"страница."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "статична страница"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "статични страници"
+
+#: contrib/flatpages/models.py:27
+msgid "Advanced options"
+msgstr "Напредни можности"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f милион"
+msgstr[1] "%(value).1f милион"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f милијарда"
+msgstr[1] "%(value).1f милијарда"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f трилион"
+msgstr[1] "%(value).1f трилион"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "еден"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "два"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "три"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "четири"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "пет"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "шест"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "седум"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "осум"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "девет"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "денеска"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "утре"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "вчера"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Внесете поштенски број во форматот NNNN или ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Во ова поле смее да бидат само бројки."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Во ова поле смее да има 7 или 8 цифри."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Внесете правилен CUIT во XX-XXXXXXXX-X or XXXXXXXXXXXX формат."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Неправилен CUIT."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Внесете 4 цифрен поштенски број."
+
+#: contrib/localflavor/br/forms.py:21
msgid "Enter a zip code in the format XXXXX-XXX."
-msgstr "Внесете правилен поштенски број во форматот XXXXX-XXX."
+msgstr "Внесете правилен поштенски број во форматот XXXXX-XXX."
#: contrib/localflavor/br/forms.py:30
msgid "Phone numbers must be in XX-XXXX-XXXX format."
msgstr "Телефонските броеви мора да бидат во XX-XXXX-XXXX форматот."
-#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
-#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:14
-msgid "Enter a zip code in the format XXXXX."
-msgstr "Внесете правилен поштенски број во формат XXXXXX."
-
-#: contrib/localflavor/de/forms.py:60
+#: contrib/localflavor/br/forms.py:58
msgid ""
-"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
-"format."
-msgstr "Внесете правилен број на лична карта во Германија во XXXXXXXXXXX-XXXXXXX-XXXXXXX-X форматот."
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Изберете правилна бразилска држава. Оваа држава не е од достапните држави."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Неправилен CPF број."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Во ова поле смее да има најмногу 11 цифри или 14 знаци."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Неправилен CNPJ број."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Во ова поле треба да има најмалку 14 цифри"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Внесете правилен поштенски број во формат XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Внесте правилен канадски број за осигурување во XXX-XXX-XXX форматот."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Женева"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Цирих"
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Внесете правилен поштенски број во форматот XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Внесете правилен швајцарски број на пасош во X1234567<0 или "
+" 1234567890 формат."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Внесете правилeн RUT за Чиле."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Внесете правилен RUT за Чиле. Форматот е Xx.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "RUT бројот за Чиле е невалиден."
#: contrib/localflavor/de/de_states.py:5
msgid "Baden-Wuerttemberg"
@@ -2165,11 +1953,353 @@ msgstr "Шлесвиг-Холштајн"
msgid "Thuringia"
msgstr "Турингиа"
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Внесете правилен поштенски број во формат XXXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Внесете правилен број на лична карта во Германија во XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X форматот."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Авила"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Барцелона"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Кордоба"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Леон"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Луго"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Мадрид"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Малага"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Санта Круз и Тенерифе"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Севиља"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Толедо"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Валенсија"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Сарагоса"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Андалузија"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Арагон"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principality of Asturias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Острови Балеарик"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Баскија"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Канарски острови"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Кастиља ла Манча"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Кастиња и Леон"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Каталонија"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Екстремадура"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Галиција"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Регион Мурција"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Foral Community of Navarre"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencian Community"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Внесете поштенски број во опсег и формат 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr "Внесете правилен телефонски број во еден од формативе 6XXXXXXXX, 8XXXXXXXX или 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Ве молам внесете правиелн NIF, NIE или CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Ве молам внесете валиден NIF или NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Неправилна контролна сума за NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Неправилна контролна сума за NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Неправилна контролна сум за CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Внесете правилна банкарска сметка во формат XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Неправилна контролна сума за бројот на банкарската сметка."
+
+#: contrib/localflavor/fi/forms.py:28
msgid "Enter a valid Finnish social security number."
msgstr "Внесте правилен фински матичен број."
-#: contrib/localflavor/jp/forms.py:21
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Внесете правилен поштенски број во форматот XXXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Внесете валиден идентификационен број од Исланд. Форматот е XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Исландскиот идентификационент број е невалиден."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Внесете правилен поштенски број."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Внесете правилен осигурителен број."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Внесете правилен даночен број."
+
+#: contrib/localflavor/jp/forms.py:17
msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
msgstr "Внесете поштенски број во форматот XXXXXXX или XXX-XXXX."
@@ -2361,104 +2491,1596 @@ msgstr "Кагошима"
msgid "Okinawa"
msgstr "Окинава"
-#: contrib/localflavor/no/forms.py:15
-msgid "Enter a zip code in the format XXXX."
-msgstr "Внесете правилен поштенски број во форматот XXXX."
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
-#: contrib/localflavor/no/forms.py:36
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Баја Калифорнија"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Кампеш"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Чиапас"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Колима"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Дуранго"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Гуереро"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Хидалго"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Џалиско"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Куантана Ро"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Синалоа"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "Сан Луис Потоси"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Сонора"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Табаско"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Тамаулипас"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Веракруз"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Јукатан"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Зацатекас"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Внесете правилен поштенски код"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Внесете валиден телефонски број"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Внесете валиден осигурителен број"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Дренте"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Флеволанд"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Фраисланд"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Гелдерланд"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Гронинген"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Лимбург"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Утрехт"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Зиланд"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
msgid "Enter a valid Norwegian social security number."
msgstr "Ве молам внесете правилен норвешки матичен број."
-#: contrib/localflavor/uk/forms.py:18
-msgid "Enter a postcode. A space is required between the two postcode parts."
-msgstr "Внесете поштенски број. Задолжително е празно место помеѓу двата дела на поштенскиот број."
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Во ова поле мора да се внесат 8 цифри."
-#: contrib/localflavor/usa/forms.py:18
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Во ова поле се потребни 11 цифри."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Националниот идентификационен број се состои од 11 цифири."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Погрешна проверка за Националниот идентификационен број."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Внесете даночен број (NIP) во форматот XXX-XXX-XX-XX или XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Даночниот број (NIP) е погрешен."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Националниот бизнис регистрациски број (REGON) се состои од 7 или 9 цифри."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Неправилна контролна сум за Националниот бизнис регистрационен број (REGON)."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Внесете правилен поштенски број во формат XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Долна Силесиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Лублин"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Лубус"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Лодз"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Масовиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Ополе"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Субкарпатиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Подласи"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Померанија"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Силесиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Западна Померанија"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Внесете поштенски број во форматот XXXXX или XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Банска Бистрица"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Банска Стиавница"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Бардејов"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Бановце над Бебраво"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Брезно"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Братислава I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Братислава II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Братислава III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Братислава IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Братислава V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Битка"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Кадка"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Детва"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Гелника"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Хлоховец"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Хумен"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Кезмарок"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Комарно"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Кошице I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Кошице II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Кошице III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Кошице IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Кошице - околина"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Крупина"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Левице"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Левока"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Луценец"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Мартин"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Наместово"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Нитра"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Партизанске"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Пезинок"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Полтар"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Попрад"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Пресов"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Пучов"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Ревука"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Рознава"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Рузомберок"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Сабинов"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Сенец"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Сеника"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Скалица"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Шнина"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Собранце"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Стара Љубовна"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Стропков"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Свидник"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Сала"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Тополчани"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Требисов"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Тренцин"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Трнава"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Тврдосин"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Злате Моравце"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Зволен"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Зарновица"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Зилина"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica region"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Братиславски регион"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Кошице регион"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Нитра регион"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Пресов регион"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Тренцин регион"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Трнава регион"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Зилина регион"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Внесете правилен поштенски код."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Бедфордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Букингхамшир"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Чешир"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Кумбриа"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Дербишир"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Девон"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Дорсет"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Дурам"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "Источен Сасекс"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Есекс"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Поширок Лондон"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Поширок Манчестер"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Хемпшир"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Хертфордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Кент"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Ланкашир"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Линколншир"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Мерсејсајд"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Норфолк"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "Северен Јоркшир"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Нортхамтоншир"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Нотингхамшир"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Оксфордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Шропшир"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Сомерсет"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Јужен Јоркшир"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Стафордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Суфолк"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "Западен Мидландс"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "Западен Сасекс"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "Западен Јоркшир"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Вилтшир"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Гвент"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "Јужен Гламорга"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "Западен Гламорган"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Централна Шкотска"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Грампиан"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Англија"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Северна Ирска"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Шкотска"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Велс"
+
+#: contrib/localflavor/us/forms.py:16
msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
msgstr "Внесете поштенски број во форматот XXXXX или XXXXX-XXXX."
-#: contrib/localflavor/usa/forms.py:51
+#: contrib/localflavor/us/forms.py:54
msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
msgstr "Внесте правилен матичен број за САД во XXX-XX-XXXX форматот."
-#: contrib/sessions/models.py:68
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Внесете правилен јужно афрички број за идентификација"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Внесете правилен јужно афрички поштенски код"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Источен Кејп"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "пренасочи од"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ова треба да биде апсолутна патека без името на домејнот. На пр. „/nastani/"
+"prebaraj/“."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "пренасочи кон"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ова може да биде или апсолутна патека (како погоре) или цела адреса "
+"почувајќи со „http://“."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "пренасочување"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "пренасочувања"
+
+#: contrib/sessions/models.py:41
msgid "session key"
msgstr "клуч на сесијата"
-#: contrib/sessions/models.py:69
+#: contrib/sessions/models.py:42
msgid "session data"
msgstr "податоци од сесијата"
-#: contrib/sessions/models.py:70
+#: contrib/sessions/models.py:43
msgid "expire date"
msgstr "датум на истекување"
-#: contrib/sessions/models.py:74
+#: contrib/sessions/models.py:48
msgid "session"
msgstr "сесија"
-#: contrib/sessions/models.py:75
+#: contrib/sessions/models.py:49
msgid "sessions"
msgstr "сесии"
-#: contrib/contenttypes/models.py:36
-msgid "python model class name"
-msgstr "има на класата на питон моделите"
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "домејн"
-#: contrib/contenttypes/models.py:39
-msgid "content type"
-msgstr "content type"
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "име кое се прикажува"
-#: contrib/contenttypes/models.py:40
-msgid "content types"
-msgstr "content types"
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "сајт"
-#: oldforms/__init__.py:392
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "сајтови"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Оваа вредност смее да има само букви, бројки или долни црти."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Оваа вредност смее да има само букви, бројки, долни црти, црти или коси црти."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Оваа вредност смее да содржи само букви, бројки, долни црти или црти."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Големи букви не се дозволени."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Мали букви не се дозволени."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Внесете само цифри одделени со запирки."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Внесете валидни адреси за е-пошта одделени со запирки."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Ве молам внесете валидна ИП адреса."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Празни вредности не се дозволени."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ненумерички знаци не се дозволени тука."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Оваа вредност не смее да биде само од цифри."
+
+#: core/validators.py:128 newforms/fields.py:152
+msgid "Enter a whole number."
+msgstr "Внеси цел број."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Дозволени се само букви."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Годината мора да биде 1900 или покасно."
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Неправилен датум: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:548
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Внесете правилен датум во форматот ГГГГ-ММ-ДД."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Внесете правилно време во форматот HH:MM."
+
+#: core/validators.py:165 db/models/fields/__init__.py:625
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Внесете правилен датум/време во форматот ГГГГ-ММ-ДД ЧЧ:ММ."
+
+#: core/validators.py:170 newforms/fields.py:403
+msgid "Enter a valid e-mail address."
+msgstr "Внесeте правилна адреса за е-пошта."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:433
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата."
+
+#: core/validators.py:193 newforms/fields.py:459
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Качете валидна фотографија. Датотеката која ја качивте или не беше "
+"фотографија или беше расипана датотеката."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Адресата %s не покажува кон валидна фотографија."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Телефонските броеви мора да бидат во XXX-XXX-XXXX форматот. „%s“ не е "
+"валиден."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Адресата „%s“ не покажува кон QuickTime видео."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Задолжителна е правилна адреса."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Задолжителен е правилен HTML. Грешките се:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Неправилно формиран XML: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Неправилна адреса: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Адресата %s е скршена врска."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Внесете правилна скратеница за држава во САД."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Внимавајте на јазикот. Тука не е дозволен зборот %s."
+msgstr[1] "Внимавајте на јазикот. Тука не се дозволени зборовите %s."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ова поле мора да соодејствува со полето „%s“."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Ве молам внесете нешто во барем едно поле."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Ве молам внесете во двете полиња или оставете ги двете празни."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ова поле мора да биде зададено ако %(field)s е %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ова поле мора да биде зададено ако %(field)s не е %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Дупликат вредности не се дозволени."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Оваа вредноста мора да биде помеѓу %(lower)s и %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Оваа вредноста мора да биде најмалку %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Оваа вредност не смее да биде поголема од %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Оваа вредноста мора да биде степен од %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Ве молам внесете правилен децимален број."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Ве молам внесете правилен децимален број со најмногу %s цифрa."
+msgstr[1] "Ве молам внесете правилен децимален број со најмногу %s вкупно цифри."
+
+#: core/validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s "
+"цифра."
+msgstr[1] ""
+"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s "
+"цифри."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Ве молам внесете правилен децимален број кој има најмногу %s децимална цифра."
+msgstr[1] "Ве молам внесете правилен децимален број кој има најмногу %s децимални цифри."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Ве молам внесете правилен децимален број."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Потврдете дека качената датотека има најмалку %s бајти."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Потврдете дека качената датотека има најмногу %s бајти."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Форматот за ова поле е грешен."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Ова поле не е правилно."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Неможев да извадам ништо од %s."
+
+#: core/validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Адресата %(url)s врати неправилно заглавје Content-Type „%(contenttype)s“."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Ве молам затворете го отворениот %(tag)s таг од линијата %(line)s. (линијата "
+"почнува со „%(start)s“.)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Некој текст кој почнува на линијата %(line)s не е дозволен во тој контекст. "
+"(Линијата започнува со „%(start)s“.)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"„%(attr)s“ на линија %(line)s е неправилен атрибут. (линијата започнува со „%"
+"(start)s“.)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"„<%(tag)s>“ на линија %(line)s е неправилен таг. (линијата започнува со „%"
+"(start)s“.)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"На таг од линијата %(line)s му недостасува еден или повеќе од потребните "
+"атрибути (линијата започнува со „%(start)s“)."
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Атрибутот „%(attr)s“ на линијата %(line)s има неправилна вредност (линијата започнува со „%(start)s“)."
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s од овој тип %(type)s веќе постои за даденото %(field)s."
+
+#: db/models/fields/__init__.py:51
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s со ова %(fieldname)s веќе постои."
+
+#: db/models/fields/__init__.py:176 db/models/fields/__init__.py:348
+#: db/models/fields/__init__.py:780 db/models/fields/__init__.py:791
+#: newforms/fields.py:46 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Ова поле е задолжително."
+
+#: db/models/fields/__init__.py:448
+msgid "This value must be an integer."
+msgstr "Оваа вредност мора да биде цел број."
+
+#: db/models/fields/__init__.py:487
+msgid "This value must be either True or False."
+msgstr "Оваа вредност мора да биде или точно или неточно."
+
+#: db/models/fields/__init__.py:511
+msgid "This field cannot be null."
+msgstr "Оваа вредност неможе да биде null."
+
+#: db/models/fields/__init__.py:689
+msgid "This value must be a decimal number."
+msgstr "Оваа вредност мора да биде децимален број."
+
+#: db/models/fields/__init__.py:800
+msgid "Enter a valid filename."
+msgstr "Внесите правилно име на датотека."
+
+#: db/models/fields/__init__.py:981
+msgid "This value must be either None, True or False."
+msgstr "Оваа вредност мора да биде празна, точно или неточно."
+
+#: db/models/fields/related.py:94
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Ве молам внесете правилно %s."
+
+#: db/models/fields/related.py:746
+msgid "Separate multiple IDs with commas."
+msgstr "Одвојте ги идентификационите броеви со запирки."
+
+#: db/models/fields/related.py:748
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Држете го „Control“ или „Command“ на Мекинтош за да изберете повеќе од едно."
+
+#: db/models/fields/related.py:795
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Ве молам внесете правилен %(self)s идентификацион број. Оваа вредност %"
+"(value)r е неправилна."
+msgstr[1] ""
+"Ве молам внесете правилен %(self)s идентификацион број. Вредностите %(value)"
+"r се неправилни."
+
+#: newforms/fields.py:47
+msgid "Enter a valid value."
+msgstr "Внесете правилна вредност."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Осигурајте се дека оваа вредност има најмногу %(max)d знаци (има %(length)d)."
+
+#: newforms/fields.py:125
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Осигурајте се дека оваа вредност има најмалку %(min)d знаци (има %(length)d)."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Осигурајте се дека оваа вредност е помала или еднаква со %s."
+
+#: newforms/fields.py:154 newforms/fields.py:183 newforms/fields.py:212
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Осигурајте се дека оваа вредност е поголема или еднаква со %s."
+
+#: newforms/fields.py:181 newforms/fields.py:210
+msgid "Enter a number."
+msgstr "Внесете број."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Осигурајте се дека нема вкупно повеќе од %s цифри."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Осигурајте се дека нема повеќе од %s децимални места."
+
+#: newforms/fields.py:215
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Осигурајте се дека нема повеќе од %s цифри пред децималната запирка."
+
+#: newforms/fields.py:263 newforms/fields.py:750
+msgid "Enter a valid date."
+msgstr "Внесете правилен датум."
+
+#: newforms/fields.py:296 newforms/fields.py:751
+msgid "Enter a valid time."
+msgstr "Внесете правилно време."
+
+#: newforms/fields.py:335
+msgid "Enter a valid date/time."
+msgstr "Внесете правилен датум со време."
+
+#: newforms/fields.py:434
+msgid "No file was submitted."
+msgstr "Не беше пратена датотека."
+
+#: newforms/fields.py:435 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Пратената датотека е празна."
+
+#: newforms/fields.py:497
+msgid "Enter a valid URL."
+msgstr "Внесете правилна адреса."
+
+#: newforms/fields.py:498
+msgid "This URL appears to be a broken link."
+msgstr "Оваа адреса изгледа дека не е достапна."
+
+#: newforms/fields.py:559 newforms/models.py:299
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Изберете правилно. Тоа не е едно од можните избори."
+
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Внесете валиден избор. %(value)s не е еден од можните избори."
+
+#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:365
+msgid "Enter a list of values."
+msgstr "Внесете листа на вредности."
+
+#: newforms/fields.py:779
+msgid "Enter a valid IPv4 address."
+msgstr "Внесeте правилна IPv4 адреса."
+
+#: newforms/models.py:366
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Внесете правилно. %s не е еден од достапните вредности."
+
+#: oldforms/__init__.py:409
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Осигурајте се дека вашиот текст има помалку од %s знак."
msgstr[1] "Осигурајте се дека вашиот текст има помалку од %s знаци."
-#: oldforms/__init__.py:397
+#: oldforms/__init__.py:414
msgid "Line breaks are not allowed here."
msgstr "Тука не се дозволени прекини на линија."
-#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr "Изберете правилно, %(data)s' не е во %(choices)s."
-#: oldforms/__init__.py:674
-msgid "The submitted file is empty."
-msgstr "Пратената датотека е празна."
-
-#: oldforms/__init__.py:730
+#: oldforms/__init__.py:745
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Внесете цел број помеѓу -32,768 и 32,767."
-#: oldforms/__init__.py:740
+#: oldforms/__init__.py:755
msgid "Enter a positive number."
msgstr "Внесете позитивен број."
-#: oldforms/__init__.py:750
+#: oldforms/__init__.py:765
msgid "Enter a whole number between 0 and 32,767."
msgstr "Внесете цел број помеѓу 0 и 32,767."
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr "%(verbose_name)s беше успешно создаден."
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "да, не, можеби"
-#: views/generic/create_update.py:117
+#: template/defaultfilters.py:729
#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr "%(verbose_name)s беше успешно ажуриран."
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d бајт"
+msgstr[1] "%(size)d бајти"
-#: views/generic/create_update.py:184
+#: template/defaultfilters.py:731
#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr "%(verbose_name)s беше избришан."
+msgid "%.1f KB"
+msgstr "%.1f КБ"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f МБ"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f ГБ"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "попладне"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "наутро"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "попладне"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "наутро"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "полноќ"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "пладне"
#: utils/dates.py:6
msgid "Monday"
@@ -2488,268 +4110,244 @@ msgstr "сабота"
msgid "Sunday"
msgstr "недела"
-#: utils/dates.py:14
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "пон"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "вто"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "сре"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "чет"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "пет"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "саб"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "нед"
+
+#: utils/dates.py:18
msgid "January"
msgstr "јануари"
-#: utils/dates.py:14
+#: utils/dates.py:18
msgid "February"
msgstr "февруари"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "March"
msgstr "март"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "April"
msgstr "април"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "May"
msgstr "мај"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "June"
msgstr "јуни"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:19 utils/dates.py:31
msgid "July"
msgstr "јули"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "August"
msgstr "август"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "September"
msgstr "септември"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "October"
msgstr "октомври"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "November"
msgstr "ноември"
-#: utils/dates.py:16
+#: utils/dates.py:20
msgid "December"
msgstr "декември"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jan"
msgstr "јан"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "feb"
msgstr "фев"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "mar"
msgstr "мар"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "apr"
msgstr "апр"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "may"
msgstr "мај"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jun"
msgstr "јун"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "jul"
msgstr "јул"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "aug"
msgstr "авг"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "sep"
msgstr "сеп"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "oct"
msgstr "окт"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "nov"
msgstr "ное"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "dec"
msgstr "дек"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Jan."
msgstr "јан."
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Feb."
msgstr "фев."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Aug."
msgstr "авг."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Sept."
msgstr "сеп."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Oct."
msgstr "окт."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Nov."
msgstr "ное."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Dec."
msgstr "дек."
-#: utils/timesince.py:12
+#: utils/text.py:127
+msgid "or"
+msgstr "или"
+
+#: utils/timesince.py:21
msgid "year"
msgid_plural "years"
msgstr[0] "година"
msgstr[1] "години"
-#: utils/timesince.py:13
+#: utils/timesince.py:22
msgid "month"
msgid_plural "months"
msgstr[0] "месец"
msgstr[1] "месеци"
-#: utils/timesince.py:14
+#: utils/timesince.py:23
msgid "week"
msgid_plural "weeks"
msgstr[0] "седмица"
msgstr[1] "седмици"
-#: utils/timesince.py:15
+#: utils/timesince.py:24
msgid "day"
msgid_plural "days"
msgstr[0] "ден"
msgstr[1] "дена"
-#: utils/timesince.py:16
+#: utils/timesince.py:25
msgid "hour"
msgid_plural "hours"
msgstr[0] "час"
msgstr[1] "часа"
-#: utils/timesince.py:17
+#: utils/timesince.py:26
msgid "minute"
msgid_plural "minutes"
msgstr[0] "минута"
msgstr[1] "минути"
-#: utils/dateformat.py:40
-msgid "p.m."
-msgstr "попладне"
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "минути"
-#: utils/dateformat.py:41
-msgid "a.m."
-msgstr "наутро"
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
-#: utils/dateformat.py:46
-msgid "PM"
-msgstr "попладне"
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
-#: utils/dateformat.py:47
-msgid "AM"
-msgstr "наутро"
-
-#: utils/dateformat.py:95
-msgid "midnight"
-msgstr "полноќ"
-
-#: utils/dateformat.py:97
-msgid "noon"
-msgstr "пладне"
-
-#: utils/translation/trans_real.py:358
+#: utils/translation/trans_real.py:403
msgid "DATE_FORMAT"
msgstr "j M Y"
-#: utils/translation/trans_real.py:359
+#: utils/translation/trans_real.py:404
msgid "DATETIME_FORMAT"
msgstr "j M Y, P"
-#: utils/translation/trans_real.py:360
+#: utils/translation/trans_real.py:405
msgid "TIME_FORMAT"
msgstr "P"
-#: utils/translation/trans_real.py:376
+#: utils/translation/trans_real.py:421
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
-#: utils/translation/trans_real.py:377
+#: utils/translation/trans_real.py:422
msgid "MONTH_DAY_FORMAT"
msgstr "F j"
-#: template/defaultfilters.py:491
-msgid "yes,no,maybe"
-msgstr "да, не, можеби"
-
-#: newforms/fields.py:103 newforms/fields.py:256
+#: views/generic/create_update.py:43
#, python-format
-msgid "Ensure this value has at most %d characters."
-msgstr "Осигурајте се дека оваа вредност има најмногу %d знаци."
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s беше успешно создаден."
-#: newforms/fields.py:105 newforms/fields.py:258
+#: views/generic/create_update.py:117
#, python-format
-msgid "Ensure this value has at least %d characters."
-msgstr "Осигурајте се дека оваа вредност има најмалку %d знаци."
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s беше успешно ажуриран."
-#: newforms/fields.py:130
+#: views/generic/create_update.py:184
#, python-format
-msgid "Ensure this value is less than or equal to %s."
-msgstr "Осигурајте се дека оваа вредност е помала или еднаква на %s."
-
-#: newforms/fields.py:132
-#, python-format
-msgid "Ensure this value is greater than or equal to %s."
-msgstr "Осигурајте се дека оваа вредност е поголема или еднаква со %s."
-
-#: newforms/fields.py:165
-msgid "Enter a valid date."
-msgstr "Внесете правилен датум."
-
-#: newforms/fields.py:192
-msgid "Enter a valid time."
-msgstr "Внесете правилно време."
-
-#: newforms/fields.py:228
-msgid "Enter a valid date/time."
-msgstr "Внесете правилен датум со време."
-
-#: newforms/fields.py:242
-msgid "Enter a valid value."
-msgstr "Внесете правилна вредност."
-
-#: newforms/fields.py:289 newforms/fields.py:311
-msgid "Enter a valid URL."
-msgstr "Внесете правилна адреса."
-
-#: newforms/fields.py:313
-msgid "This URL appears to be a broken link."
-msgstr "Оваа адреса изгледа дека не е достапна."
-
-#: newforms/fields.py:362 newforms/models.py:165
-msgid "Select a valid choice. That choice is not one of the available choices."
-msgstr "Изберете правилно. Тоа не е едно од можните избори."
-
-#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
-msgid "Enter a list of values."
-msgstr "Внесете листа на вредности."
-
-#: newforms/fields.py:389 newforms/models.py:188
-#, python-format
-msgid "Select a valid choice. %s is not one of the available choices."
-msgstr "Внесете правилно. %s не е еден од достапните вредности."
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s беше избришан."
diff --git a/django/contrib/auth/admin.py b/django/contrib/auth/admin.py
index aba2220248..998692a6cb 100644
--- a/django/contrib/auth/admin.py
+++ b/django/contrib/auth/admin.py
@@ -8,6 +8,7 @@ from django.contrib import admin
class GroupAdmin(admin.ModelAdmin):
search_fields = ('name',)
+ ordering = ('name',)
filter_horizontal = ('permissions',)
class UserAdmin(admin.ModelAdmin):
@@ -21,6 +22,7 @@ class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
list_filter = ('is_staff', 'is_superuser')
search_fields = ('username', 'first_name', 'last_name', 'email')
+ ordering = ('username',)
filter_horizontal = ('user_permissions',)
def add_view(self, request):
diff --git a/django/contrib/auth/fixtures/authtestdata.json b/django/contrib/auth/fixtures/authtestdata.json
new file mode 100644
index 0000000000..e0bdc24e72
--- /dev/null
+++ b/django/contrib/auth/fixtures/authtestdata.json
@@ -0,0 +1,56 @@
+[
+ {
+ "pk": "1",
+ "model": "auth.user",
+ "fields": {
+ "username": "testclient",
+ "first_name": "Test",
+ "last_name": "Client",
+ "is_active": true,
+ "is_superuser": false,
+ "is_staff": false,
+ "last_login": "2006-12-17 07:03:31",
+ "groups": [],
+ "user_permissions": [],
+ "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
+ "email": "testclient@example.com",
+ "date_joined": "2006-12-17 07:03:31"
+ }
+ },
+ {
+ "pk": "2",
+ "model": "auth.user",
+ "fields": {
+ "username": "inactive",
+ "first_name": "Inactive",
+ "last_name": "User",
+ "is_active": false,
+ "is_superuser": false,
+ "is_staff": false,
+ "last_login": "2006-12-17 07:03:31",
+ "groups": [],
+ "user_permissions": [],
+ "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
+ "email": "testclient@example.com",
+ "date_joined": "2006-12-17 07:03:31"
+ }
+ },
+ {
+ "pk": "3",
+ "model": "auth.user",
+ "fields": {
+ "username": "staff",
+ "first_name": "Staff",
+ "last_name": "Member",
+ "is_active": true,
+ "is_superuser": false,
+ "is_staff": true,
+ "last_login": "2006-12-17 07:03:31",
+ "groups": [],
+ "user_permissions": [],
+ "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
+ "email": "staffmember@example.com",
+ "date_joined": "2006-12-17 07:03:31"
+ }
+ }
+]
diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py
index 56b4cbc082..83bdb95dab 100644
--- a/django/contrib/auth/models.py
+++ b/django/contrib/auth/models.py
@@ -96,8 +96,7 @@ class Group(models.Model):
class Meta:
verbose_name = _('group')
verbose_name_plural = _('groups')
- ordering = ('name',)
-
+
def __unicode__(self):
return self.name
@@ -150,8 +149,7 @@ class User(models.Model):
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
- ordering = ('username',)
-
+
def __unicode__(self):
return self.username
diff --git a/django/contrib/auth/tests/__init__.py b/django/contrib/auth/tests/__init__.py
index 092fdd5d58..6242303f46 100644
--- a/django/contrib/auth/tests/__init__.py
+++ b/django/contrib/auth/tests/__init__.py
@@ -1,8 +1,8 @@
-from django.contrib.auth.tests.basic import BASIC_TESTS
-from django.contrib.auth.tests.forms import FORM_TESTS, PasswordResetFormTestCase
+from django.contrib.auth.tests.basic import BASIC_TESTS, PasswordResetTest
+from django.contrib.auth.tests.forms import FORM_TESTS
__test__ = {
'BASIC_TESTS': BASIC_TESTS,
- 'PASSWORDRESET_TESTS': PasswordResetFormTestCase,
+ 'PASSWORDRESET_TESTS': PasswordResetTest,
'FORM_TESTS': FORM_TESTS,
}
diff --git a/django/contrib/auth/tests/basic.py b/django/contrib/auth/tests/basic.py
index 8667ca9e5a..76dbdc9cb9 100644
--- a/django/contrib/auth/tests/basic.py
+++ b/django/contrib/auth/tests/basic.py
@@ -53,4 +53,25 @@ Superuser created successfully.
u'joe@somewhere.org'
>>> u.password
u'!'
-"""
\ No newline at end of file
+"""
+
+from django.test import TestCase
+from django.core import mail
+
+class PasswordResetTest(TestCase):
+ fixtures = ['authtestdata.json']
+ urls = 'django.contrib.auth.urls'
+
+ def test_email_not_found(self):
+ "Error is raised if the provided email address isn't currently registered"
+ response = self.client.get('/password_reset/')
+ self.assertEquals(response.status_code, 200)
+ response = self.client.post('/password_reset/', {'email': 'not_a_real_email@email.com'})
+ self.assertContains(response, "That e-mail address doesn't have an associated user account")
+ self.assertEquals(len(mail.outbox), 0)
+
+ def test_email_found(self):
+ "Email is sent if a valid email address is provided for password reset"
+ response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'})
+ self.assertEquals(response.status_code, 302)
+ self.assertEquals(len(mail.outbox), 1)
diff --git a/django/contrib/auth/tests/forms.py b/django/contrib/auth/tests/forms.py
index 001323bf34..1e1e0a95d4 100644
--- a/django/contrib/auth/tests/forms.py
+++ b/django/contrib/auth/tests/forms.py
@@ -1,33 +1,4 @@
-from django.core import mail
-from django.test import TestCase
-from django.contrib.auth.models import User
-from django.contrib.auth.forms import PasswordResetForm
-
-class PasswordResetFormTestCase(TestCase):
- def testValidUser(self):
- data = {
- 'email': 'nonexistent@example.com',
- }
- form = PasswordResetForm(data)
- self.assertEqual(form.is_valid(), False)
- self.assertEqual(form["email"].errors, [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"])
-
- def testEmail(self):
- # TODO: remove my email address from the test ;)
- User.objects.create_user('atestuser', 'atestuser@example.com', 'test789')
- data = {
- 'email': 'atestuser@example.com',
- }
- form = PasswordResetForm(data)
- self.assertEqual(form.is_valid(), True)
- # TODO: look at why using contrib.sites breaks other tests
- form.save(domain_override="example.com")
- self.assertEqual(len(mail.outbox), 1)
- self.assertEqual(mail.outbox[0].subject, u'Password reset on example.com')
- # TODO: test mail body. need to figure out a way to get the password in plain text
- # self.assertEqual(mail.outbox[0].body, '')
-
FORM_TESTS = """
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
diff --git a/django/contrib/auth/urls.py b/django/contrib/auth/urls.py
new file mode 100644
index 0000000000..5ddfcf15e8
--- /dev/null
+++ b/django/contrib/auth/urls.py
@@ -0,0 +1,13 @@
+# These URLs are normally mapped to /admin/urls.py. This URLs file is
+# provided as a convenience to those who want to deploy these URLs elsewhere.
+# This file is also used to provide a reliable view deployment for test purposes.
+
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+ ('^logout/$', 'django.contrib.auth.views.logout'),
+ ('^password_change/$', 'django.contrib.auth.views.password_change'),
+ ('^password_change/done/$', 'django.contrib.auth.views.password_change_done'),
+ ('^password_reset/$', 'django.contrib.auth.views.password_reset')
+)
+
diff --git a/django/contrib/flatpages/models.py b/django/contrib/flatpages/models.py
index 2b62d38e07..11ccf43b02 100644
--- a/django/contrib/flatpages/models.py
+++ b/django/contrib/flatpages/models.py
@@ -8,7 +8,7 @@ class FlatPage(models.Model):
url = models.CharField(_('URL'), max_length=100, validator_list=[validators.isAlphaNumericURL], db_index=True,
help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes."))
title = models.CharField(_('title'), max_length=200)
- content = models.TextField(_('content'))
+ content = models.TextField(_('content'), blank=True)
enable_comments = models.BooleanField(_('enable comments'))
template_name = models.CharField(_('template name'), max_length=70, blank=True,
help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."))
diff --git a/django/contrib/formtools/tests.py b/django/contrib/formtools/tests.py
index 143857ad58..ba241e9dc6 100644
--- a/django/contrib/formtools/tests.py
+++ b/django/contrib/formtools/tests.py
@@ -21,18 +21,14 @@ class TestForm(forms.Form):
class PreviewTests(TestCase):
+ urls = 'django.contrib.formtools.test_urls'
def setUp(self):
- self._old_root_urlconf = settings.ROOT_URLCONF
- settings.ROOT_URLCONF = 'django.contrib.formtools.test_urls'
# Create a FormPreview instance to share between tests
self.preview = preview.FormPreview(TestForm)
input_template = ''
self.input = input_template % (self.preview.unused_name('stage'), "%d")
- def tearDown(self):
- settings.ROOT_URLCONF = self._old_root_urlconf
-
def test_unused_name(self):
"""
Verifies name mangling to get uniue field name.
diff --git a/django/core/management/commands/createcachetable.py b/django/core/management/commands/createcachetable.py
index c8df8d04f7..098bca793f 100644
--- a/django/core/management/commands/createcachetable.py
+++ b/django/core/management/commands/createcachetable.py
@@ -21,10 +21,10 @@ class Command(LabelCommand):
for f in fields:
field_output = [qn(f.name), f.db_type()]
field_output.append("%sNULL" % (not f.null and "NOT " or ""))
- if f.unique:
- field_output.append("UNIQUE")
if f.primary_key:
field_output.append("PRIMARY KEY")
+ elif f.unique:
+ field_output.append("UNIQUE")
if f.db_index:
unique = f.unique and "UNIQUE " or ""
index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \
diff --git a/django/core/management/commands/loaddata.py b/django/core/management/commands/loaddata.py
index 688cd58e2c..0ccc38ba8d 100644
--- a/django/core/management/commands/loaddata.py
+++ b/django/core/management/commands/loaddata.py
@@ -162,3 +162,9 @@ class Command(BaseCommand):
else:
if verbosity > 0:
print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count)
+
+ # Close the DB connection. This is required as a workaround for an
+ # edge case in MySQL: if the same connection is used to
+ # create tables, load data, and query, the query can return
+ # incorrect results. See Django #7572, MySQL #37735.
+ connection.close()
diff --git a/django/core/management/sql.py b/django/core/management/sql.py
index c635fcab8a..000886ada5 100644
--- a/django/core/management/sql.py
+++ b/django/core/management/sql.py
@@ -268,11 +268,11 @@ def sql_model_create(model, style, known_models=set()):
field_output = [style.SQL_FIELD(qn(f.column)),
style.SQL_COLTYPE(col_type)]
field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
- if f.unique and (not f.primary_key or connection.features.allows_unique_and_pk):
- field_output.append(style.SQL_KEYWORD('UNIQUE'))
if f.primary_key:
field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
- if tablespace and connection.features.supports_tablespaces and (f.unique or f.primary_key) and connection.features.autoindexes_primary_keys:
+ elif f.unique:
+ field_output.append(style.SQL_KEYWORD('UNIQUE'))
+ if tablespace and connection.features.supports_tablespaces and f.unique:
# We must specify the index tablespace inline, because we
# won't be generating a CREATE INDEX statement for this field.
field_output.append(connection.ops.tablespace_sql(tablespace, inline=True))
@@ -355,7 +355,7 @@ def many_to_many_sql_for_model(model, style):
for f in opts.local_many_to_many:
if not isinstance(f.rel, generic.GenericRel):
tablespace = f.db_tablespace or opts.db_tablespace
- if tablespace and connection.features.supports_tablespaces and connection.features.autoindexes_primary_keys:
+ if tablespace and connection.features.supports_tablespaces:
tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace, inline=True)
else:
tablespace_sql = ''
@@ -460,15 +460,14 @@ def sql_indexes_for_model(model, style):
qn = connection.ops.quote_name
for f in model._meta.local_fields:
- if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys):
- unique = f.unique and 'UNIQUE ' or ''
+ if f.db_index and not f.unique:
tablespace = f.db_tablespace or model._meta.db_tablespace
if tablespace and connection.features.supports_tablespaces:
tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace)
else:
tablespace_sql = ''
output.append(
- style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
+ style.SQL_KEYWORD('CREATE INDEX') + ' ' + \
style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \
style.SQL_KEYWORD('ON') + ' ' + \
style.SQL_TABLE(qn(model._meta.db_table)) + ' ' + \
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index 5bdf08b8ca..f88f8c70bb 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -551,6 +551,9 @@ class WSGIRequestHandler(BaseHTTPRequestHandler):
def __init__(self, *args, **kwargs):
from django.conf import settings
self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
+ # We set self.path to avoid crashes in log_message() on unsupported
+ # requests (like "OPTIONS").
+ self.path = ''
BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
def get_environ(self):
diff --git a/django/core/servers/fastcgi.py b/django/core/servers/fastcgi.py
index d7145e15ec..dc4c35b08d 100644
--- a/django/core/servers/fastcgi.py
+++ b/django/core/servers/fastcgi.py
@@ -40,6 +40,7 @@ Optional Fcgi settings: (setting=value)
workdir=DIRECTORY change to this directory when daemonizing.
outlog=FILE write stdout to this file.
errlog=FILE write stderr to this file.
+ umask=UMASK umask to use when daemonizing (default 022).
Examples:
Run a "standard" fastcgi process on a file-descriptor
@@ -73,6 +74,7 @@ FASTCGI_OPTIONS = {
'maxrequests': 0,
'outlog': None,
'errlog': None,
+ 'umask': None,
}
def fastcgi_help(message=None):
@@ -159,6 +161,8 @@ def runfastcgi(argset=[], **kwargs):
daemon_kwargs['out_log'] = options['outlog']
if options['errlog']:
daemon_kwargs['err_log'] = options['errlog']
+ if options['umask']:
+ daemon_kwargs['umask'] = int(options['umask'])
if daemonize:
from django.utils.daemonize import become_daemon
diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index 2ad63bfc7d..ff0bcbcfea 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -296,3 +296,8 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None):
kwargs = kwargs or {}
return iri_to_uri(u'/' + get_resolver(urlconf).reverse(viewname, *args, **kwargs))
+def clear_url_caches():
+ global _resolver_cache
+ global _callable_cache
+ _resolver_cache.clear()
+ _callable_cache.clear()
diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py
index 7a4e46a7d7..36a2339638 100644
--- a/django/db/backends/__init__.py
+++ b/django/db/backends/__init__.py
@@ -41,8 +41,6 @@ class BaseDatabaseWrapper(local):
class BaseDatabaseFeatures(object):
allows_group_by_ordinal = True
- allows_unique_and_pk = True
- autoindexes_primary_keys = True
inline_fk_references = True
needs_datetime_string_cast = True
supports_constraints = True
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
index 23735a023b..336ad89504 100644
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -60,7 +60,6 @@ server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
# TRADITIONAL will automatically cause most warnings to be treated as errors.
class DatabaseFeatures(BaseDatabaseFeatures):
- autoindexes_primary_keys = False
inline_fk_references = False
empty_fetchmany_value = ()
update_can_self_select = False
@@ -136,7 +135,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
features = DatabaseFeatures()
ops = DatabaseOperations()
operators = {
- 'exact': '= %s',
+ 'exact': '= BINARY %s',
'iexact': 'LIKE %s',
'contains': 'LIKE BINARY %s',
'icontains': 'LIKE %s',
diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py
index e57aee6a04..48b6b6958a 100644
--- a/django/db/backends/mysql_old/base.py
+++ b/django/db/backends/mysql_old/base.py
@@ -64,7 +64,6 @@ class MysqlDebugWrapper:
return getattr(self.cursor, attr)
class DatabaseFeatures(BaseDatabaseFeatures):
- autoindexes_primary_keys = False
inline_fk_references = False
empty_fetchmany_value = ()
update_can_self_select = False
@@ -140,7 +139,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
features = DatabaseFeatures()
ops = DatabaseOperations()
operators = {
- 'exact': '= %s',
+ 'exact': '= BINARY %s',
'iexact': 'LIKE %s',
'contains': 'LIKE BINARY %s',
'icontains': 'LIKE %s',
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index 1df6bac069..54517662c1 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -24,7 +24,6 @@ IntegrityError = Database.IntegrityError
class DatabaseFeatures(BaseDatabaseFeatures):
allows_group_by_ordinal = False
- allows_unique_and_pk = False # Suppress UNIQUE/PK for Oracle (ORA-02259)
empty_fetchmany_value = ()
needs_datetime_string_cast = False
supports_tablespaces = True
diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py
index 219686789f..2652aecfc7 100644
--- a/django/db/backends/oracle/creation.py
+++ b/django/db/backends/oracle/creation.py
@@ -23,7 +23,7 @@ DATA_TYPES = {
'ImageField': 'NVARCHAR2(%(max_length)s)',
'IntegerField': 'NUMBER(11)',
'IPAddressField': 'VARCHAR2(15)',
- 'NullBooleanField': 'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(column)s IS NULL))',
+ 'NullBooleanField': 'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))',
'OneToOneField': 'NUMBER(11)',
'PhoneNumberField': 'VARCHAR2(20)',
'PositiveIntegerField': 'NUMBER(11) CHECK (%(qn_column)s >= 0)',
diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py
index 7e27b23f72..ba6e3235c2 100644
--- a/django/db/backends/postgresql/operations.py
+++ b/django/db/backends/postgresql/operations.py
@@ -97,7 +97,7 @@ class DatabaseOperations(BaseDatabaseOperations):
# Use `coalesce` to set the sequence for each model to the max pk value if there are records,
# or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true
# if there are records (as the max pk value is already in use), otherwise set it to false.
- for f in model._meta.fields:
+ for f in model._meta.local_fields:
if isinstance(f, models.AutoField):
output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
(style.SQL_KEYWORD('SELECT'),
diff --git a/django/db/models/base.py b/django/db/models/base.py
index d7e2c299cc..12019f23df 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -50,7 +50,15 @@ class ModelBase(type):
meta = attr_meta
base_meta = getattr(new_class, '_meta', None)
- new_class.add_to_class('_meta', Options(meta))
+ if getattr(meta, 'app_label', None) is None:
+ # Figure out the app_label by looking one level up.
+ # For 'django.contrib.sites.models', this would be 'sites'.
+ model_module = sys.modules[new_class.__module__]
+ kwargs = {"app_label": model_module.__name__.split('.')[-2]}
+ else:
+ kwargs = {}
+
+ new_class.add_to_class('_meta', Options(meta, **kwargs))
if not abstract:
new_class.add_to_class('DoesNotExist',
subclass_exception('DoesNotExist', ObjectDoesNotExist, module))
@@ -71,11 +79,6 @@ class ModelBase(type):
if new_class._default_manager.model._meta.abstract:
old_default_mgr = new_class._default_manager
new_class._default_manager = None
- if getattr(new_class._meta, 'app_label', None) is None:
- # Figure out the app_label by looking one level up.
- # For 'django.contrib.sites.models', this would be 'sites'.
- model_module = sys.modules[new_class.__module__]
- new_class._meta.app_label = model_module.__name__.split('.')[-2]
# Bail out early if we have already created this class.
m = get_model(new_class._meta.app_label, name, False)
@@ -389,6 +392,21 @@ class Model(object):
for sub_obj in getattr(self, rel_opts_name).all():
sub_obj._collect_sub_objects(seen_objs, self.__class__, related.field.null)
+ # Handle any ancestors (for the model-inheritance case). We do this by
+ # traversing to the most remote parent classes -- those with no parents
+ # themselves -- and then adding those instances to the collection. That
+ # will include all the child instances down to "self".
+ parent_stack = self._meta.parents.values()
+ while parent_stack:
+ link = parent_stack.pop()
+ parent_obj = getattr(self, link.name)
+ if parent_obj._meta.parents:
+ parent_stack.extend(parent_obj._meta.parents.values())
+ continue
+ # At this point, parent_obj is base class (no ancestor models). So
+ # delete it and all its descendents.
+ parent_obj._collect_sub_objects(seen_objs)
+
def delete(self):
assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)
@@ -436,7 +454,7 @@ class Model(object):
def _get_FIELD_filename(self, field):
if getattr(self, field.attname): # value is not blank
- return os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname))
+ return os.path.normpath(os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname)))
return ''
def _get_FIELD_url(self, field):
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index d906d5bdda..8b58e69db1 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -85,7 +85,7 @@ class Field(object):
self.name = name
self.verbose_name = verbose_name
self.primary_key = primary_key
- self.max_length, self.unique = max_length, unique
+ self.max_length, self._unique = max_length, unique
self.blank, self.null = blank, null
# Oracle treats the empty string ('') as null, so coerce the null
# option whenever '' is a possible value.
@@ -160,6 +160,10 @@ class Field(object):
except KeyError:
return None
+ def unique(self):
+ return self._unique or self.primary_key
+ unique = property(unique)
+
def validate_full(self, field_data, all_data):
"""
Returns a list of errors for this field. This is the main interface,
@@ -676,7 +680,7 @@ class DecimalField(Field):
_("This value must be a decimal number."))
def _format(self, value):
- if isinstance(value, basestring):
+ if isinstance(value, basestring) or value is None:
return value
else:
return self.format_number(value)
@@ -697,8 +701,7 @@ class DecimalField(Field):
return u"%.*f" % (self.decimal_places, value)
def get_db_prep_save(self, value):
- if value is not None:
- value = self._format(value)
+ value = self._format(value)
return super(DecimalField, self).get_db_prep_save(value)
def get_db_prep_lookup(self, lookup_type, value):
@@ -1151,12 +1154,3 @@ class XMLField(TextField):
def get_manipulator_field_objs(self):
return [curry(oldforms.XMLLargeTextField, schema_path=self.schema_path)]
-class OrderingField(IntegerField):
- empty_strings_allowed=False
- def __init__(self, with_respect_to, **kwargs):
- self.wrt = with_respect_to
- kwargs['null'] = True
- IntegerField.__init__(self, **kwargs )
-
- def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
- return [oldforms.HiddenField(name_prefix + self.name)]
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 5ae94e02de..594236b4c6 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -185,11 +185,11 @@ class SingleRelatedObjectDescriptor(object):
def __set__(self, instance, value):
if instance is None:
raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
-
- # The similarity of the code below to the code in
+
+ # The similarity of the code below to the code in
# ReverseSingleRelatedObjectDescriptor is annoying, but there's a bunch
# of small differences that would make a common base class convoluted.
-
+
# If null=True, we can assign null here, but otherwise the value needs
# to be an instance of the related class.
if value is None and self.related.field.null == False:
@@ -197,14 +197,14 @@ class SingleRelatedObjectDescriptor(object):
(instance._meta.object_name, self.related.get_accessor_name()))
elif value is not None and not isinstance(value, self.related.model):
raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' %
- (value, instance._meta.object_name,
+ (value, instance._meta.object_name,
self.related.get_accessor_name(), self.related.opts.object_name))
-
+
# Set the value of the related field
setattr(value, self.related.field.rel.get_related_field().attname, instance)
# Since we already know what the related object is, seed the related
- # object caches now, too. This avoids another db hit if you get the
+ # object caches now, too. This avoids another db hit if you get the
# object you just set.
setattr(instance, self.cache_name, value)
setattr(value, self.related.field.get_cache_name(), instance)
@@ -243,7 +243,7 @@ class ReverseSingleRelatedObjectDescriptor(object):
def __set__(self, instance, value):
if instance is None:
raise AttributeError, "%s must be accessed via instance" % self._field.name
-
+
# If null=True, we can assign null here, but otherwise the value needs
# to be an instance of the related class.
if value is None and self.field.null == False:
@@ -251,9 +251,9 @@ class ReverseSingleRelatedObjectDescriptor(object):
(instance._meta.object_name, self.field.name))
elif value is not None and not isinstance(value, self.field.rel.to):
raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' %
- (value, instance._meta.object_name,
+ (value, instance._meta.object_name,
self.field.name, self.field.rel.to._meta.object_name))
-
+
# Set the value of the related field
try:
val = getattr(value, self.field.rel.get_related_field().attname)
@@ -262,7 +262,7 @@ class ReverseSingleRelatedObjectDescriptor(object):
setattr(instance, self.field.attname, val)
# Since we already know what the related object is, seed the related
- # object cache now, too. This avoids another db hit if you get the
+ # object cache now, too. This avoids another db hit if you get the
# object you just set.
setattr(instance, self.field.get_cache_name(), value)
@@ -322,7 +322,9 @@ class ForeignRelatedObjectsDescriptor(object):
clear.alters_data = True
manager = RelatedManager()
- manager.core_filters = {'%s__pk' % rel_field.name: getattr(instance, rel_field.rel.get_related_field().attname)}
+ attname = rel_field.rel.get_related_field().name
+ manager.core_filters = {'%s__%s' % (rel_field.name, attname):
+ getattr(instance, attname)}
manager.model = self.related.model
return manager
@@ -670,6 +672,11 @@ class ForeignKey(RelatedField, Field):
def contribute_to_class(self, cls, name):
super(ForeignKey, self).contribute_to_class(cls, name)
setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self))
+ if isinstance(self.rel.to, basestring):
+ target = self.rel.to
+ else:
+ target = self.rel.to._meta.db_table
+ cls._meta.duplicate_targets[self.column] = (target, "o2m")
def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
@@ -791,6 +798,12 @@ class ManyToManyField(RelatedField, Field):
# Set up the accessor for the m2m table name for the relation
self.m2m_db_table = curry(self._get_m2m_db_table, cls._meta)
+ if isinstance(self.rel.to, basestring):
+ target = self.rel.to
+ else:
+ target = self.rel.to._meta.db_table
+ cls._meta.duplicate_targets[self.column] = (target, "m2m")
+
def contribute_to_related_class(self, cls, related):
# m2m relations to self do not have a ManyRelatedObjectsDescriptor,
# as it would be redundant - unless the field is non-symmetrical.
diff --git a/django/db/models/options.py b/django/db/models/options.py
index 1ac24fb311..ffea6d5082 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -24,7 +24,7 @@ DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
'abstract')
class Options(object):
- def __init__(self, meta):
+ def __init__(self, meta, app_label=None):
self.local_fields, self.local_many_to_many = [], []
self.module_name, self.verbose_name = None, None
self.verbose_name_plural = None
@@ -32,7 +32,7 @@ class Options(object):
self.ordering = []
self.unique_together = []
self.permissions = []
- self.object_name, self.app_label = None, None
+ self.object_name, self.app_label = None, app_label
self.get_latest_by = None
self.order_with_respect_to = None
self.db_tablespace = settings.DEFAULT_TABLESPACE
@@ -43,8 +43,12 @@ class Options(object):
self.one_to_one_field = None
self.abstract = False
self.parents = SortedDict()
+ self.duplicate_targets = {}
def contribute_to_class(self, cls, name):
+ from django.db import connection
+ from django.db.backends.util import truncate_name
+
cls._meta = self
self.installed = re.sub('\.models$', '', cls.__module__) in settings.INSTALLED_APPS
# First, construct the default values for these options.
@@ -86,9 +90,13 @@ class Options(object):
self.verbose_name_plural = string_concat(self.verbose_name, 's')
del self.meta
+ # If the db_table wasn't provided, use the app_label + module_name.
+ if not self.db_table:
+ self.db_table = "%s_%s" % (self.app_label, self.module_name)
+ self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
+
+
def _prepare(self, model):
- from django.db import connection
- from django.db.backends.util import truncate_name
if self.order_with_respect_to:
self.order_with_respect_to = self.get_field(self.order_with_respect_to)
self.ordering = ('_order',)
@@ -107,10 +115,23 @@ class Options(object):
auto_created=True)
model.add_to_class('id', auto)
- # If the db_table wasn't provided, use the app_label + module_name.
- if not self.db_table:
- self.db_table = "%s_%s" % (self.app_label, self.module_name)
- self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
+ # Determine any sets of fields that are pointing to the same targets
+ # (e.g. two ForeignKeys to the same remote model). The query
+ # construction code needs to know this. At the end of this,
+ # self.duplicate_targets will map each duplicate field column to the
+ # columns it duplicates.
+ collections = {}
+ for column, target in self.duplicate_targets.iteritems():
+ try:
+ collections[target].add(column)
+ except KeyError:
+ collections[target] = set([column])
+ self.duplicate_targets = {}
+ for elt in collections.itervalues():
+ if len(elt) == 1:
+ continue
+ for column in elt:
+ self.duplicate_targets[column] = elt.difference(set([column]))
def add_field(self, field):
# Insert the given field in the order in which it was created, using
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 98caaf004c..e92f6c4275 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -3,7 +3,7 @@ import warnings
from django.conf import settings
from django.db import connection, transaction, IntegrityError
from django.db.models.fields import DateField, FieldDoesNotExist
-from django.db.models.query_utils import Q
+from django.db.models.query_utils import Q, select_related_descend
from django.db.models import signals, sql
from django.dispatch import dispatcher
from django.utils.datastructures import SortedDict
@@ -761,8 +761,7 @@ def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
index_end = index_start + len(klass._meta.fields)
obj = klass(*row[index_start:index_end])
for f in klass._meta.fields:
- if (not f.rel or (not restricted and f.null) or
- (restricted and f.name not in requested) or f.rel.parent_link):
+ if not select_related_descend(f, restricted, requested):
continue
if restricted:
next = requested[f.name]
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index 0ce7900c74..8dbb1ec667 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -48,3 +48,20 @@ class Q(tree.Node):
obj.negate()
return obj
+def select_related_descend(field, restricted, requested):
+ """
+ Returns True if this field should be used to descend deeper for
+ select_related() purposes. Used by both the query construction code
+ (sql.query.fill_related_selections()) and the model instance creation code
+ (query.get_cached_row()).
+ """
+ if not field.rel:
+ return False
+ if field.rel.parent_link:
+ return False
+ if restricted and field.name not in requested:
+ return False
+ if not restricted and field.null:
+ return False
+ return True
+
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index e8d10bc55b..6c06609969 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -7,6 +7,7 @@ databases). The abstraction barrier only works one way: this module has to know
all about the internals of models in order to get the information it needs.
"""
+import datetime
from copy import deepcopy
from django.utils.tree import Node
@@ -14,9 +15,10 @@ from django.utils.datastructures import SortedDict
from django.dispatch import dispatcher
from django.db import connection
from django.db.models import signals
+from django.db.models.fields import FieldDoesNotExist
+from django.db.models.query_utils import select_related_descend
from django.db.models.sql.where import WhereNode, EverythingNode, AND, OR
from django.db.models.sql.datastructures import Count
-from django.db.models.fields import FieldDoesNotExist
from django.core.exceptions import FieldError
from datastructures import EmptyResultSet, Empty, MultiJoin
from constants import *
@@ -56,6 +58,7 @@ class Query(object):
self.start_meta = None
self.select_fields = []
self.related_select_fields = []
+ self.dupe_avoidance = {}
# SQL-related attributes
self.select = []
@@ -164,6 +167,7 @@ class Query(object):
obj.start_meta = self.start_meta
obj.select_fields = self.select_fields[:]
obj.related_select_fields = self.related_select_fields[:]
+ obj.dupe_avoidance = self.dupe_avoidance.copy()
obj.select = self.select[:]
obj.tables = self.tables[:]
obj.where = deepcopy(self.where)
@@ -214,7 +218,7 @@ class Query(object):
obj.select_related = False
obj.related_select_cols = []
obj.related_select_fields = []
- if obj.distinct and len(obj.select) > 1:
+ if len(obj.select) > 1:
obj = self.clone(CountQuery, _query=obj, where=self.where_class(),
distinct=False)
obj.select = []
@@ -362,10 +366,21 @@ class Query(object):
item.relabel_aliases(change_map)
self.select.append(item)
self.select_fields = rhs.select_fields[:]
- self.extra_select = rhs.extra_select.copy()
- self.extra_tables = rhs.extra_tables
- self.extra_where = rhs.extra_where
- self.extra_params = rhs.extra_params
+
+ if connector == OR:
+ # It would be nice to be able to handle this, but the queries don't
+ # really make sense (or return consistent value sets). Not worth
+ # the extra complexity when you can write a real query instead.
+ if self.extra_select and rhs.extra_select:
+ raise ValueError("When merging querysets using 'or', you "
+ "cannot have extra(select=...) on both sides.")
+ if self.extra_where and rhs.extra_where:
+ raise ValueError("When merging querysets using 'or', you "
+ "cannot have extra(where=...) on both sides.")
+ self.extra_select.update(rhs.extra_select)
+ self.extra_tables += rhs.extra_tables
+ self.extra_where += rhs.extra_where
+ self.extra_params += rhs.extra_params
# Ordering uses the 'rhs' ordering, unless it has none, in which case
# the current ordering is used.
@@ -439,28 +454,39 @@ class Query(object):
self._select_aliases = aliases
return result
- def get_default_columns(self, with_aliases=False, col_aliases=None):
+ def get_default_columns(self, with_aliases=False, col_aliases=None,
+ start_alias=None, opts=None, as_pairs=False):
"""
Computes the default columns for selecting every field in the base
model.
Returns a list of strings, quoted appropriately for use in SQL
- directly, as well as a set of aliases used in the select statement.
+ directly, as well as a set of aliases used in the select statement (if
+ 'as_pairs' is True, returns a list of (alias, col_name) pairs instead
+ of strings as the first component and None as the second component).
"""
result = []
- table_alias = self.tables[0]
- root_pk = self.model._meta.pk.column
+ if opts is None:
+ opts = self.model._meta
+ if start_alias:
+ table_alias = start_alias
+ else:
+ table_alias = self.tables[0]
+ root_pk = opts.pk.column
seen = {None: table_alias}
qn = self.quote_name_unless_alias
qn2 = self.connection.ops.quote_name
aliases = set()
- for field, model in self.model._meta.get_fields_with_model():
+ for field, model in opts.get_fields_with_model():
try:
alias = seen[model]
except KeyError:
alias = self.join((table_alias, model._meta.db_table,
root_pk, model._meta.pk.column))
seen[model] = alias
+ if as_pairs:
+ result.append((alias, field.column))
+ continue
if with_aliases and field.column in col_aliases:
c_alias = 'Col%d' % len(col_aliases)
result.append('%s.%s AS %s' % (qn(alias),
@@ -473,6 +499,8 @@ class Query(object):
aliases.add(r)
if with_aliases:
col_aliases.add(field.column)
+ if as_pairs:
+ return result, None
return result, aliases
def get_from_clause(self):
@@ -609,6 +637,11 @@ class Query(object):
alias, False)
alias = joins[-1]
col = target.column
+ if not field.rel:
+ # To avoid inadvertent trimming of a necessary alias, use the
+ # refcount to show that we are referencing a non-relation field on
+ # the model.
+ self.ref_alias(alias)
# Must use left outer joins for nullable fields.
for join in joins:
@@ -829,8 +862,8 @@ class Query(object):
if reuse and always_create and table in self.table_map:
# Convert the 'reuse' to case to be "exclude everything but the
- # reusable set for this table".
- exclusions = set(self.table_map[table]).difference(reuse)
+ # reusable set, minus exclusions, for this table".
+ exclusions = set(self.table_map[table]).difference(reuse).union(set(exclusions))
always_create = False
t_ident = (lhs_table, table, lhs_col, col)
if not always_create:
@@ -865,7 +898,8 @@ class Query(object):
return alias
def fill_related_selections(self, opts=None, root_alias=None, cur_depth=1,
- used=None, requested=None, restricted=None, nullable=None):
+ used=None, requested=None, restricted=None, nullable=None,
+ dupe_set=None):
"""
Fill in the information needed for a select_related query. The current
depth is measured as the number of connections away from the root model
@@ -875,6 +909,7 @@ class Query(object):
if not restricted and self.max_depth and cur_depth > self.max_depth:
# We've recursed far enough; bail out.
return
+
if not opts:
opts = self.get_meta()
root_alias = self.get_initial_alias()
@@ -882,6 +917,10 @@ class Query(object):
self.related_select_fields = []
if not used:
used = set()
+ if dupe_set is None:
+ dupe_set = set()
+ orig_dupe_set = dupe_set
+ orig_used = used
# Setup for the case when only particular related fields should be
# included in the related selection.
@@ -893,9 +932,10 @@ class Query(object):
restricted = False
for f, model in opts.get_fields_with_model():
- if (not f.rel or (restricted and f.name not in requested) or
- (not restricted and f.null) or f.rel.parent_link):
+ if not select_related_descend(f, restricted, requested):
continue
+ dupe_set = orig_dupe_set.copy()
+ used = orig_used.copy()
table = f.rel.to._meta.db_table
if nullable or f.null:
promote = True
@@ -906,18 +946,32 @@ class Query(object):
alias = root_alias
for int_model in opts.get_base_chain(model):
lhs_col = int_opts.parents[int_model].column
+ dedupe = lhs_col in opts.duplicate_targets
+ if dedupe:
+ used.update(self.dupe_avoidance.get(id(opts), lhs_col),
+ ())
+ dupe_set.add((opts, lhs_col))
int_opts = int_model._meta
alias = self.join((alias, int_opts.db_table, lhs_col,
int_opts.pk.column), exclusions=used,
promote=promote)
+ for (dupe_opts, dupe_col) in dupe_set:
+ self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
else:
alias = root_alias
+
+ dedupe = f.column in opts.duplicate_targets
+ if dupe_set or dedupe:
+ used.update(self.dupe_avoidance.get((id(opts), f.column), ()))
+ if dedupe:
+ dupe_set.add((opts, f.column))
+
alias = self.join((alias, table, f.column,
f.rel.get_related_field().column), exclusions=used,
promote=promote)
used.add(alias)
- self.related_select_cols.extend([(alias, f2.column)
- for f2 in f.rel.to._meta.fields])
+ self.related_select_cols.extend(self.get_default_columns(
+ start_alias=alias, opts=f.rel.to._meta, as_pairs=True)[0])
self.related_select_fields.extend(f.rel.to._meta.fields)
if restricted:
next = requested.get(f.name, {})
@@ -927,8 +981,10 @@ class Query(object):
new_nullable = f.null
else:
new_nullable = None
+ for dupe_opts, dupe_col in dupe_set:
+ self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
self.fill_related_selections(f.rel.to._meta, alias, cur_depth + 1,
- used, next, restricted, new_nullable)
+ used, next, restricted, new_nullable, dupe_set)
def add_filter(self, filter_expr, connector=AND, negate=False, trim=False,
can_reuse=None):
@@ -1048,7 +1104,19 @@ class Query(object):
# that's harmless.
self.promote_alias(table)
- self.where.add((alias, col, field, lookup_type, value), connector)
+ # To save memory and copying time, convert the value from the Python
+ # object to the actual value used in the SQL query.
+ if field:
+ params = field.get_db_prep_lookup(lookup_type, value)
+ else:
+ params = Field().get_db_prep_lookup(lookup_type, value)
+ if isinstance(value, datetime.datetime):
+ annotation = datetime.datetime
+ else:
+ annotation = bool(value)
+
+ self.where.add((alias, col, field.db_type(), lookup_type, annotation,
+ params), connector)
if negate:
for alias in join_list:
@@ -1058,7 +1126,8 @@ class Query(object):
for alias in join_list:
if self.alias_map[alias][JOIN_TYPE] == self.LOUTER:
j_col = self.alias_map[alias][RHS_JOIN_COL]
- entry = Node([(alias, j_col, None, 'isnull', True)])
+ entry = Node([(alias, j_col, None, 'isnull', True,
+ [True])])
entry.negate()
self.where.add(entry, AND)
break
@@ -1066,7 +1135,7 @@ class Query(object):
# Leaky abstraction artifact: We have to specifically
# exclude the "foo__in=[]" case from this handling, because
# it's short-circuited in the Where class.
- entry = Node([(alias, col, field, 'isnull', True)])
+ entry = Node([(alias, col, None, 'isnull', True, [True])])
entry.negate()
self.where.add(entry, AND)
@@ -1114,7 +1183,9 @@ class Query(object):
(which gives the table we are joining to), 'alias' is the alias for the
table we are joining to. If dupe_multis is True, any many-to-many or
many-to-one joins will always create a new alias (necessary for
- disjunctive filters).
+ disjunctive filters). If can_reuse is not None, it's a list of aliases
+ that can be reused in these joins (nothing else can be reused in this
+ case).
Returns the final field involved in the join, the target database
column (used for any 'where' constraint), the final 'opts' value and the
@@ -1122,7 +1193,14 @@ class Query(object):
"""
joins = [alias]
last = [0]
+ dupe_set = set()
+ exclusions = set()
for pos, name in enumerate(names):
+ try:
+ exclusions.add(int_alias)
+ except NameError:
+ pass
+ exclusions.add(alias)
last.append(len(joins))
if name == 'pk':
name = opts.pk.name
@@ -1141,6 +1219,7 @@ class Query(object):
names = opts.get_all_field_names()
raise FieldError("Cannot resolve keyword %r into field. "
"Choices are: %s" % (name, ", ".join(names)))
+
if not allow_many and (m2m or not direct):
for alias in joins:
self.unref_alias(alias)
@@ -1150,12 +1229,27 @@ class Query(object):
alias_list = []
for int_model in opts.get_base_chain(model):
lhs_col = opts.parents[int_model].column
+ dedupe = lhs_col in opts.duplicate_targets
+ if dedupe:
+ exclusions.update(self.dupe_avoidance.get(
+ (id(opts), lhs_col), ()))
+ dupe_set.add((opts, lhs_col))
opts = int_model._meta
alias = self.join((alias, opts.db_table, lhs_col,
- opts.pk.column), exclusions=joins)
+ opts.pk.column), exclusions=exclusions)
joins.append(alias)
+ exclusions.add(alias)
+ for (dupe_opts, dupe_col) in dupe_set:
+ self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
cached_data = opts._join_cache.get(name)
orig_opts = opts
+ dupe_col = direct and field.column or field.field.column
+ dedupe = dupe_col in opts.duplicate_targets
+ if dupe_set or dedupe:
+ if dedupe:
+ dupe_set.add((opts, dupe_col))
+ exclusions.update(self.dupe_avoidance.get((id(opts), dupe_col),
+ ()))
if direct:
if m2m:
@@ -1177,9 +1271,11 @@ class Query(object):
target)
int_alias = self.join((alias, table1, from_col1, to_col1),
- dupe_multis, joins, nullable=True, reuse=can_reuse)
+ dupe_multis, exclusions, nullable=True,
+ reuse=can_reuse)
alias = self.join((int_alias, table2, from_col2, to_col2),
- dupe_multis, joins, nullable=True, reuse=can_reuse)
+ dupe_multis, exclusions, nullable=True,
+ reuse=can_reuse)
joins.extend([int_alias, alias])
elif field.rel:
# One-to-one or many-to-one field
@@ -1195,7 +1291,7 @@ class Query(object):
opts, target)
alias = self.join((alias, table, from_col, to_col),
- exclusions=joins, nullable=field.null)
+ exclusions=exclusions, nullable=field.null)
joins.append(alias)
else:
# Non-relation fields.
@@ -1223,9 +1319,11 @@ class Query(object):
target)
int_alias = self.join((alias, table1, from_col1, to_col1),
- dupe_multis, joins, nullable=True, reuse=can_reuse)
+ dupe_multis, exclusions, nullable=True,
+ reuse=can_reuse)
alias = self.join((int_alias, table2, from_col2, to_col2),
- dupe_multis, joins, nullable=True, reuse=can_reuse)
+ dupe_multis, exclusions, nullable=True,
+ reuse=can_reuse)
joins.extend([int_alias, alias])
else:
# One-to-many field (ForeignKey defined on the target model)
@@ -1243,14 +1341,34 @@ class Query(object):
opts, target)
alias = self.join((alias, table, from_col, to_col),
- dupe_multis, joins, nullable=True, reuse=can_reuse)
+ dupe_multis, exclusions, nullable=True,
+ reuse=can_reuse)
joins.append(alias)
+ for (dupe_opts, dupe_col) in dupe_set:
+ try:
+ self.update_dupe_avoidance(dupe_opts, dupe_col, int_alias)
+ except NameError:
+ self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
+
if pos != len(names) - 1:
raise FieldError("Join on field %r not permitted." % name)
return field, target, opts, joins, last
+ def update_dupe_avoidance(self, opts, col, alias):
+ """
+ For a column that is one of multiple pointing to the same table, update
+ the internal data structures to note that this alias shouldn't be used
+ for those other columns.
+ """
+ ident = id(opts)
+ for name in opts.duplicate_targets[col]:
+ try:
+ self.dupe_avoidance[ident, name].add(alias)
+ except KeyError:
+ self.dupe_avoidance[ident, name] = set([alias])
+
def split_exclude(self, filter_expr, prefix):
"""
When doing an exclude against any kind of N-to-many relation, we need
diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py
index 0bb741d706..d8c5b074ec 100644
--- a/django/db/models/sql/subqueries.py
+++ b/django/db/models/sql/subqueries.py
@@ -49,7 +49,7 @@ class DeleteQuery(Query):
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
where = self.where_class()
where.add((None, related.field.m2m_reverse_name(),
- related.field, 'in',
+ related.field.db_type(), 'in', True,
pk_list[offset : offset+GET_ITERATOR_CHUNK_SIZE]),
AND)
self.do_query(related.field.m2m_db_table(), where)
@@ -59,11 +59,11 @@ class DeleteQuery(Query):
if isinstance(f, generic.GenericRelation):
from django.contrib.contenttypes.models import ContentType
field = f.rel.to._meta.get_field(f.content_type_field_name)
- w1.add((None, field.column, field, 'exact',
- ContentType.objects.get_for_model(cls).id), AND)
+ w1.add((None, field.column, field.db_type(), 'exact', True,
+ [ContentType.objects.get_for_model(cls).id]), AND)
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
where = self.where_class()
- where.add((None, f.m2m_column_name(), f, 'in',
+ where.add((None, f.m2m_column_name(), f.db_type(), 'in', True,
pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]),
AND)
if w1:
@@ -81,7 +81,7 @@ class DeleteQuery(Query):
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
where = self.where_class()
field = self.model._meta.pk
- where.add((None, field.column, field, 'in',
+ where.add((None, field.column, field.db_type(), 'in', True,
pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND)
self.do_query(self.model._meta.db_table, where)
@@ -204,7 +204,7 @@ class UpdateQuery(Query):
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
self.where = self.where_class()
f = self.model._meta.pk
- self.where.add((None, f.column, f, 'in',
+ self.where.add((None, f.column, f.db_type(), 'in', True,
pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]),
AND)
self.values = [(related_field.column, None, '%s')]
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index 14e54487a3..bf45bceb4b 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -21,8 +21,9 @@ class WhereNode(tree.Node):
the correct SQL).
The children in this tree are usually either Q-like objects or lists of
- [table_alias, field_name, field_class, lookup_type, value]. However, a
- child could also be any class with as_sql() and relabel_aliases() methods.
+ [table_alias, field_name, db_type, lookup_type, value_annotation,
+ params]. However, a child could also be any class with as_sql() and
+ relabel_aliases() methods.
"""
default = AND
@@ -88,29 +89,24 @@ class WhereNode(tree.Node):
def make_atom(self, child, qn):
"""
- Turn a tuple (table_alias, field_name, field_class, lookup_type, value)
- into valid SQL.
+ Turn a tuple (table_alias, field_name, db_type, lookup_type,
+ value_annot, params) into valid SQL.
Returns the string for the SQL fragment and the parameters to use for
it.
"""
- table_alias, name, field, lookup_type, value = child
+ table_alias, name, db_type, lookup_type, value_annot, params = child
if table_alias:
lhs = '%s.%s' % (qn(table_alias), qn(name))
else:
lhs = qn(name)
- db_type = field and field.db_type() or None
field_sql = connection.ops.field_cast_sql(db_type) % lhs
- if isinstance(value, datetime.datetime):
+ if value_annot is datetime.datetime:
cast_sql = connection.ops.datetime_cast_sql()
else:
cast_sql = '%s'
- if field:
- params = field.get_db_prep_lookup(lookup_type, value)
- else:
- params = Field().get_db_prep_lookup(lookup_type, value)
if isinstance(params, QueryWrapper):
extra, params = params.data
else:
@@ -123,11 +119,11 @@ class WhereNode(tree.Node):
connection.operators[lookup_type] % cast_sql), params)
if lookup_type == 'in':
- if not value:
+ if not value_annot:
raise EmptyResultSet
if extra:
return ('%s IN %s' % (field_sql, extra), params)
- return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(value))),
+ return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(params))),
params)
elif lookup_type in ('range', 'year'):
return ('%s BETWEEN %%s and %%s' % field_sql, params)
@@ -135,8 +131,8 @@ class WhereNode(tree.Node):
return ('%s = %%s' % connection.ops.date_extract_sql(lookup_type,
field_sql), params)
elif lookup_type == 'isnull':
- return ('%s IS %sNULL' % (field_sql, (not value and 'NOT ' or '')),
- params)
+ return ('%s IS %sNULL' % (field_sql,
+ (not value_annot and 'NOT ' or '')), ())
elif lookup_type == 'search':
return (connection.ops.fulltext_search_sql(field_sql), params)
elif lookup_type in ('regex', 'iregex'):
diff --git a/django/db/transaction.py b/django/db/transaction.py
index c0c3779f6a..cd27cf6044 100644
--- a/django/db/transaction.py
+++ b/django/db/transaction.py
@@ -196,7 +196,10 @@ def commit_on_success(func):
managed(True)
try:
res = func(*args, **kw)
- except Exception, e:
+ except (Exception, KeyboardInterrupt, SystemExit):
+ # (We handle KeyboardInterrupt and SystemExit specially, since
+ # they don't inherit from Exception in Python 2.5, but we
+ # should treat them uniformly here.)
if is_dirty():
rollback()
raise
diff --git a/django/middleware/http.py b/django/middleware/http.py
index 2ef46c6b61..53b65c1034 100644
--- a/django/middleware/http.py
+++ b/django/middleware/http.py
@@ -19,14 +19,14 @@ class ConditionalGetMiddleware(object):
# Setting the status is enough here. The response handling path
# automatically removes content for this status code (in
# http.conditional_content_removal()).
- response.status = 304
+ response.status_code = 304
if response.has_header('Last-Modified'):
if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None)
if if_modified_since == response['Last-Modified']:
# Setting the status code is enough here (same reasons as
# above).
- response.status = 304
+ response.status_code = 304
return response
diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index dfe46a2e3e..6734c5450e 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -535,13 +535,17 @@ class BooleanField(Field):
def clean(self, value):
"""Returns a Python boolean object."""
- super(BooleanField, self).clean(value)
# Explicitly check for the string 'False', which is what a hidden field
# will submit for False. Because bool("True") == True, we don't need to
# handle that explicitly.
if value == 'False':
- return False
- return bool(value)
+ value = False
+ else:
+ value = bool(value)
+ super(BooleanField, self).clean(value)
+ if not value and self.required:
+ raise ValidationError(self.error_messages['required'])
+ return value
class NullBooleanField(BooleanField):
"""
diff --git a/django/test/testcases.py b/django/test/testcases.py
index ee83b960a6..3bad3995bb 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -4,10 +4,12 @@ from urlparse import urlsplit, urlunsplit
from django.http import QueryDict
from django.db import transaction
+from django.conf import settings
from django.core import mail
from django.core.management import call_command
from django.test import _doctest as doctest
from django.test.client import Client
+from django.core.urlresolvers import clear_url_caches
normalize_long_ints = lambda s: re.sub(r'(?
AuthType Basic
AuthName "example.com"
+ **AuthUserFile /dev/null**
**AuthBasicAuthoritative Off**
Require valid-user
diff --git a/docs/db-api.txt b/docs/db-api.txt
index f80d63797a..9a604bf320 100644
--- a/docs/db-api.txt
+++ b/docs/db-api.txt
@@ -443,6 +443,31 @@ This is roughly equivalent to::
Note, however, that the first of these will raise ``IndexError`` while the
second will raise ``DoesNotExist`` if no objects match the given criteria.
+Combining QuerySets
+-------------------
+
+If you have two ``QuerySet`` instances that act on the same model, you can
+combine them using ``&`` and ``|`` to get the items that are in both result
+sets or in either results set, respectively. For example::
+
+ Entry.objects.filter(pubdate__gte=date1) & \
+ Entry.objects.filter(headline__startswith="What")
+
+will combine the two queries into a single SQL query. Of course, in this case
+you could have achieved the same result using multiple filters on the same
+``QuerySet``, but sometimes the ability to combine individual ``QuerySet``
+instance is useful.
+
+Be careful, if you are using ``extra()`` to add custom handling to your
+``QuerySet`` however. All the ``extra()`` components are merged and the result
+may or may not make sense. If you are using custom SQL fragments in your
+``extra()`` calls, Django will not inspect these fragments to see if they need
+to be rewritten because of changes in the merged query. So test the effects
+carefully. Also realise that if you are combining two ``QuerySets`` with
+``|``, you cannot use ``extra(select=...)`` or ``extra(where=...)`` on *both*
+``QuerySets``. You can only use those calls on one or the other (Django will
+raise a ``ValueError`` if you try to use this incorrectly).
+
QuerySet methods that return new QuerySets
------------------------------------------
diff --git a/docs/flatpages.txt b/docs/flatpages.txt
index a538217642..f1a354c653 100644
--- a/docs/flatpages.txt
+++ b/docs/flatpages.txt
@@ -14,9 +14,14 @@ custom Django application.
A flatpage can use a custom template or a default, systemwide flatpage
template. It can be associated with one, or multiple, sites.
+**New in Django development version**
+
+The content field may optionally be left blank if you prefer to put your
+content in a custom template.
+
Here are some examples of flatpages on Django-powered sites:
- * http://www.chicagocrime.org/about/
+ * http://www.everyblock.com/about/
* http://www.lawrence.com/about/contact/
Installation
diff --git a/docs/model-api.txt b/docs/model-api.txt
index 02a9fd2d95..4accad122a 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -1677,7 +1677,7 @@ still only creating one database table per child model at the database level.
When an abstract base class is created, Django makes any ``Meta`` inner class
you declared on the base class available as an attribute. If a child class
-does not declared its own ``Meta`` class, it will inherit the parent's
+does not declare its own ``Meta`` class, it will inherit the parent's
``Meta``. If the child wants to extend the parent's ``Meta`` class, it can
subclass it. For example::
diff --git a/docs/testing.txt b/docs/testing.txt
index befa6979af..0b18545efb 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -797,6 +797,37 @@ another test, or by the order of test execution.
.. _dumpdata documentation: ../django-admin/#dumpdata-appname-appname
.. _loaddata documentation: ../django-admin/#loaddata-fixture-fixture
+URLconf configuration
+~~~~~~~~~~~~~~~~~~~~~
+
+**New in Django development version**
+
+If your application provides views, you may want to include tests that
+use the test client to exercise those views. However, an end user is free
+to deploy the views in your application at any URL of their choosing.
+This means that your tests can't rely upon the fact that your views will
+be available at a particular URL.
+
+In order to provide a reliable URL space for your test,
+``django.test.TestCase`` provides the ability to customize the URLconf
+configuration for the duration of the execution of a test suite.
+If your ``TestCase`` instance defines an ``urls`` attribute, the
+``TestCase`` will use the value of that attribute as the ``ROOT_URLCONF``
+for the duration of that test.
+
+For example::
+
+ from django.test import TestCase
+
+ class TestMyViews(TestCase):
+ urls = 'myapp.test_urls'
+
+ def testIndexPageView(self):
+ # Here you'd test your view using ``Client``.
+
+This test case will use the contents of ``myapp.test_urls`` as the
+URLconf for the duration of the test case.
+
Emptying the test outbox
~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/tests/regressiontests/extra_regress/__init__.py b/tests/regressiontests/extra_regress/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/regressiontests/extra_regress/models.py b/tests/regressiontests/extra_regress/models.py
new file mode 100644
index 0000000000..3bcc3075ec
--- /dev/null
+++ b/tests/regressiontests/extra_regress/models.py
@@ -0,0 +1,55 @@
+import copy
+
+from django.db import models
+from django.db.models.query import Q
+
+
+class RevisionableModel(models.Model):
+ base = models.ForeignKey('self', null=True)
+ title = models.CharField(blank=True, max_length=255)
+
+ def __unicode__(self):
+ return u"%s (%s, %s)" % (self.title, self.id, self.base.id)
+
+ def save(self):
+ super(RevisionableModel, self).save()
+ if not self.base:
+ self.base = self
+ super(RevisionableModel, self).save()
+
+ def new_revision(self):
+ new_revision = copy.copy(self)
+ new_revision.pk = None
+ return new_revision
+
+__test__ = {"API_TESTS": """
+### Regression tests for #7314 and #7372
+
+>>> rm = RevisionableModel.objects.create(title='First Revision')
+>>> rm.pk, rm.base.pk
+(1, 1)
+
+>>> rm2 = rm.new_revision()
+>>> rm2.title = "Second Revision"
+>>> rm2.save()
+>>> print u"%s of %s" % (rm2.title, rm2.base.title)
+Second Revision of First Revision
+
+>>> rm2.pk, rm2.base.pk
+(2, 1)
+
+Queryset to match most recent revision:
+>>> qs = RevisionableModel.objects.extra(where=["%(table)s.id IN (SELECT MAX(rev.id) FROM %(table)s AS rev GROUP BY rev.base_id)" % {'table': RevisionableModel._meta.db_table,}],)
+>>> qs
+[]
+
+Queryset to search for string in title:
+>>> qs2 = RevisionableModel.objects.filter(title__contains="Revision")
+>>> qs2
+[, ]
+
+Following queryset should return the most recent revision:
+>>> qs & qs2
+[]
+
+"""}
diff --git a/tests/regressiontests/fixtures_regress/fixtures/big-fixture.json b/tests/regressiontests/fixtures_regress/fixtures/big-fixture.json
new file mode 100644
index 0000000000..e655fbbf3f
--- /dev/null
+++ b/tests/regressiontests/fixtures_regress/fixtures/big-fixture.json
@@ -0,0 +1,83 @@
+[
+ {
+ "pk": 6,
+ "model": "fixtures_regress.channel",
+ "fields": {
+ "name": "Business"
+ }
+ },
+
+ {
+ "pk": 1,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 1",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 2,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 2",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 3,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 3",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 4,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 4",
+ "channels": [6]
+ }
+ },
+
+ {
+ "pk": 5,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 5",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 6,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 6",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 7,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 7",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 8,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Article Title 8",
+ "channels": [6]
+ }
+ },
+ {
+ "pk": 9,
+ "model": "fixtures_regress.article",
+ "fields": {
+ "title": "Yet Another Article",
+ "channels": [6]
+ }
+ }
+]
\ No newline at end of file
diff --git a/tests/regressiontests/fixtures_regress/fixtures/model-inheritance.json b/tests/regressiontests/fixtures_regress/fixtures/model-inheritance.json
new file mode 100644
index 0000000000..00c482b3dd
--- /dev/null
+++ b/tests/regressiontests/fixtures_regress/fixtures/model-inheritance.json
@@ -0,0 +1,4 @@
+[
+ {"pk": 1, "model": "fixtures_regress.parent", "fields": {"name": "fred"}},
+ {"pk": 1, "model": "fixtures_regress.child", "fields": {"data": "apple"}}
+]
diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py
index 59fc167d50..2c048dc0b8 100644
--- a/tests/regressiontests/fixtures_regress/models.py
+++ b/tests/regressiontests/fixtures_regress/models.py
@@ -20,7 +20,7 @@ class Plant(models.Model):
class Stuff(models.Model):
name = models.CharField(max_length=20, null=True)
owner = models.ForeignKey(User, null=True)
-
+
def __unicode__(self):
# Oracle doesn't distinguish between None and the empty string.
# This hack makes the test case pass using Oracle.
@@ -38,13 +38,29 @@ class Absolute(models.Model):
super(Absolute, self).__init__(*args, **kwargs)
Absolute.load_count += 1
+class Parent(models.Model):
+ name = models.CharField(max_length=10)
+
+class Child(Parent):
+ data = models.CharField(max_length=10)
+
+# Models to regresison check #7572
+class Channel(models.Model):
+ name = models.CharField(max_length=255)
+
+class Article(models.Model):
+ title = models.CharField(max_length=255)
+ channels = models.ManyToManyField(Channel)
+
+ class Meta:
+ ordering = ('id',)
__test__ = {'API_TESTS':"""
>>> from django.core import management
# Load a fixture that uses PK=1
>>> management.call_command('loaddata', 'sequence', verbosity=0)
-
+
# Create a new animal. Without a sequence reset, this new object
# will take a PK of 1 (on Postgres), and the save will fail.
# This is a regression test for ticket #3790.
@@ -61,9 +77,9 @@ __test__ = {'API_TESTS':"""
[]
###############################################
-# Regression test for ticket #6436 --
+# Regression test for ticket #6436 --
# os.path.join will throw away the initial parts of a path if it encounters
-# an absolute path. This means that if a fixture is specified as an absolute path,
+# an absolute path. This means that if a fixture is specified as an absolute path,
# we need to make sure we don't discover the absolute path in every fixture directory.
>>> load_absolute_path = os.path.join(os.path.dirname(__file__), 'fixtures', 'absolute.json')
@@ -94,4 +110,28 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.)
>>> sys.stderr = savestderr
+###############################################
+# Test for ticket #7565 -- PostgreSQL sequence resetting checks shouldn't
+# ascend to parent models when inheritance is used (since they are treated
+# individually).
+
+>>> management.call_command('loaddata', 'model-inheritance.json', verbosity=0)
+
+###############################################
+# Test for ticket #7572 -- MySQL has a problem if the same connection is
+# used to create tables, load data, and then query over that data.
+# To compensate, we close the connection after running loaddata.
+# This ensures that a new connection is opened when test queries are issued.
+
+>>> management.call_command('loaddata', 'big-fixture.json', verbosity=0)
+
+>>> articles = Article.objects.exclude(id=9)
+>>> articles.values_list('id', flat=True)
+[1, 2, 3, 4, 5, 6, 7, 8]
+
+# Just for good measure, run the same query again. Under the influence of
+# ticket #7572, this will give a different result to the previous call.
+>>> articles.values_list('id', flat=True)
+[1, 2, 3, 4, 5, 6, 7, 8]
+
"""}
diff --git a/tests/regressiontests/forms/error_messages.py b/tests/regressiontests/forms/error_messages.py
index 9f972f5b90..381282f121 100644
--- a/tests/regressiontests/forms/error_messages.py
+++ b/tests/regressiontests/forms/error_messages.py
@@ -237,7 +237,7 @@ ValidationError: [u'REQUIRED']
Traceback (most recent call last):
...
ValidationError: [u'INVALID']
->>> f.clean('http://www.jfoiwjfoi23jfoijoaijfoiwjofiwjefewl.com')
+>>> f.clean('http://www.broken.djangoproject.com')
Traceback (most recent call last):
...
ValidationError: [u'INVALID LINK']
diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py
index f3b6a96a1e..c9f3efdbda 100644
--- a/tests/regressiontests/forms/fields.py
+++ b/tests/regressiontests/forms/fields.py
@@ -887,7 +887,7 @@ u'http://www.google.com'
Traceback (most recent call last):
...
ValidationError: [u'Enter a valid URL.']
->>> f.clean('http://www.jfoiwjfoi23jfoijoaijfoiwjofiwjefewl.com') # bad domain
+>>> f.clean('http://www.broken.djangoproject.com') # bad domain
Traceback (most recent call last):
...
ValidationError: [u'This URL appears to be a broken link.']
@@ -937,18 +937,24 @@ ValidationError: [u'This field is required.']
>>> f.clean(True)
True
>>> f.clean(False)
-False
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
>>> f.clean(1)
True
>>> f.clean(0)
-False
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
>>> f.clean('Django rocks')
True
>>> f.clean('True')
True
>>> f.clean('False')
-False
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
>>> f = BooleanField(required=False)
>>> f.clean('')
diff --git a/tests/regressiontests/many_to_one_regress/models.py b/tests/regressiontests/many_to_one_regress/models.py
index 4e49df1555..429bdd7558 100644
--- a/tests/regressiontests/many_to_one_regress/models.py
+++ b/tests/regressiontests/many_to_one_regress/models.py
@@ -28,6 +28,24 @@ class Child(models.Model):
parent = models.ForeignKey(Parent)
+# Multiple paths to the same model (#7110, #7125)
+class Category(models.Model):
+ name = models.CharField(max_length=20)
+
+ def __unicode__(self):
+ return self.name
+
+class Record(models.Model):
+ category = models.ForeignKey(Category)
+
+class Relation(models.Model):
+ left = models.ForeignKey(Record, related_name='left_set')
+ right = models.ForeignKey(Record, related_name='right_set')
+
+ def __unicode__(self):
+ return u"%s - %s" % (self.left.category.name, self.right.category.name)
+
+
__test__ = {'API_TESTS':"""
>>> Third.objects.create(id='3', name='An example')
@@ -73,4 +91,26 @@ Traceback (most recent call last):
...
ValueError: Cannot assign "": "Child.parent" must be a "Parent" instance.
+# Test of multiple ForeignKeys to the same model (bug #7125)
+
+>>> c1 = Category.objects.create(name='First')
+>>> c2 = Category.objects.create(name='Second')
+>>> c3 = Category.objects.create(name='Third')
+>>> r1 = Record.objects.create(category=c1)
+>>> r2 = Record.objects.create(category=c1)
+>>> r3 = Record.objects.create(category=c2)
+>>> r4 = Record.objects.create(category=c2)
+>>> r5 = Record.objects.create(category=c3)
+>>> r = Relation.objects.create(left=r1, right=r2)
+>>> r = Relation.objects.create(left=r3, right=r4)
+>>> r = Relation.objects.create(left=r1, right=r3)
+>>> r = Relation.objects.create(left=r5, right=r2)
+>>> r = Relation.objects.create(left=r3, right=r2)
+
+>>> Relation.objects.filter(left__category__name__in=['First'], right__category__name__in=['Second'])
+[]
+
+>>> Category.objects.filter(record__left_set__right__category__name='Second').order_by('name')
+[, ]
+
"""}
diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py
index e279a0669f..c2ba9ee008 100644
--- a/tests/regressiontests/model_fields/tests.py
+++ b/tests/regressiontests/model_fields/tests.py
@@ -15,4 +15,21 @@ Decimal("3.14")
Traceback (most recent call last):
...
ValidationError: [u'This value must be a decimal number.']
+
+>>> f = DecimalField(max_digits=5, decimal_places=1)
+>>> x = f.to_python(2)
+>>> y = f.to_python('2.6')
+
+>>> f.get_db_prep_save(x)
+u'2.0'
+>>> f.get_db_prep_save(y)
+u'2.6'
+>>> f.get_db_prep_save(None)
+>>> f.get_db_prep_lookup('exact', x)
+[u'2.0']
+>>> f.get_db_prep_lookup('exact', y)
+[u'2.6']
+>>> f.get_db_prep_lookup('exact', None)
+[None]
+
"""
diff --git a/tests/regressiontests/model_inheritance_regress/models.py b/tests/regressiontests/model_inheritance_regress/models.py
index 33e2e0e4f6..24d6186150 100644
--- a/tests/regressiontests/model_inheritance_regress/models.py
+++ b/tests/regressiontests/model_inheritance_regress/models.py
@@ -131,4 +131,26 @@ __test__ = {'API_TESTS':"""
>>> Child.objects.dates('created', 'month')
[datetime.datetime(2008, 6, 1, 0, 0)]
+# Regression test for #7276: calling delete() on a model with multi-table
+# inheritance should delete the associated rows from any ancestor tables, as
+# well as any descendent objects.
+
+>>> ident = ItalianRestaurant.objects.all()[0].id
+>>> Place.objects.get(pk=ident)
+
+>>> xx = Restaurant.objects.create(name='a', address='xx', serves_hot_dogs=True, serves_pizza=False)
+
+# This should delete both Restuarants, plus the related places, plus the ItalianRestaurant.
+>>> Restaurant.objects.all().delete()
+
+>>> Place.objects.get(pk=ident)
+Traceback (most recent call last):
+...
+DoesNotExist: Place matching query does not exist.
+
+>>> ItalianRestaurant.objects.get(pk=ident)
+Traceback (most recent call last):
+...
+DoesNotExist: ItalianRestaurant matching query does not exist.
+
"""}
diff --git a/tests/regressiontests/model_inheritance_select_related/__init__.py b/tests/regressiontests/model_inheritance_select_related/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/regressiontests/model_inheritance_select_related/models.py b/tests/regressiontests/model_inheritance_select_related/models.py
new file mode 100644
index 0000000000..a97ecaadea
--- /dev/null
+++ b/tests/regressiontests/model_inheritance_select_related/models.py
@@ -0,0 +1,47 @@
+"""
+Regression tests for the interaction between model inheritance and
+select_related().
+"""
+
+from django.db import models
+
+class Place(models.Model):
+ name = models.CharField(max_length=50)
+
+ class Meta:
+ ordering = ('name',)
+
+ def __unicode__(self):
+ return u"%s the place" % self.name
+
+class Restaurant(Place):
+ serves_sushi = models.BooleanField()
+ serves_steak = models.BooleanField()
+
+ def __unicode__(self):
+ return u"%s the restaurant" % self.name
+
+class Person(models.Model):
+ name = models.CharField(max_length=50)
+ favorite_restaurant = models.ForeignKey(Restaurant)
+
+ def __unicode__(self):
+ return self.name
+
+__test__ = {'API_TESTS':"""
+Regression test for #7246
+
+>>> r1 = Restaurant.objects.create(name="Nobu", serves_sushi=True, serves_steak=False)
+>>> r2 = Restaurant.objects.create(name="Craft", serves_sushi=False, serves_steak=True)
+>>> p1 = Person.objects.create(name="John", favorite_restaurant=r1)
+>>> p2 = Person.objects.create(name="Jane", favorite_restaurant=r2)
+
+>>> Person.objects.order_by('name').select_related()
+[, ]
+
+>>> jane = Person.objects.order_by('name').select_related('favorite_restaurant')[0]
+>>> jane.favorite_restaurant.name
+u'Craft'
+
+"""}
+
diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py
index c02ad73998..566411e513 100644
--- a/tests/regressiontests/queries/models.py
+++ b/tests/regressiontests/queries/models.py
@@ -3,13 +3,15 @@ Various complex queries that have been problematic in the past.
"""
import datetime
+import pickle
from django.db import models
from django.db.models.query import Q
class Tag(models.Model):
name = models.CharField(max_length=10)
- parent = models.ForeignKey('self', blank=True, null=True)
+ parent = models.ForeignKey('self', blank=True, null=True,
+ related_name='children')
def __unicode__(self):
return self.name
@@ -24,6 +26,14 @@ class Note(models.Model):
def __unicode__(self):
return self.note
+class Annotation(models.Model):
+ name = models.CharField(max_length=10)
+ tag = models.ForeignKey(Tag)
+ notes = models.ManyToManyField(Note)
+
+ def __unicode__(self):
+ return self.name
+
class ExtraInfo(models.Model):
info = models.CharField(max_length=100)
note = models.ForeignKey(Note)
@@ -162,85 +172,67 @@ class Child(models.Model):
person = models.OneToOneField(Member, primary_key=True)
parent = models.ForeignKey(Member, related_name="children")
+# Custom primary keys interfered with ordering in the past.
+class CustomPk(models.Model):
+ name = models.CharField(max_length=10, primary_key=True)
+ extra = models.CharField(max_length=10)
+
+ class Meta:
+ ordering = ['name', 'extra']
+
+class Related(models.Model):
+ custom = models.ForeignKey(CustomPk)
+
__test__ = {'API_TESTS':"""
->>> t1 = Tag(name='t1')
->>> t1.save()
->>> t2 = Tag(name='t2', parent=t1)
->>> t2.save()
->>> t3 = Tag(name='t3', parent=t1)
->>> t3.save()
->>> t4 = Tag(name='t4', parent=t3)
->>> t4.save()
->>> t5 = Tag(name='t5', parent=t3)
->>> t5.save()
+>>> t1 = Tag.objects.create(name='t1')
+>>> t2 = Tag.objects.create(name='t2', parent=t1)
+>>> t3 = Tag.objects.create(name='t3', parent=t1)
+>>> t4 = Tag.objects.create(name='t4', parent=t3)
+>>> t5 = Tag.objects.create(name='t5', parent=t3)
->>> n1 = Note(note='n1', misc='foo')
->>> n1.save()
->>> n2 = Note(note='n2', misc='bar')
->>> n2.save()
->>> n3 = Note(note='n3', misc='foo')
->>> n3.save()
+>>> n1 = Note.objects.create(note='n1', misc='foo')
+>>> n2 = Note.objects.create(note='n2', misc='bar')
+>>> n3 = Note.objects.create(note='n3', misc='foo')
Create these out of order so that sorting by 'id' will be different to sorting
by 'info'. Helps detect some problems later.
->>> e2 = ExtraInfo(info='e2', note=n2)
->>> e2.save()
->>> e1 = ExtraInfo(info='e1', note=n1)
->>> e1.save()
+>>> e2 = ExtraInfo.objects.create(info='e2', note=n2)
+>>> e1 = ExtraInfo.objects.create(info='e1', note=n1)
->>> a1 = Author(name='a1', num=1001, extra=e1)
->>> a1.save()
->>> a2 = Author(name='a2', num=2002, extra=e1)
->>> a2.save()
->>> a3 = Author(name='a3', num=3003, extra=e2)
->>> a3.save()
->>> a4 = Author(name='a4', num=4004, extra=e2)
->>> a4.save()
+>>> a1 = Author.objects.create(name='a1', num=1001, extra=e1)
+>>> a2 = Author.objects.create(name='a2', num=2002, extra=e1)
+>>> a3 = Author.objects.create(name='a3', num=3003, extra=e2)
+>>> a4 = Author.objects.create(name='a4', num=4004, extra=e2)
>>> time1 = datetime.datetime(2007, 12, 19, 22, 25, 0)
>>> time2 = datetime.datetime(2007, 12, 19, 21, 0, 0)
>>> time3 = datetime.datetime(2007, 12, 20, 22, 25, 0)
>>> time4 = datetime.datetime(2007, 12, 20, 21, 0, 0)
->>> i1 = Item(name='one', created=time1, modified=time1, creator=a1, note=n3)
->>> i1.save()
+>>> i1 = Item.objects.create(name='one', created=time1, modified=time1, creator=a1, note=n3)
>>> i1.tags = [t1, t2]
->>> i2 = Item(name='two', created=time2, creator=a2, note=n2)
->>> i2.save()
+>>> i2 = Item.objects.create(name='two', created=time2, creator=a2, note=n2)
>>> i2.tags = [t1, t3]
->>> i3 = Item(name='three', created=time3, creator=a2, note=n3)
->>> i3.save()
->>> i4 = Item(name='four', created=time4, creator=a4, note=n3)
->>> i4.save()
+>>> i3 = Item.objects.create(name='three', created=time3, creator=a2, note=n3)
+>>> i4 = Item.objects.create(name='four', created=time4, creator=a4, note=n3)
>>> i4.tags = [t4]
->>> r1 = Report(name='r1', creator=a1)
->>> r1.save()
->>> r2 = Report(name='r2', creator=a3)
->>> r2.save()
->>> r3 = Report(name='r3')
->>> r3.save()
+>>> r1 = Report.objects.create(name='r1', creator=a1)
+>>> r2 = Report.objects.create(name='r2', creator=a3)
+>>> r3 = Report.objects.create(name='r3')
Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the Meta.ordering
will be rank3, rank2, rank1.
->>> rank1 = Ranking(rank=2, author=a2)
->>> rank1.save()
->>> rank2 = Ranking(rank=1, author=a3)
->>> rank2.save()
->>> rank3 = Ranking(rank=3, author=a1)
->>> rank3.save()
+>>> rank1 = Ranking.objects.create(rank=2, author=a2)
+>>> rank2 = Ranking.objects.create(rank=1, author=a3)
+>>> rank3 = Ranking.objects.create(rank=3, author=a1)
->>> c1 = Cover(title="first", item=i4)
->>> c1.save()
->>> c2 = Cover(title="second", item=i2)
->>> c2.save()
+>>> c1 = Cover.objects.create(title="first", item=i4)
+>>> c2 = Cover.objects.create(title="second", item=i2)
->>> n1 = Number(num=4)
->>> n1.save()
->>> n2 = Number(num=8)
->>> n2.save()
->>> n3 = Number(num=12)
->>> n3.save()
+>>> num1 = Number.objects.create(num=4)
+>>> num2 = Number.objects.create(num=8)
+>>> num3 = Number.objects.create(num=12)
Bug #1050
>>> Item.objects.filter(tags__isnull=True)
@@ -346,6 +338,10 @@ Bug #1878, #2939
4
>>> xx.delete()
+Bug #7323
+>>> Item.objects.values('creator', 'name').count()
+4
+
Bug #2253
>>> q1 = Item.objects.order_by('name')
>>> q2 = Item.objects.filter(id=i1.id)
@@ -387,6 +383,10 @@ Bug #4510
>>> Author.objects.filter(report__name='r1')
[]
+Bug #7378
+>>> a1.report_set.all()
+[]
+
Bug #5324, #6704
>>> Item.objects.filter(tags__name='t4')
[]
@@ -791,5 +791,19 @@ Empty querysets can be merged with others.
>>> Note.objects.all() & Note.objects.none()
[]
+Bug #7204, #7506 -- make sure querysets with related fields can be pickled. If
+this doesn't crash, it's a Good Thing.
+>>> out = pickle.dumps(Item.objects.all())
+
+Bug #7277
+>>> ann1 = Annotation.objects.create(name='a1', tag=t1)
+>>> ann1.notes.add(n1)
+>>> n1.annotation_set.filter(Q(tag=t5) | Q(tag__children=t5) | Q(tag__children__children=t5))
+[]
+
+Bug #7371
+>>> Related.objects.order_by('custom')
+[]
+
"""}
diff --git a/tests/regressiontests/select_related_regress/__init__.py b/tests/regressiontests/select_related_regress/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/regressiontests/select_related_regress/models.py b/tests/regressiontests/select_related_regress/models.py
new file mode 100644
index 0000000000..1688053e2d
--- /dev/null
+++ b/tests/regressiontests/select_related_regress/models.py
@@ -0,0 +1,60 @@
+from django.db import models
+
+class Building(models.Model):
+ name = models.CharField(max_length=10)
+
+ def __unicode__(self):
+ return u"Building: %s" % self.name
+
+class Device(models.Model):
+ building = models.ForeignKey('Building')
+ name = models.CharField(max_length=10)
+
+ def __unicode__(self):
+ return u"device '%s' in building %s" % (self.name, self.building)
+
+class Port(models.Model):
+ device = models.ForeignKey('Device')
+ number = models.CharField(max_length=10)
+
+ def __unicode__(self):
+ return u"%s/%s" % (self.device.name, self.number)
+
+class Connection(models.Model):
+ start = models.ForeignKey(Port, related_name='connection_start',
+ unique=True)
+ end = models.ForeignKey(Port, related_name='connection_end', unique=True)
+
+ def __unicode__(self):
+ return u"%s to %s" % (self.start, self.end)
+
+__test__ = {'API_TESTS': """
+Regression test for bug #7110. When using select_related(), we must query the
+Device and Building tables using two different aliases (each) in order to
+differentiate the start and end Connection fields. The net result is that both
+the "connections = ..." queries here should give the same results.
+
+>>> b=Building.objects.create(name='101')
+>>> dev1=Device.objects.create(name="router", building=b)
+>>> dev2=Device.objects.create(name="switch", building=b)
+>>> dev3=Device.objects.create(name="server", building=b)
+>>> port1=Port.objects.create(number='4',device=dev1)
+>>> port2=Port.objects.create(number='7',device=dev2)
+>>> port3=Port.objects.create(number='1',device=dev3)
+>>> c1=Connection.objects.create(start=port1, end=port2)
+>>> c2=Connection.objects.create(start=port2, end=port3)
+
+>>> connections=Connection.objects.filter(start__device__building=b, end__device__building=b).order_by('id')
+>>> [(c.id, unicode(c.start), unicode(c.end)) for c in connections]
+[(1, u'router/4', u'switch/7'), (2, u'switch/7', u'server/1')]
+
+>>> connections=Connection.objects.filter(start__device__building=b, end__device__building=b).select_related().order_by('id')
+>>> [(c.id, unicode(c.start), unicode(c.end)) for c in connections]
+[(1, u'router/4', u'switch/7'), (2, u'switch/7', u'server/1')]
+
+# This final query should only join seven tables (port, device and building
+# twice each, plus connection once).
+>>> connections.query.count_active_tables()
+7
+
+"""}
diff --git a/tests/regressiontests/string_lookup/models.py b/tests/regressiontests/string_lookup/models.py
index 1bdb2d4452..39e7955592 100644
--- a/tests/regressiontests/string_lookup/models.py
+++ b/tests/regressiontests/string_lookup/models.py
@@ -97,6 +97,12 @@ __test__ = {'API_TESTS': ur"""
>>> Article.objects.get(text__exact='The quick brown fox jumps over the lazy dog.')
+# Regression tests for #2170: test case sensitiveness
+>>> Article.objects.filter(text__exact='tHe qUick bRown fOx jUmps over tHe lazy dog.')
+[]
+>>> Article.objects.filter(text__iexact='tHe qUick bRown fOx jUmps over tHe lazy dog.')
+[]
+
>>> Article.objects.get(text__contains='quick brown fox')
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
index a204ec3e72..37e81668b6 100644
--- a/tests/regressiontests/test_client_regress/models.py
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -318,3 +318,22 @@ class ExceptionTests(TestCase):
self.client.get("/test_client_regress/staff_only/")
except SuspiciousOperation:
self.fail("Staff should be able to visit this page")
+
+# We need two different tests to check URLconf subsitution - one to check
+# it was changed, and another one (without self.urls) to check it was reverted on
+# teardown. This pair of tests relies upon the alphabetical ordering of test execution.
+class UrlconfSubstitutionTests(TestCase):
+ urls = 'regressiontests.test_client_regress.urls'
+
+ def test_urlconf_was_changed(self):
+ "TestCase can enforce a custom URLConf on a per-test basis"
+ url = reverse('arg_view', args=['somename'])
+ self.assertEquals(url, '/arg_view/somename/')
+
+# This test needs to run *after* UrlconfSubstitutionTests; the zz prefix in the
+# name is to ensure alphabetical ordering.
+class zzUrlconfSubstitutionTests(TestCase):
+ def test_urlconf_was_reverted(self):
+ "URLconf is reverted to original value after modification in a TestCase"
+ url = reverse('arg_view', args=['somename'])
+ self.assertEquals(url, '/test_client_regress/arg_view/somename/')