From 28fd32318fda234c7788a7a6ec2049f0fbb066d7 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 24 Nov 2005 03:32:26 +0000 Subject: [PATCH 01/13] Updated django.utils.translation due to template changes from [1379]. From new-admin. git-svn-id: http://code.djangoproject.com/svn/django/trunk@1388 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/utils/translation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django/utils/translation.py b/django/utils/translation.py index ae9788e56d..a8a943e391 100644 --- a/django/utils/translation.py +++ b/django/utils/translation.py @@ -364,18 +364,18 @@ endblock_re = re.compile(r"""^\s*endblocktrans$""") plural_re = re.compile(r"""^\s*plural$""") constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""") def templateize(src): - from django.core.template import tokenize, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK """ Turns a Django template into something that is understood by xgettext. It does so by translating the Django translation tags into standard gettext function invocations. """ + from django.core.template import Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK out = StringIO() intrans = False inplural = False singular = [] plural = [] - for t in tokenize(src): + for t in Lexer(src, None).tokenize(): if intrans: if t.token_type == TOKEN_BLOCK: endbmatch = endblock_re.match(t.contents) From f286461e2aed0bab1edcd8d7f42bbfcfeac74930 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Thu, 24 Nov 2005 05:20:27 +0000 Subject: [PATCH 02/13] Fixed small typo in User object; thanks David Ascher git-svn-id: http://code.djangoproject.com/svn/django/trunk@1396 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/models/auth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/models/auth.py b/django/models/auth.py index 21b4c2f146..2595727ad0 100644 --- a/django/models/auth.py +++ b/django/models/auth.py @@ -34,7 +34,7 @@ class User(meta.Model): first_name = meta.CharField(_('first name'), maxlength=30, blank=True) last_name = meta.CharField(_('last name'), maxlength=30, blank=True) email = meta.EmailField(_('e-mail address'), blank=True) - password = meta.CharField(_('password'), maxlength=128, help_text=_("Use '[algo]$[salt]$[hexdigest]")) + password = meta.CharField(_('password'), maxlength=128, help_text=_("Use '[algo]$[salt]$[hexdigest]'")) is_staff = meta.BooleanField(_('staff status'), help_text=_("Designates whether the user can log into this admin site.")) is_active = meta.BooleanField(_('active'), default=True) is_superuser = meta.BooleanField(_('superuser status')) From 834e7d348261214cead805087a0d0e03623159db Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Thu, 24 Nov 2005 18:30:31 +0000 Subject: [PATCH 03/13] fixed a typo in a trans template tag. Thx David Ascher (on IRC) git-svn-id: http://code.djangoproject.com/svn/django/trunk@1397 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../admin/templates/registration/password_reset_form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/contrib/admin/templates/registration/password_reset_form.html b/django/contrib/admin/templates/registration/password_reset_form.html index 8db1ede42f..9a8ac1a6d6 100644 --- a/django/contrib/admin/templates/registration/password_reset_form.html +++ b/django/contrib/admin/templates/registration/password_reset_form.html @@ -7,7 +7,7 @@ {% block content %} -

{% trans "Password reset") }}

+

{% trans "Password reset") %}

{% trans "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you." %}

From c616d869ed72d429503003afbae9cc71343502c2 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Thu, 24 Nov 2005 18:31:49 +0000 Subject: [PATCH 04/13] fixes #898 - updated 'sk' translation. Additional a small fix in the 'de' translation (removed a "fuzzy"). git-svn-id: http://code.djangoproject.com/svn/django/trunk@1398 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/locale/de/LC_MESSAGES/django.mo | Bin 23616 -> 23618 bytes django/conf/locale/de/LC_MESSAGES/django.po | 45 +-- django/conf/locale/sk/LC_MESSAGES/django.mo | Bin 18399 -> 23384 bytes django/conf/locale/sk/LC_MESSAGES/django.po | 373 ++++++++++---------- 4 files changed, 211 insertions(+), 207 deletions(-) diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo index 5da1381961e116f1c0a2147de453f74eb7f2a63c..4cfc409cb1b5d97b32d94254eac585688bd5d22e 100644 GIT binary patch delta 3140 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\n" "Language-Team: \n" @@ -560,6 +560,7 @@ msgstr "Ihr Kennwort wurde ge #: 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 "Kennwort zurcksetzen" @@ -988,8 +989,8 @@ msgid "password" msgstr "Kennwort" #: models/auth.py:37 -msgid "Use '[algo]$[salt]$[hexdigest]" -msgstr "Im Format '[algo]$[salt]$[hexdigest]" +msgid "Use '[algo]$[salt]$[hexdigest]'" +msgstr "Im Format '[algo]$[salt]$[hexdigest]'" #: models/auth.py:38 msgid "staff status" @@ -1040,79 +1041,79 @@ msgstr "Wichtige Daten" msgid "Message" msgstr "Mitteilung" -#: conf/global_settings.py:36 +#: conf/global_settings.py:37 msgid "Bengali" msgstr "Bengali" -#: conf/global_settings.py:37 +#: conf/global_settings.py:38 msgid "Czech" msgstr "Tschechisch" -#: conf/global_settings.py:38 +#: conf/global_settings.py:39 msgid "Welsh" msgstr "Walisisch" -#: conf/global_settings.py:39 +#: conf/global_settings.py:40 msgid "Danish" msgstr "Dnisch" -#: conf/global_settings.py:40 +#: conf/global_settings.py:41 msgid "German" msgstr "Deutsch" -#: conf/global_settings.py:41 +#: conf/global_settings.py:42 msgid "English" msgstr "Englisch" -#: conf/global_settings.py:42 +#: conf/global_settings.py:43 msgid "Spanish" msgstr "Spanisch" -#: conf/global_settings.py:43 +#: conf/global_settings.py:44 msgid "French" msgstr "Franzsisch" -#: conf/global_settings.py:44 +#: conf/global_settings.py:45 msgid "Galician" msgstr "Galicisch" -#: conf/global_settings.py:45 +#: conf/global_settings.py:46 msgid "Icelandic" msgstr "Islndisch" -#: conf/global_settings.py:46 +#: conf/global_settings.py:47 msgid "Italian" msgstr "Italienisch" -#: conf/global_settings.py:47 +#: conf/global_settings.py:48 msgid "Norwegian" msgstr "Norwegisch" -#: conf/global_settings.py:48 +#: conf/global_settings.py:49 msgid "Brazilian" msgstr "Brasilianisch" -#: conf/global_settings.py:49 +#: conf/global_settings.py:50 msgid "Romanian" msgstr "Rumnisch" -#: conf/global_settings.py:50 +#: conf/global_settings.py:51 msgid "Russian" msgstr "Russisch" -#: conf/global_settings.py:51 +#: conf/global_settings.py:52 msgid "Slovak" msgstr "Slowakisch" -#: conf/global_settings.py:52 +#: conf/global_settings.py:53 msgid "Serbian" msgstr "Serbisch" -#: conf/global_settings.py:53 +#: conf/global_settings.py:54 msgid "Swedish" msgstr "Schwedisch" -#: conf/global_settings.py:54 +#: conf/global_settings.py:55 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo index 2979161d55cb929dac4559384f6fdc6ebba3e9b3..9fddf972d3514da4b2012141403adfbbd20b54eb 100644 GIT binary patch delta 10290 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 bIblxjz_N3P_+~~0wO&5vGU?om<-7hDL@$EF delta 5372 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 diff --git a/django/conf/locale/sk/LC_MESSAGES/django.po b/django/conf/locale/sk/LC_MESSAGES/django.po index 721a0f78c7..57bd38c2fd 100644 --- a/django/conf/locale/sk/LC_MESSAGES/django.po +++ b/django/conf/locale/sk/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2005-11-23 11:35-0600\n" +"POT-Creation-Date: 2005-11-24 06:34-0500\n" "PO-Revision-Date: 2005-11-10 23:22-0500\n" "Last-Translator: Vladimir Labath \n" "Language-Team: Slovak \n" @@ -16,97 +16,125 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +#: contrib/redirects/models/redirects.py:7 +msgid "redirect from" +msgstr "presmerovaný z" + +#: contrib/redirects/models/redirects.py:8 +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Tu by sa mala použiť absolútna cesta, bez domény. Napr.: '/events/search/'." + +#: contrib/redirects/models/redirects.py:9 +msgid "redirect to" +msgstr "presmerovaný na " + +#: contrib/redirects/models/redirects.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Tu môže byť buď absolútna cesta (ako hore) alebo plné URL začínajúce s " +"'http://'." + +#: contrib/redirects/models/redirects.py:12 +msgid "redirect" +msgstr "presmerovanie" + +#: contrib/redirects/models/redirects.py:13 +msgid "redirects" +msgstr "presmerovania" + #: contrib/comments/models/comments.py:8 #: contrib/comments/models/comments.py:161 -#, fuzzy msgid "object ID" -msgstr "objekt id" +msgstr "objekt ID" #: contrib/comments/models/comments.py:9 msgid "headline" -msgstr "" +msgstr "titulok" #: contrib/comments/models/comments.py:10 #: contrib/comments/models/comments.py:162 -#, fuzzy msgid "comment" -msgstr "obsah" +msgstr "komentár" #: contrib/comments/models/comments.py:11 msgid "rating #1" -msgstr "" +msgstr "hodnotenie #1" #: contrib/comments/models/comments.py:12 msgid "rating #2" -msgstr "" +msgstr "hodnotenie #2" #: contrib/comments/models/comments.py:13 msgid "rating #3" -msgstr "" +msgstr "hodnotenie #3" #: contrib/comments/models/comments.py:14 msgid "rating #4" -msgstr "" +msgstr "hodnotenie #4" #: contrib/comments/models/comments.py:15 msgid "rating #5" -msgstr "" +msgstr "hodnotenie #5" #: contrib/comments/models/comments.py:16 msgid "rating #6" -msgstr "" +msgstr "hodnotenie #6" #: contrib/comments/models/comments.py:17 msgid "rating #7" -msgstr "" +msgstr "hodnotenie #7" #: contrib/comments/models/comments.py:18 msgid "rating #8" -msgstr "" +msgstr "hodnotenie #8" #: contrib/comments/models/comments.py:23 msgid "is valid rating" -msgstr "" +msgstr "je platné hodnotenie" #: contrib/comments/models/comments.py:24 #: contrib/comments/models/comments.py:164 msgid "date/time submitted" -msgstr "" +msgstr "dátum/čas poslania" #: contrib/comments/models/comments.py:25 #: contrib/comments/models/comments.py:165 msgid "is public" -msgstr "" +msgstr "je zveréjnený" #: contrib/comments/models/comments.py:26 contrib/admin/views/doc.py:274 -#, fuzzy msgid "IP address" -msgstr "emailová adresa" +msgstr "IP adresa" #: contrib/comments/models/comments.py:27 msgid "is removed" -msgstr "" +msgstr "je vymazaný" #: contrib/comments/models/comments.py:27 msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." msgstr "" +"Ak je tento komentár nevhodný, tu ho poznačte. \"Tento komentár bol vymazaný" +"\" táto správa sa objaví namiesto neho." #: contrib/comments/models/comments.py:31 msgid "Comment" -msgstr "" +msgstr "Komentár" #: contrib/comments/models/comments.py:32 -#, fuzzy msgid "Comments" -msgstr "povolené komentáre" +msgstr "Komentáre" #: contrib/comments/models/comments.py:85 #: contrib/comments/models/comments.py:204 -#, fuzzy msgid "Content object" -msgstr "typ obsahu" +msgstr "Obsah objektu" #: contrib/comments/models/comments.py:113 #, python-format @@ -117,72 +145,69 @@ msgid "" "\n" "http://%(domain)s%(url)s" msgstr "" +"Poslal %(user)s at %(date)s\n" +"\n" +"%(comment)s\n" +"\n" +"http://%(domain)s%(url)s" #: contrib/comments/models/comments.py:163 -#, fuzzy msgid "person's name" msgstr "krstné meno" #: contrib/comments/models/comments.py:166 -#, fuzzy msgid "ip address" -msgstr "emailová adresa" +msgstr "ip adresa" #: contrib/comments/models/comments.py:168 msgid "approved by staff" -msgstr "" +msgstr "je zamestnancom" #: contrib/comments/models/comments.py:172 -#, fuzzy msgid "Free comment" -msgstr "povolené komentáre" +msgstr "Voľný komentár" #: contrib/comments/models/comments.py:173 -#, fuzzy msgid "Free comments" -msgstr "povolené komentáre" +msgstr "Voľné komentáre" #: contrib/comments/models/comments.py:209 msgid "score" -msgstr "" +msgstr "stav" #: contrib/comments/models/comments.py:210 -#, fuzzy msgid "score date" -msgstr "dátum konca platnosti" +msgstr "údaje stavu" #: contrib/comments/models/comments.py:213 msgid "Karma score" -msgstr "" +msgstr "Karma údaj" #: contrib/comments/models/comments.py:214 msgid "Karma scores" -msgstr "" +msgstr "Karma údaje" #: contrib/comments/models/comments.py:223 #, python-format msgid "%(score)d rating by %(user)s" -msgstr "" +msgstr "%(score)d hodnotil %(user)s" #: contrib/comments/models/comments.py:248 -#, fuzzy msgid "flag date" -msgstr "plochá stránka" +msgstr "dátumové návestie" #: contrib/comments/models/comments.py:251 -#, fuzzy msgid "User flag" -msgstr "Uživateľ" +msgstr "Návestie uživateľa" #: contrib/comments/models/comments.py:252 -#, fuzzy msgid "User flags" -msgstr "Užívatelia" +msgstr "Návestia užívateľa" #: contrib/comments/models/comments.py:256 #, python-format msgid "Flag by %r" -msgstr "" +msgstr " %r návestie" #: contrib/comments/models/comments.py:271 #, python-format @@ -191,42 +216,43 @@ msgid "" "\n" "%(text)s" msgstr "" +"Tento komentár bol označený %(user)s:\n" +"\n" +"%(text)s" #: contrib/comments/models/comments.py:278 -#, fuzzy msgid "deletion date" -msgstr "údaje sedenia" +msgstr "odstránené dátumy" #: contrib/comments/models/comments.py:281 msgid "Moderator deletion" -msgstr "" +msgstr "Moderátor odstránenia" #: contrib/comments/models/comments.py:282 msgid "Moderator deletions" -msgstr "" +msgstr "Moderátor odstránení" #: contrib/comments/models/comments.py:286 #, python-format msgid "Moderator deletion by %r" -msgstr "" +msgstr "Moderátor odstránenia %r" #: contrib/comments/views/karma.py:18 msgid "Anonymous users cannot vote" -msgstr "" +msgstr "Hlasovať môžu len prihlásení užívatelia" #: contrib/comments/views/karma.py:22 -#, fuzzy msgid "Invalid comment ID" -msgstr "povolené komentáre" +msgstr "Chybné ID komentára" #: contrib/comments/views/karma.py:24 msgid "No voting for yourself" -msgstr "" +msgstr "Nemôžeš hlasovať za seba" #: contrib/comments/views/comments.py:25 msgid "" "This rating is required because you've entered at least one other rating." -msgstr "" +msgstr "Toto hlasovanie je nevyhnutné, lebo súvisí s predchádzjúcou voľbou." #: contrib/comments/views/comments.py:109 #, python-format @@ -241,7 +267,15 @@ msgid_plural "" "\n" "%(text)s" msgstr[0] "" +"Tento komentár bol užívateľom ktorý doteraz poslal minimálne %(count)s " +"komentár:\n" +"\n" +"%(text)s" msgstr[1] "" +"Tento komentár bol užívateľom ktorý doteraz poslal najmenej %(count)s " +"komentárov:\n" +"\n" +"%(text)s" #: contrib/comments/views/comments.py:114 #, python-format @@ -250,21 +284,24 @@ msgid "" "\n" "%(text)s" msgstr "" +"Tento komentár je od veľmi náznakového užívateľa:\n" +"\n" +"%(text)s" #: contrib/comments/views/comments.py:186 #: contrib/comments/views/comments.py:277 msgid "Only POSTs are allowed" -msgstr "" +msgstr "Dovolené sú len POST" #: contrib/comments/views/comments.py:190 #: contrib/comments/views/comments.py:281 msgid "One or more of the required fields wasn't submitted" -msgstr "" +msgstr "Jedno alebo viac povinných polí nebolo vložených" #: contrib/comments/views/comments.py:194 #: contrib/comments/views/comments.py:283 msgid "Somebody tampered with the comment form (security violation)" -msgstr "" +msgstr "Niekto skúšal manipulovať s formulárom komentára (porušená bezpečnosť)" #: contrib/comments/views/comments.py:204 #: contrib/comments/views/comments.py:289 @@ -272,11 +309,65 @@ msgid "" "The comment form had an invalid 'target' parameter -- the object ID was " "invalid" msgstr "" +"Formulár komentára ma chybný 'cieľový' parameter -- the objekt ID bol " +"poškodený" #: contrib/comments/views/comments.py:254 #: contrib/comments/views/comments.py:318 msgid "The comment form didn't provide either 'preview' or 'post'" +msgstr "Formulár komentára neposkytuje odpoveď buď 'prezri' alebo 'pošli'" + +#: contrib/flatpages/models/flatpages.py:6 contrib/admin/views/doc.py:284 +msgid "URL" +msgstr "URL" + +#: contrib/flatpages/models/flatpages.py:7 +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "" +"Príklad: '/about/contact/'. Uistite sa, že máte vložené ako úvodné tak aj " +"záverečné lomítka." + +#: contrib/flatpages/models/flatpages.py:8 +msgid "title" +msgstr "názov" + +#: contrib/flatpages/models/flatpages.py:9 +msgid "content" +msgstr "obsah" + +#: contrib/flatpages/models/flatpages.py:10 +msgid "enable comments" +msgstr "povolené komentáre" + +#: contrib/flatpages/models/flatpages.py:11 +msgid "template name" +msgstr "meno predlohy" + +#: contrib/flatpages/models/flatpages.py:12 +msgid "" +"Example: 'flatpages/contact_page'. If this isn't provided, the system will " +"use 'flatpages/default'." +msgstr "" +"Príklad: 'flatpages/contact_page'. Ak sa toto nevykonalo, systém použije " +"'flatpages/default'." + +#: contrib/flatpages/models/flatpages.py:13 +msgid "registration required" +msgstr "musíte byť zaregistrovaný" + +#: contrib/flatpages/models/flatpages.py:13 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Ak je toto označené, potom len prihlásený užívateľ môže vidieť túto stránku." + +#: contrib/flatpages/models/flatpages.py:17 +msgid "flat page" +msgstr "plochá stránka" + +#: contrib/flatpages/models/flatpages.py:18 +msgid "flat pages" +msgstr "ploché stránky" #: contrib/admin/models/admin.py:6 msgid "action time" @@ -310,77 +401,68 @@ msgstr "záznamy priebehu" #: contrib/admin/views/doc.py:273 contrib/admin/views/doc.py:278 #: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:281 msgid "Integer" -msgstr "" +msgstr "Celočíselná hodnota" #: contrib/admin/views/doc.py:263 msgid "Boolean (Either True or False)" -msgstr "" +msgstr "Logická hodnota (buď True alebo False)" #: contrib/admin/views/doc.py:264 #, python-format msgid "String (up to %(maxlength)s)" -msgstr "" +msgstr "Reťazec (maximálne do %(maxlength)s)" #: contrib/admin/views/doc.py:265 msgid "Comma-separated integers" -msgstr "" +msgstr "Čiarka oddeľuje celé čísla" #: contrib/admin/views/doc.py:266 -#, fuzzy msgid "Date (without time)" -msgstr "čas udalosti" +msgstr "Dátum (bez času)" #: contrib/admin/views/doc.py:267 -#, fuzzy msgid "Date (with time)" -msgstr "Dátum/čas" +msgstr "Dátum ( a čas)" #: contrib/admin/views/doc.py:268 -#, fuzzy msgid "E-mail address" msgstr "E-mailová adresa" #: contrib/admin/views/doc.py:269 contrib/admin/views/doc.py:272 msgid "File path" -msgstr "" +msgstr "Cesta k súboru" #: contrib/admin/views/doc.py:270 -#, fuzzy msgid "Decimal number" -msgstr "December" +msgstr "Desiatkové číslo" #: contrib/admin/views/doc.py:276 msgid "Boolean (Either True, False or None)" -msgstr "" +msgstr "Logická hodnota (buď True, False alebo None)" #: contrib/admin/views/doc.py:277 -#, fuzzy msgid "Phone number" -msgstr "Vložte celé číslo." +msgstr "Číslo telefónu" #: contrib/admin/views/doc.py:280 msgid "String (up to 50)" -msgstr "" +msgstr "Reťazec (do 50 )" #: contrib/admin/views/doc.py:282 msgid "Text" -msgstr "" +msgstr "Text" #: contrib/admin/views/doc.py:283 msgid "Time" -msgstr "" - -#: contrib/admin/views/doc.py:284 contrib/flatpages/models/flatpages.py:6 -msgid "URL" -msgstr "URL" +msgstr "Čas" #: contrib/admin/views/doc.py:285 msgid "U.S. state (two uppercase letters)" -msgstr "" +msgstr "U.S. štát (dve veľké písmena)" #: contrib/admin/views/doc.py:286 msgid "XML text" -msgstr "" +msgstr "XML text" #: contrib/admin/templates/admin/object_history.html:5 #: contrib/admin/templates/admin/500.html:4 @@ -566,7 +648,7 @@ msgstr "" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" -msgstr "E-mailová adresa" +msgstr "E-mailová adresa:" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "Reset my password" @@ -648,85 +730,6 @@ msgstr "Ďakujeme, že používate naše stránky!" msgid "The %(site_name)s team" msgstr "Skupina %(site_name)s" -#: contrib/redirects/models/redirects.py:7 -msgid "redirect from" -msgstr "presmerovaný z" - -#: contrib/redirects/models/redirects.py:8 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Tu by sa mala použiť absolútna cesta, bez domény. Napr.: '/events/search/'." - -#: contrib/redirects/models/redirects.py:9 -msgid "redirect to" -msgstr "presmerovaný na " - -#: contrib/redirects/models/redirects.py:10 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Tu môže byť buď absolútna cesta (ako hore) alebo plné URL začínajúce s " -"'http://'." - -#: contrib/redirects/models/redirects.py:12 -msgid "redirect" -msgstr "presmerovanie" - -#: contrib/redirects/models/redirects.py:13 -msgid "redirects" -msgstr "presmerovania" - -#: contrib/flatpages/models/flatpages.py:7 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Príklad: '/about/contact/'. Uistite sa, že máte vložené ako úvodné tak aj " -"záverečné lomítka." - -#: contrib/flatpages/models/flatpages.py:8 -msgid "title" -msgstr "názov" - -#: contrib/flatpages/models/flatpages.py:9 -msgid "content" -msgstr "obsah" - -#: contrib/flatpages/models/flatpages.py:10 -msgid "enable comments" -msgstr "povolené komentáre" - -#: contrib/flatpages/models/flatpages.py:11 -msgid "template name" -msgstr "meno predlohy" - -#: contrib/flatpages/models/flatpages.py:12 -msgid "" -"Example: 'flatpages/contact_page'. If this isn't provided, the system will " -"use 'flatpages/default'." -msgstr "" -"Príklad: 'flatpages/contact_page'. Ak sa toto nevykonalo, systém použije " -"'flatpages/default'." - -#: contrib/flatpages/models/flatpages.py:13 -msgid "registration required" -msgstr "musíte byť zaregistrovaný" - -#: contrib/flatpages/models/flatpages.py:13 -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ak je toto označené, potom len prihlásený užívateľ môže vidieť túto stránku." - -#: contrib/flatpages/models/flatpages.py:17 -msgid "flat page" -msgstr "plochá stránka" - -#: contrib/flatpages/models/flatpages.py:18 -msgid "flat pages" -msgstr "ploché stránky" - #: utils/translation.py:335 msgid "DATE_FORMAT" msgstr "DATUM_FORMAT" @@ -971,15 +974,15 @@ msgstr "priezvisko" #: models/auth.py:36 msgid "e-mail address" -msgstr "emailová adresa" +msgstr "e-mailová adresa" #: models/auth.py:37 msgid "password" msgstr "heslo" #: models/auth.py:37 -msgid "Use '[algo]$[salt]$[hexdigest]" -msgstr "Použi '[algo]$[salt]$[hexdigest]" +msgid "Use '[algo]$[salt]$[hexdigest]'" +msgstr "Použi '[algo]$[salt]$[hexdigest]'" #: models/auth.py:38 msgid "staff status" @@ -1029,79 +1032,79 @@ msgstr "Dôležité údaje" msgid "Message" msgstr "Zpráva" -#: conf/global_settings.py:36 +#: conf/global_settings.py:37 msgid "Bengali" msgstr "Bengálsky" -#: conf/global_settings.py:37 +#: conf/global_settings.py:38 msgid "Czech" msgstr "Český" -#: conf/global_settings.py:38 +#: conf/global_settings.py:39 msgid "Welsh" msgstr "Waleský" -#: conf/global_settings.py:39 +#: conf/global_settings.py:40 msgid "Danish" msgstr "Dánsky" -#: conf/global_settings.py:40 +#: conf/global_settings.py:41 msgid "German" msgstr "Nemecký" -#: conf/global_settings.py:41 +#: conf/global_settings.py:42 msgid "English" msgstr "Anglický" -#: conf/global_settings.py:42 +#: conf/global_settings.py:43 msgid "Spanish" msgstr "Španielsky" -#: conf/global_settings.py:43 +#: conf/global_settings.py:44 msgid "French" msgstr "Francúzsky" -#: conf/global_settings.py:44 +#: conf/global_settings.py:45 msgid "Galician" msgstr "Galicijský" -#: conf/global_settings.py:45 +#: conf/global_settings.py:46 msgid "Icelandic" msgstr "Islandský" -#: conf/global_settings.py:46 +#: conf/global_settings.py:47 msgid "Italian" msgstr "Taliansky" -#: conf/global_settings.py:47 +#: conf/global_settings.py:48 msgid "Norwegian" msgstr "Nórsky" -#: conf/global_settings.py:48 +#: conf/global_settings.py:49 msgid "Brazilian" msgstr "Brazílsky" -#: conf/global_settings.py:49 +#: conf/global_settings.py:50 msgid "Romanian" msgstr "Rumúnsky" -#: conf/global_settings.py:50 +#: conf/global_settings.py:51 msgid "Russian" msgstr "Ruský" -#: conf/global_settings.py:51 +#: conf/global_settings.py:52 msgid "Slovak" msgstr "Slovenský" -#: conf/global_settings.py:52 +#: conf/global_settings.py:53 msgid "Serbian" msgstr "Srbský" -#: conf/global_settings.py:53 +#: conf/global_settings.py:54 msgid "Swedish" msgstr "Švédsky" -#: conf/global_settings.py:54 +#: conf/global_settings.py:55 msgid "Simplified Chinese" msgstr "Zjednodušená činština " From 22746d32a50792247330ea026e0d0ac2a0c2f933 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 24 Nov 2005 21:14:42 +0000 Subject: [PATCH 05/13] Added a get_template_sources generator function to filesystem and app_directories template loaders, so template-loader debugger can hook into it. Refs #892. git-svn-id: http://code.djangoproject.com/svn/django/trunk@1399 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/template/loader.py | 2 +- django/core/template/loaders/app_directories.py | 7 +++++-- django/core/template/loaders/filesystem.py | 9 ++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/django/core/template/loader.py b/django/core/template/loader.py index 10989424db..6d747d560d 100644 --- a/django/core/template/loader.py +++ b/django/core/template/loader.py @@ -59,7 +59,7 @@ def make_origin(display_name, loader, name, dirs): def find_template_source(name, dirs=None): for loader in template_source_loaders: try: - source, display_name = loader(name, dirs) + source, display_name = loader(name, dirs) return (source, make_origin(display_name, loader, name, dirs)) except TemplateDoesNotExist: pass diff --git a/django/core/template/loaders/app_directories.py b/django/core/template/loaders/app_directories.py index d7c02c68ea..390e47852e 100644 --- a/django/core/template/loaders/app_directories.py +++ b/django/core/template/loaders/app_directories.py @@ -27,9 +27,12 @@ for app in INSTALLED_APPS: # It won't change, so convert it to a tuple to save memory. app_template_dirs = tuple(app_template_dirs) -def load_template_source(template_name, template_dirs=None): +def get_template_sources(template_name, template_dirs=None): for template_dir in app_template_dirs: - filepath = os.path.join(template_dir, template_name) + TEMPLATE_FILE_EXTENSION + yield os.path.join(template_dir, template_name) + TEMPLATE_FILE_EXTENSION + +def load_template_source(template_name, template_dirs=None): + for filepath in get_template_sources(template_name, template_dirs): try: return (open(filepath).read(), filepath) except IOError: diff --git a/django/core/template/loaders/filesystem.py b/django/core/template/loaders/filesystem.py index 9a93481705..23ce6cd9e4 100644 --- a/django/core/template/loaders/filesystem.py +++ b/django/core/template/loaders/filesystem.py @@ -4,12 +4,15 @@ from django.conf.settings import TEMPLATE_DIRS, TEMPLATE_FILE_EXTENSION from django.core.template import TemplateDoesNotExist import os -def load_template_source(template_name, template_dirs=None): +def get_template_sources(template_name, template_dirs=None): if not template_dirs: template_dirs = TEMPLATE_DIRS - tried = [] for template_dir in template_dirs: - filepath = os.path.join(template_dir, template_name) + TEMPLATE_FILE_EXTENSION + yield os.path.join(template_dir, template_name) + TEMPLATE_FILE_EXTENSION + +def load_template_source(template_name, template_dirs=None): + tried = [] + for filepath in get_template_sources(template_name, template_dirs): try: return (open(filepath).read(), filepath) except IOError: From d9228251562f4f37cd76da4404874483718c7728 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 24 Nov 2005 21:15:51 +0000 Subject: [PATCH 06/13] Fixed #892 -- TemplateDoesNotExist errors now get a 'Template-loader postmortem' section on the pretty debug page. Thanks for the idea, David Ascher git-svn-id: http://code.djangoproject.com/svn/django/trunk@1400 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/debug.py | 47 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/django/views/debug.py b/django/views/debug.py index 6d90633de6..1eee80b9d6 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.core.template import Template, Context +from django.core.template import Template, Context, TemplateDoesNotExist from django.utils.html import escape from django.utils.httpwrappers import HttpResponseServerError, HttpResponseNotFound import inspect, os, re, sys @@ -43,8 +43,8 @@ def get_template_exception_info(exc_type, exc_value, tb): 'before': before, 'during': during, 'after': after, - 'top': top , - 'bottom': bottom , + 'top': top, + 'bottom': bottom, 'total': total, 'line': line, 'name': origin.name, @@ -58,6 +58,25 @@ def technical_500_response(request, exc_type, exc_value, tb): the values returned from sys.exc_info() and friends. """ template_info = None + template_does_not_exist = False + loader_debug_info = None + if issubclass(exc_type, TemplateDoesNotExist): + from django.core.template.loader import template_source_loaders + template_does_not_exist = True + loader_debug_info = [] + for loader in template_source_loaders: + try: + source_list_func = getattr(__import__(loader.__module__, '', '', ['get_template_sources']), 'get_template_sources') + # NOTE: This assumes exc_value is the name of the template that + # the loader attempted to load. + template_list = [{'name': t, 'exists': os.path.exists(t)} \ + for t in source_list_func(str(exc_value))] + except (ImportError, AttributeError): + template_list = [] + loader_debug_info.append({ + 'loader': loader.__module__ + '.' + loader.__name__, + 'templates': template_list, + }) if settings.TEMPLATE_DEBUG and hasattr(exc_value, 'source'): exc_type, exc_value, tb, template_info = get_template_exception_info(exc_type, exc_value, tb) frames = [] @@ -100,6 +119,8 @@ def technical_500_response(request, exc_type, exc_value, tb): 'request_protocol': os.environ.get("HTTPS") == "on" and "https" or "http", 'settings': settings_dict, 'template_info': template_info, + 'template_does_not_exist': template_does_not_exist, + 'loader_debug_info': loader_debug_info, }) return HttpResponseServerError(t.render(c), mimetype='text/html') @@ -187,7 +208,8 @@ TECHNICAL_500_TEMPLATE = """ #summary { background: #ffc; } #summary h2 { font-weight: normal; color: #666; } #explanation { background:#eee; } - #template { background:#f6f6f6; } + #template, #template-not-exist { background:#f6f6f6; } + #template-not-exist ul { margin: 0 0 0 20px; } #traceback { background:#eee; } #requestinfo { background:#f6f6f6; padding-left:120px; } #summary table { border:none; background:transparent; } @@ -272,6 +294,23 @@ TECHNICAL_500_TEMPLATE = """ +{% if template_does_not_exist %} +
+

Template-loader postmortem

+ {% if loader_debug_info %} +

Django tried loading these templates, in this order:

+
    + {% for loader in loader_debug_info %} +
  • Using loader {{ loader.loader }}: +
      {% for t in loader.templates %}
    • {{ t.name }} (File {% if t.exists %}exists{% else %}does not exist{% endif %})
    • {% endfor %}
    +
  • + {% endfor %} +
+ {% else %} +

Django couldn't find any templates because your TEMPLATE_LOADERS setting is empty!

+ {% endif %} +
+{% endif %} {% if template_info %}

Template error

From 827ebe53686d4fce3b37241969b717df2e864f3d Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 24 Nov 2005 21:26:04 +0000 Subject: [PATCH 07/13] Converted django/models/__init__.py to use unix newlines, not DOS git-svn-id: http://code.djangoproject.com/svn/django/trunk@1401 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/models/__init__.py | 184 +++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/django/models/__init__.py b/django/models/__init__.py index 2937223361..0796cb5c68 100644 --- a/django/models/__init__.py +++ b/django/models/__init__.py @@ -1,92 +1,92 @@ -from django.core import meta -from django.utils.functional import curry - -__all__ = ['auth', 'core'] - -# Alter this package's __path__ variable so that calling code can import models -# from "django.models" even though the model code doesn't physically live -# within django.models. -for mod in meta.get_installed_models(): - __path__.extend(mod.__path__) - -# First, import all models so the metaclasses run. -modules = meta.get_installed_model_modules(__all__) - -# Now, create the extra methods that we couldn't create earlier because -# relationships hadn't been known until now. -for mod in modules: - for klass in mod._MODELS: - - # Add "get_thingie", "get_thingie_count" and "get_thingie_list" methods - # for all related objects. - for rel_obj, rel_field in klass._meta.get_all_related_objects(): - # Determine whether this related object is in another app. - # If it's in another app, the method names will have the app - # label prepended, and the add_BLAH() method will not be - # generated. - rel_mod = rel_obj.get_model_module() - rel_obj_name = klass._meta.get_rel_object_method_name(rel_obj, rel_field) - if isinstance(rel_field.rel, meta.OneToOne): - # Add "get_thingie" methods for one-to-one related objects. - # EXAMPLE: Place.get_restaurants_restaurant() - func = curry(meta.method_get_related, 'get_object', rel_mod, rel_field) - func.__doc__ = "Returns the associated `%s.%s` object." % (rel_obj.app_label, rel_obj.module_name) - setattr(klass, 'get_%s' % rel_obj_name, func) - elif isinstance(rel_field.rel, meta.ManyToOne): - # Add "get_thingie" methods for many-to-one related objects. - # EXAMPLE: Poll.get_choice() - func = curry(meta.method_get_related, 'get_object', rel_mod, rel_field) - func.__doc__ = "Returns the associated `%s.%s` object matching the given criteria." % (rel_obj.app_label, rel_obj.module_name) - setattr(klass, 'get_%s' % rel_obj_name, func) - # Add "get_thingie_count" methods for many-to-one related objects. - # EXAMPLE: Poll.get_choice_count() - func = curry(meta.method_get_related, 'get_count', rel_mod, rel_field) - func.__doc__ = "Returns the number of associated `%s.%s` objects." % (rel_obj.app_label, rel_obj.module_name) - setattr(klass, 'get_%s_count' % rel_obj_name, func) - # Add "get_thingie_list" methods for many-to-one related objects. - # EXAMPLE: Poll.get_choice_list() - func = curry(meta.method_get_related, 'get_list', rel_mod, rel_field) - func.__doc__ = "Returns a list of associated `%s.%s` objects." % (rel_obj.app_label, rel_obj.module_name) - setattr(klass, 'get_%s_list' % rel_obj_name, func) - # Add "add_thingie" methods for many-to-one related objects, - # but only for related objects that are in the same app. - # EXAMPLE: Poll.add_choice() - if rel_obj.app_label == klass._meta.app_label: - func = curry(meta.method_add_related, rel_obj, rel_mod, rel_field) - func.alters_data = True - setattr(klass, 'add_%s' % rel_obj_name, func) - del func - del rel_obj_name, rel_mod, rel_obj, rel_field # clean up - - # Do the same for all related many-to-many objects. - for rel_opts, rel_field in klass._meta.get_all_related_many_to_many_objects(): - rel_mod = rel_opts.get_model_module() - rel_obj_name = klass._meta.get_rel_object_method_name(rel_opts, rel_field) - setattr(klass, 'get_%s' % rel_obj_name, curry(meta.method_get_related_many_to_many, 'get_object', klass._meta, rel_mod, rel_field)) - setattr(klass, 'get_%s_count' % rel_obj_name, curry(meta.method_get_related_many_to_many, 'get_count', klass._meta, rel_mod, rel_field)) - setattr(klass, 'get_%s_list' % rel_obj_name, curry(meta.method_get_related_many_to_many, 'get_list', klass._meta, rel_mod, rel_field)) - if rel_opts.app_label == klass._meta.app_label: - func = curry(meta.method_set_related_many_to_many, rel_opts, rel_field) - func.alters_data = True - setattr(klass, 'set_%s' % rel_opts.module_name, func) - del func - del rel_obj_name, rel_mod, rel_opts, rel_field # clean up - - # Add "set_thingie_order" and "get_thingie_order" methods for objects - # that are ordered with respect to this. - for obj in klass._meta.get_ordered_objects(): - func = curry(meta.method_set_order, obj) - func.__doc__ = "Sets the order of associated `%s.%s` objects to the given ID list." % (obj.app_label, obj.module_name) - func.alters_data = True - setattr(klass, 'set_%s_order' % obj.object_name.lower(), func) - - func = curry(meta.method_get_order, obj) - func.__doc__ = "Returns the order of associated `%s.%s` objects as a list of IDs." % (obj.app_label, obj.module_name) - setattr(klass, 'get_%s_order' % obj.object_name.lower(), func) - del func, obj # clean up - del klass # clean up - del mod -del modules - -# Expose get_app and get_module. -from django.core.meta import get_app, get_module +from django.core import meta +from django.utils.functional import curry + +__all__ = ['auth', 'core'] + +# Alter this package's __path__ variable so that calling code can import models +# from "django.models" even though the model code doesn't physically live +# within django.models. +for mod in meta.get_installed_models(): + __path__.extend(mod.__path__) + +# First, import all models so the metaclasses run. +modules = meta.get_installed_model_modules(__all__) + +# Now, create the extra methods that we couldn't create earlier because +# relationships hadn't been known until now. +for mod in modules: + for klass in mod._MODELS: + + # Add "get_thingie", "get_thingie_count" and "get_thingie_list" methods + # for all related objects. + for rel_obj, rel_field in klass._meta.get_all_related_objects(): + # Determine whether this related object is in another app. + # If it's in another app, the method names will have the app + # label prepended, and the add_BLAH() method will not be + # generated. + rel_mod = rel_obj.get_model_module() + rel_obj_name = klass._meta.get_rel_object_method_name(rel_obj, rel_field) + if isinstance(rel_field.rel, meta.OneToOne): + # Add "get_thingie" methods for one-to-one related objects. + # EXAMPLE: Place.get_restaurants_restaurant() + func = curry(meta.method_get_related, 'get_object', rel_mod, rel_field) + func.__doc__ = "Returns the associated `%s.%s` object." % (rel_obj.app_label, rel_obj.module_name) + setattr(klass, 'get_%s' % rel_obj_name, func) + elif isinstance(rel_field.rel, meta.ManyToOne): + # Add "get_thingie" methods for many-to-one related objects. + # EXAMPLE: Poll.get_choice() + func = curry(meta.method_get_related, 'get_object', rel_mod, rel_field) + func.__doc__ = "Returns the associated `%s.%s` object matching the given criteria." % (rel_obj.app_label, rel_obj.module_name) + setattr(klass, 'get_%s' % rel_obj_name, func) + # Add "get_thingie_count" methods for many-to-one related objects. + # EXAMPLE: Poll.get_choice_count() + func = curry(meta.method_get_related, 'get_count', rel_mod, rel_field) + func.__doc__ = "Returns the number of associated `%s.%s` objects." % (rel_obj.app_label, rel_obj.module_name) + setattr(klass, 'get_%s_count' % rel_obj_name, func) + # Add "get_thingie_list" methods for many-to-one related objects. + # EXAMPLE: Poll.get_choice_list() + func = curry(meta.method_get_related, 'get_list', rel_mod, rel_field) + func.__doc__ = "Returns a list of associated `%s.%s` objects." % (rel_obj.app_label, rel_obj.module_name) + setattr(klass, 'get_%s_list' % rel_obj_name, func) + # Add "add_thingie" methods for many-to-one related objects, + # but only for related objects that are in the same app. + # EXAMPLE: Poll.add_choice() + if rel_obj.app_label == klass._meta.app_label: + func = curry(meta.method_add_related, rel_obj, rel_mod, rel_field) + func.alters_data = True + setattr(klass, 'add_%s' % rel_obj_name, func) + del func + del rel_obj_name, rel_mod, rel_obj, rel_field # clean up + + # Do the same for all related many-to-many objects. + for rel_opts, rel_field in klass._meta.get_all_related_many_to_many_objects(): + rel_mod = rel_opts.get_model_module() + rel_obj_name = klass._meta.get_rel_object_method_name(rel_opts, rel_field) + setattr(klass, 'get_%s' % rel_obj_name, curry(meta.method_get_related_many_to_many, 'get_object', klass._meta, rel_mod, rel_field)) + setattr(klass, 'get_%s_count' % rel_obj_name, curry(meta.method_get_related_many_to_many, 'get_count', klass._meta, rel_mod, rel_field)) + setattr(klass, 'get_%s_list' % rel_obj_name, curry(meta.method_get_related_many_to_many, 'get_list', klass._meta, rel_mod, rel_field)) + if rel_opts.app_label == klass._meta.app_label: + func = curry(meta.method_set_related_many_to_many, rel_opts, rel_field) + func.alters_data = True + setattr(klass, 'set_%s' % rel_opts.module_name, func) + del func + del rel_obj_name, rel_mod, rel_opts, rel_field # clean up + + # Add "set_thingie_order" and "get_thingie_order" methods for objects + # that are ordered with respect to this. + for obj in klass._meta.get_ordered_objects(): + func = curry(meta.method_set_order, obj) + func.__doc__ = "Sets the order of associated `%s.%s` objects to the given ID list." % (obj.app_label, obj.module_name) + func.alters_data = True + setattr(klass, 'set_%s_order' % obj.object_name.lower(), func) + + func = curry(meta.method_get_order, obj) + func.__doc__ = "Returns the order of associated `%s.%s` objects as a list of IDs." % (obj.app_label, obj.module_name) + setattr(klass, 'get_%s_order' % obj.object_name.lower(), func) + del func, obj # clean up + del klass # clean up + del mod +del modules + +# Expose get_app and get_module. +from django.core.meta import get_app, get_module From 18c7ed74e4fbdde9cb839a4031b8683053d97952 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 24 Nov 2005 22:41:05 +0000 Subject: [PATCH 08/13] =?UTF-8?q?Fixed=20#896=20--=20Fixed=20error=20in=20?= =?UTF-8?q?filesystem=20serve=20view=20in=20Windows.=20Thanks,=20Petar=20M?= =?UTF-8?q?ari=C4=87=20and=20nesh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.djangoproject.com/svn/django/trunk@1402 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/static.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/views/static.py b/django/views/static.py index 28e43ec612..4ff4313dab 100644 --- a/django/views/static.py +++ b/django/views/static.py @@ -34,7 +34,7 @@ def serve(request, path, document_root=None, show_indexes=False): if part in (os.curdir, os.pardir): # strip '.' amd '..' in path continue - newpath = os.path.join(newpath, part) + newpath = os.path.join(newpath, part).replace('\\', '/') if newpath and path != newpath: return HttpResponseRedirect(newpath) fullpath = os.path.join(document_root, newpath) From f0fbd43a57b8a391915099e49c1ed3e3089331c9 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Thu, 24 Nov 2005 22:57:04 +0000 Subject: [PATCH 09/13] small fix to the template_debug stuff, it was dropping last characters and didn't split the first line correctly git-svn-id: http://code.djangoproject.com/svn/django/trunk@1403 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/debug.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/django/views/debug.py b/django/views/debug.py index 1eee80b9d6..5371af9f5c 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -23,14 +23,13 @@ def get_template_exception_info(exc_type, exc_value, tb): upto = 0 source_lines = [] linebreaks = izip(count(0), linebreak_iter(template_source)) - linebreaks.next() # skip the nothing before initial line start for num, next in linebreaks: if start >= upto and end <= next: line = num before = escape(template_source[upto:start]) during = escape(template_source[start:end]) - after = escape(template_source[end:next - 1]) - source_lines.append( (num, escape(template_source[upto:next - 1])) ) + after = escape(template_source[end:next]) + source_lines.append( (num, escape(template_source[upto:next])) ) upto = next total = len(source_lines) From 798e6d5663e6505350bf32e1eca52b1428029c6c Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Thu, 24 Nov 2005 23:10:24 +0000 Subject: [PATCH 10/13] mail sending used Template.render, but passed only a dictionary, not a Context object git-svn-id: http://code.djangoproject.com/svn/django/trunk@1404 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/registration/passwords.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/views/registration/passwords.py b/django/views/registration/passwords.py index 09d3037560..0dde5f7b6d 100644 --- a/django/views/registration/passwords.py +++ b/django/views/registration/passwords.py @@ -41,7 +41,7 @@ class PasswordResetForm(formfields.Manipulator): 'site_name': site_name, 'user': self.user_cache, } - send_mail('Password reset on %s' % site_name, t.render(c), None, [self.user_cache.email]) + send_mail('Password reset on %s' % site_name, t.render(Context(c)), None, [self.user_cache.email]) class PasswordChangeForm(formfields.Manipulator): "A form that lets a user change his password." From 73766b1f8890a90013dc16560aa7329bdfe734a3 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Thu, 24 Nov 2005 23:31:33 +0000 Subject: [PATCH 11/13] fixed debug view for templates so it starts counting with 1 git-svn-id: http://code.djangoproject.com/svn/django/trunk@1405 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/debug.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django/views/debug.py b/django/views/debug.py index 5371af9f5c..4cf70cc3d7 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -9,6 +9,7 @@ from os.path import dirname, join as pathjoin HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD') def linebreak_iter(template_source): + yield 0 p = template_source.find('\n') while p >= 0: yield p From eff2a1fde278e9fb5577728550cd1650e4e65c42 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Thu, 24 Nov 2005 23:35:28 +0000 Subject: [PATCH 12/13] just another small fix to the template_debug layout git-svn-id: http://code.djangoproject.com/svn/django/trunk@1406 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/debug.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django/views/debug.py b/django/views/debug.py index 4cf70cc3d7..80af44343f 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -27,10 +27,10 @@ def get_template_exception_info(exc_type, exc_value, tb): for num, next in linebreaks: if start >= upto and end <= next: line = num - before = escape(template_source[upto:start]) + before = escape(template_source[upto+1:start]) during = escape(template_source[start:end]) after = escape(template_source[end:next]) - source_lines.append( (num, escape(template_source[upto:next])) ) + source_lines.append( (num, escape(template_source[upto+1:next])) ) upto = next total = len(source_lines) From ca683d8ca54b7579eefba8ef52ccd35b04a66b63 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Fri, 25 Nov 2005 00:04:06 +0000 Subject: [PATCH 13/13] now really fixed the source formatting. brought to you by the magics of IRC-based pair programming git-svn-id: http://code.djangoproject.com/svn/django/trunk@1407 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/debug.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/django/views/debug.py b/django/views/debug.py index 80af44343f..863651b538 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -12,7 +12,7 @@ def linebreak_iter(template_source): yield 0 p = template_source.find('\n') while p >= 0: - yield p + yield p+1 p = template_source.find('\n', p+1) yield len(template_source) + 1 @@ -23,18 +23,17 @@ def get_template_exception_info(exc_type, exc_value, tb): line = 0 upto = 0 source_lines = [] - linebreaks = izip(count(0), linebreak_iter(template_source)) - for num, next in linebreaks: + for num, next in enumerate(linebreak_iter(template_source)): if start >= upto and end <= next: line = num - before = escape(template_source[upto+1:start]) + before = escape(template_source[upto:start]) during = escape(template_source[start:end]) after = escape(template_source[end:next]) - source_lines.append( (num, escape(template_source[upto+1:next])) ) + source_lines.append( (num, escape(template_source[upto:next])) ) upto = next total = len(source_lines) - top = max(0, line - context_lines) + top = max(1, line - context_lines) bottom = min(total, line + 1 + context_lines) template_info = { @@ -323,7 +322,7 @@ TECHNICAL_500_TEMPLATE = """ {{ template_info.before }}{{ template_info.during }}{{ template_info.after }} {% else %} {{ source_line.0 }} - {{ source_line.1 }} + {{ source_line.1 }} {% endifequal %} {% endfor %}