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

[soc2010/app-loading] merged trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/app-loading@13818 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Arthur Koziel 2010-09-13 00:04:27 +00:00
parent c9b188c4ec
commit dd49269c7d
470 changed files with 19998 additions and 9613 deletions

32
AUTHORS
View File

@ -29,7 +29,6 @@ answer newbie questions, and generally made Django that much better:
Gisle Aas <gisle@aas.no>
ajs <adi@sieker.info>
alang@bright-green.com
Alcides Fonseca
Andi Albrecht <albrecht.andi@gmail.com>
Marty Alchin <gulopine@gamemusic.org>
Ahmad Alhashemi <trans@ahmadh.com>
@ -39,7 +38,6 @@ answer newbie questions, and generally made Django that much better:
AgarFu <heaven@croasanaso.sytes.net>
Dagur Páll Ammendrup <dagurp@gmail.com>
Collin Anderson <cmawebsite@gmail.com>
Nicolas Lara <nicolaslara@gmail.com>
Jeff Anderson <jefferya@programmerq.net>
Marian Andre <django@andre.sk>
Andreas
@ -85,19 +83,19 @@ answer newbie questions, and generally made Django that much better:
Sean Brant
Andrew Brehaut <http://brehaut.net/blog>
brut.alll@gmail.com
bthomas
btoll@bestweb.net
Jonathan Buchanan <jonathan.buchanan@gmail.com>
Keith Bussell <kbussell@gmail.com>
C8E
Chris Cahoon <chris.cahoon@gmail.com>
Juan Manuel Caicedo <juan.manuel.caicedo@gmail.com>
Trevor Caira <trevor@caira.com>
Brett Cannon <brett@python.org>
Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
Jeremy Carbaugh <jcarbaugh@gmail.com>
Carl Meyer <carl@dirtcircle.com>
Graham Carlyle <graham.carlyle@maplecroft.net>
Antonio Cavedoni <http://cavedoni.com/>
C8E
cedric@terramater.net
Chris Chamberlin <dja@cdc.msbx.net>
Amit Chakradeo <http://amit.chakradeo.net/>
@ -110,6 +108,7 @@ answer newbie questions, and generally made Django that much better:
Michal Chruszcz <troll@pld-linux.org>
Can Burak Çilingir <canburak@cs.bilgi.edu.tr>
Ian Clelland <clelland@gmail.com>
Travis Cline <travis.cline@gmail.com>
Russell Cloran <russell@rucus.net>
colin@owlfish.com
crankycoder@gmail.com
@ -137,6 +136,7 @@ answer newbie questions, and generally made Django that much better:
Rajesh Dhawan <rajesh.dhawan@gmail.com>
Sander Dijkhuis <sander.dijkhuis@gmail.com>
Jordan Dimov <s3x3y1@gmail.com>
Nebojša Dorđević
dne@mayonnaise.net
dready <wil@mojipage.com>
Maximillian Dornseif <md@hudora.de>
@ -167,7 +167,6 @@ answer newbie questions, and generally made Django that much better:
Liang Feng <hutuworm@gmail.com>
Bill Fenner <fenner@gmail.com>
Stefane Fermgier <sf@fermigier.com>
Afonso Fernández Nogueira <fonzzo.django@gmail.com>
J. Pablo Fernandez <pupeno@pupeno.com>
Maciej Fijalkowski
Ben Firshman <ben@firshman.co.uk>
@ -175,6 +174,7 @@ answer newbie questions, and generally made Django that much better:
Eric Floehr <eric@intellovations.com>
Eric Florenzano <floguy@gmail.com>
Vincent Foley <vfoleybourgon@yahoo.ca>
Alcides Fonseca
Rudolph Froger <rfroger@estrate.nl>
Jorge Gajon <gajon@gajon.org>
gandalf@owca.info
@ -184,11 +184,13 @@ answer newbie questions, and generally made Django that much better:
Idan Gazit
geber@datacollect.com
Baishampayan Ghose
Joshua Ginsberg <jag@flowtheory.net>
Dimitris Glezos <dimitris@glezos.com>
glin@seznam.cz
martin.glueck@gmail.com
Artyom Gnilov <boobsd@gmail.com>
Ben Godfrey <http://aftnn.org>
Andrew Godwin <andrew@aeracode.org>
GomoX <gomo@datafull.com>
Guilherme Mesquita Gondim <semente@taurinus.org>
Mario Gonzalez <gonzalemario@gmail.com>
@ -220,6 +222,7 @@ answer newbie questions, and generally made Django that much better:
Kieran Holland <http://www.kieranholland.com>
Sung-Jin Hong <serialx.net@gmail.com>
Leo "hylje" Honkanen <sealage@gmail.com>
Matt Hoskins <skaffenuk@googlemail.com>
Tareque Hossain <http://www.codexn.com>
Richard House <Richard.House@i-logue.com>
Robert Rock Howard <http://djangomojo.com/>
@ -235,6 +238,7 @@ answer newbie questions, and generally made Django that much better:
jcrasta@gmail.com
jdetaeye
jhenry <jhenry@theonion.com>
john@calixto.net
Zak Johnson <zakj@nox.cx>
Nis Jørgensen <nis@superlativ.dk>
Michael Josephson <http://www.sdjournal.com/>
@ -275,11 +279,11 @@ answer newbie questions, and generally made Django that much better:
kurtiss@meetro.com
Denis Kuzmichyov <kuzmichyov@gmail.com>
Panos Laganakos <panos.laganakos@gmail.com>
Lakin Wecker <lakin@structuredabstraction.com>
Nick Lane <nick.lane.au@gmail.com>
Stuart Langridge <http://www.kryogenix.org/>
Paul Lanier <planier@google.com>
David Larlet <http://david.larlet.fr>
Nicolas Lara <nicolaslara@gmail.com>
Nicola Larosa <nico@teknico.net>
Finn Gruwier Larsen <finn@gruwier.dk>
Lau Bech Lauritzen
@ -300,7 +304,6 @@ answer newbie questions, and generally made Django that much better:
Simon Litchfield <simon@quo.com.au>
Daniel Lindsley <polarcowz@gmail.com>
Trey Long <trey@ktrl.com>
msaelices <msaelices@gmail.com>
Martin Mahner <http://www.mahner.org/>
Matt McClanahan <http://mmcc.cx/>
Stanislaus Madueke
@ -313,20 +316,21 @@ answer newbie questions, and generally made Django that much better:
Petr Marhoun <petr.marhoun@gmail.com>
Petar Marić <http://www.petarmaric.com/>
Nuno Mariz <nmariz@gmail.com>
Marijn Vriens <marijn@metronomo.cl>
mark@junklight.com
Orestis Markou <orestis@orestis.gr>
Takashi Matsuo <matsuo.takashi@gmail.com>
Yasushi Masuda <whosaysni@gmail.com>
mattycakes@gmail.com
Glenn Maynard <glenn@zewt.org>
Jason McBrayer <http://www.carcosa.net/jason/>
Kevin McConnell <kevin.mcconnell@gmail.com>
mccutchen@gmail.com
michael.mcewan@gmail.com
Paul McLanahan <paul@mclanahan.net>
Tobias McNulty <http://www.caktusgroup.com/blog>
Zain Memon
Christian Metts
michael.mcewan@gmail.com
Carl Meyer <carl@dirtcircle.com>
michal@plovarna.cz
Slawek Mikula <slawek dot mikula at gmail dot com>
mitakummaa@gmail.com
@ -336,12 +340,14 @@ answer newbie questions, and generally made Django that much better:
Aljosa Mohorovic <aljosa.mohorovic@gmail.com>
Ramiro Morales <rm0@gmx.net>
Eric Moritz <http://eric.themoritzfamily.com/>
msaelices <msaelices@gmail.com>
Gregor Müllegger <gregor@muellegger.de>
Robin Munn <http://www.geekforgod.com/>
James Murty
msundstr
Robert Myers <myer0052@gmail.com>
Aaron T. Myers <atmyers@gmail.com>
Alexander Myodov <alex@myodov.com>
Nebojša Dorđević
Doug Napoleone <doug@dougma.com>
Gopal Narayanan <gopastro@gmail.com>
Fraser Nevett <mail@nevett.org>
@ -369,7 +375,6 @@ answer newbie questions, and generally made Django that much better:
phil.h.smith@gmail.com
Gustavo Picon
Michael Placentra II <someone@michaelplacentra2.net>
Luke Plant <http://lukeplant.me.uk/>
plisk
Daniel Poelzleithner <http://poelzi.org/>
polpak@yahoo.com
@ -400,7 +405,6 @@ answer newbie questions, and generally made Django that much better:
Henrique Romano <onaiort@gmail.com>
Armin Ronacher
Daniel Roseman <http://roseman.org.uk/>
Brian Rosner <brosner@gmail.com>
Rozza <ross.lawley@gmail.com>
Oliver Rutherfurd <http://rutherfurd.net/>
ryankanno
@ -479,6 +483,7 @@ answer newbie questions, and generally made Django that much better:
George Vilches <gav@thataddress.com>
Vlado <vlado@labath.org>
Zachary Voase <zacharyvoase@gmail.com>
Marijn Vriens <marijn@metronomo.cl>
Milton Waddams
Chris Wagner <cw264701@ohio.edu>
Rick Wagner <rwagner@physics.ucsd.edu>
@ -487,6 +492,7 @@ answer newbie questions, and generally made Django that much better:
Filip Wasilewski <filip.wasilewski@gmail.com>
Dan Watson <http://theidioteque.net/>
Joel Watts <joel@joelwatts.com>
Lakin Wecker <lakin@structuredabstraction.com>
Chris Wesseling <Chris.Wesseling@cwi.nl>
James Wheare <django@sparemint.com>
Mike Wiacek <mjwiacek@google.com>
@ -508,8 +514,6 @@ answer newbie questions, and generally made Django that much better:
Gasper Zejn <zejn@kiberpipa.org>
Jarek Zgoda <jarek.zgoda@gmail.com>
Cheng Zhang
Glenn Maynard <glenn@zewt.org>
bthomas
A big THANK YOU goes to:

View File

@ -3,12 +3,12 @@ include AUTHORS
include INSTALL
include LICENSE
include MANIFEST.in
include django/utils/simplejson/LICENSE.txt
include django/contrib/gis/gdal/LICENSE
include django/contrib/gis/geos/LICENSE
include django/dispatch/license.txt
include django/utils/simplejson/LICENSE.txt
recursive-include docs *
recursive-include scripts *
recursive-include examples *
recursive-include extras *
recursive-include tests *
recursive-include django/conf/locale *
@ -20,6 +20,8 @@ recursive-include django/contrib/auth/tests/templates *
recursive-include django/contrib/comments/templates *
recursive-include django/contrib/databrowse/templates *
recursive-include django/contrib/formtools/templates *
recursive-include django/contrib/flatpages/fixtures *
recursive-include django/contrib/flatpages/tests/templates *
recursive-include django/contrib/gis/templates *
recursive-include django/contrib/gis/tests/data *
recursive-include django/contrib/gis/tests/geoapp/fixtures *

View File

@ -1,4 +1,4 @@
VERSION = (1, 2, 1, 'final', 0)
VERSION = (1, 3, 0, 'alpha', 0)
def get_version():
version = '%s.%s' % (VERSION[0], VERSION[1])

View File

@ -103,6 +103,12 @@ class Settings(object):
self.INSTALLED_APPS = new_installed_apps
if hasattr(time, 'tzset') and getattr(self, 'TIME_ZONE'):
# When we can, attempt to validate the timezone. If we can't find
# this file, no check happens and it's harmless.
zoneinfo_root = '/usr/share/zoneinfo'
if (os.path.exists(zoneinfo_root) and not
os.path.exists(os.path.join(zoneinfo_root, *(self.TIME_ZONE.split('/'))))):
raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
# Move the time zone info into os.environ. See ticket #2315 for why
# we don't do this unconditionally (breaks Windows).
os.environ['TZ'] = self.TIME_ZONE

View File

@ -54,7 +54,7 @@ LANGUAGES = (
('en', gettext_noop('English')),
('en-gb', gettext_noop('British English')),
('es', gettext_noop('Spanish')),
('es-ar', gettext_noop('Argentinean Spanish')),
('es-ar', gettext_noop('Argentinian Spanish')),
('et', gettext_noop('Estonian')),
('eu', gettext_noop('Basque')),
('fa', gettext_noop('Persian')),
@ -78,6 +78,7 @@ LANGUAGES = (
('lt', gettext_noop('Lithuanian')),
('lv', gettext_noop('Latvian')),
('mk', gettext_noop('Macedonian')),
('ml', gettext_noop('Malayalam')),
('mn', gettext_noop('Mongolian')),
('nl', gettext_noop('Dutch')),
('no', gettext_noop('Norwegian')),
@ -372,8 +373,8 @@ DECIMAL_SEPARATOR = '.'
# Boolean that sets whether to add thousand separator when formatting numbers
USE_THOUSAND_SEPARATOR = False
# Number of digits that will be togheter, when spliting them by THOUSAND_SEPARATOR
# 0 means no grouping, 3 means splitting by thousands...
# Number of digits that will be together, when spliting them by
# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
NUMBER_GROUPING = 0
# Thousand separator symbol

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-02-15 01:00+0200\n"
"POT-Creation-Date: 2010-06-04 21:59+0200\n"
"PO-Revision-Date: 2008-03-25 18:54+0100\n"
"Last-Translator: Django Catalan Group <django-cat@googlegroups.com>\n"
"Language-Team: Catalan <ca@li.org>\n"
@ -14,102 +14,144 @@ msgstr ""
"X-Generator: VIM 7.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: contrib/admin/media/js/SelectFilter2.js:33
#: .\contrib\admin\media\js\SelectFilter2.js.py:37
#, perl-format
msgid "Available %s"
msgstr "%s Disponibles"
#: contrib/admin/media/js/SelectFilter2.js:41
#: .\contrib\admin\media\js\SelectFilter2.js.py:45
msgid "Choose all"
msgstr "Seleccionar tots"
#: contrib/admin/media/js/SelectFilter2.js:46
#: .\contrib\admin\media\js\SelectFilter2.js.py:50
msgid "Add"
msgstr "Afegir"
#: contrib/admin/media/js/SelectFilter2.js:48
#: .\contrib\admin\media\js\SelectFilter2.js.py:52
msgid "Remove"
msgstr "Eliminar"
#: contrib/admin/media/js/SelectFilter2.js:53
#: .\contrib\admin\media\js\SelectFilter2.js.py:57
#, perl-format
msgid "Chosen %s"
msgstr "%s Escollits"
#: contrib/admin/media/js/SelectFilter2.js:54
#: .\contrib\admin\media\js\SelectFilter2.js.py:58
msgid "Select your choice(s) and click "
msgstr "Faci les seves seleccions i faci click a"
#: contrib/admin/media/js/SelectFilter2.js:59
#: .\contrib\admin\media\js\SelectFilter2.js.py:63
msgid "Clear all"
msgstr "Deseleccionar tots"
#: contrib/admin/media/js/dateparse.js:32
#: contrib/admin/media/js/calendar.js:24
msgid "January February March April May June July August September October November December"
msgstr "Gener Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre Desembre"
#: .\contrib\admin\media\js\actions.js.py:18
#: .\contrib\admin\media\js\actions.min.js.py:1
msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s de %(cnt)s seleccionat"
msgstr[1] "%(sel)s of %(cnt)s seleccionats"
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte"
#: .\contrib\admin\media\js\actions.js.py:109
#: .\contrib\admin\media\js\actions.min.js.py:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
msgstr ""
"Teniu canvis sense desar a camps editables individuals. Si executeu "
"una acció, es perdran aquests canvis no desats."
#: contrib/admin/media/js/calendar.js:25
#: .\contrib\admin\media\js\actions.js.py:121
#: .\contrib\admin\media\js\actions.min.js.py:6
msgid ""
"You have selected an action, but you haven't saved your changes to "
"individual fields yet. Please click OK to save. You'll need to re-run the "
"action."
msgstr ""
"Heu seleccionat una acció, però encara no heu desat els vostres canvis a "
"camps individuals. Si us plau premeu OK per desar. Haureu de tornar a "
"executar l'acció."
#: .\contrib\admin\media\js\actions.js.py:123
#: .\contrib\admin\media\js\actions.min.js.py:6
msgid ""
"You have selected an action, and you haven't made any changes on individual "
"fields. You're probably looking for the Go button rather than the Save "
"button."
msgstr ""
"Heu seleccionat una acció i no heu fet cap canvi a camps individuals. "
"Probablement esteu cercant el botó 'Anar' enlloc de 'Desar'."
#: .\contrib\admin\media\js\calendar.js.py:24
#: .\contrib\admin\media\js\dateparse.js.py:32
msgid ""
"January February March April May June July August September October November "
"December"
msgstr ""
"Gener Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre "
"Desembre"
#: .\contrib\admin\media\js\calendar.js.py:25
msgid "S M T W T F S"
msgstr "Dg Dl Dt Dc Dj Dv Ds"
msgstr "dg dl dt dc dj dv ds"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr "Ara"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "Rellotje"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
msgstr "Esculli una hora"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "Mitja nit"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "6 a.m."
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr "Migdia"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
msgstr "Cancel·lar"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr "Avui"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "Calendari"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "Ahir"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr "Demà"
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
#: .\contrib\admin\media\js\collapse.js.py:9
#: .\contrib\admin\media\js\collapse.js.py:21
#: .\contrib\admin\media\js\collapse.min.js.py:1
msgid "Show"
msgstr "Mostrar"
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
#: .\contrib\admin\media\js\collapse.js.py:16
#: .\contrib\admin\media\js\collapse.min.js.py:1
msgid "Hide"
msgstr "Ocultar"
#: .\contrib\admin\media\js\dateparse.js.py:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:48
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:83
msgid "Now"
msgstr "Ara"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:52
msgid "Clock"
msgstr "Rellotge"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:79
msgid "Choose a time"
msgstr "Esculli una hora"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:84
msgid "Midnight"
msgstr "Mitjanit"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:85
msgid "6 a.m."
msgstr "6 a.m."
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:86
msgid "Noon"
msgstr "Migdia"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:90
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:187
msgid "Cancel"
msgstr "Cancel·lar"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:132
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:181
msgid "Today"
msgstr "Avui"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:136
msgid "Calendar"
msgstr "Calendari"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:179
msgid "Yesterday"
msgstr "Ahir"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:183
msgid "Tomorrow"
msgstr "Demà"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-14 11:01+0200\n"
"PO-Revision-Date: 2010-04-17 00:18+0200\n"
"Last-Translator: David Larlet <http://larlet.fr>\n"
"POT-Creation-Date: 2010-08-09 12:11+0200\n"
"PO-Revision-Date: 2010-08-09 14:38+0200\n"
"Last-Translator: Stéphane Raimbault <stephane.raimbault@gmail.com>\n"
"Language-Team: French <http://django-fr.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -72,7 +72,7 @@ msgid "Spanish"
msgstr "Espagnol"
#: conf/global_settings.py:57
msgid "Argentinean Spanish"
msgid "Argentinian Spanish"
msgstr "Espagnol argentin"
#: conf/global_settings.py:58
@ -168,98 +168,102 @@ msgid "Macedonian"
msgstr "Macédonien"
#: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayâlam"
#: conf/global_settings.py:82
msgid "Mongolian"
msgstr "Mongole"
#: conf/global_settings.py:82
#: conf/global_settings.py:83
msgid "Dutch"
msgstr "Hollandais"
#: conf/global_settings.py:83
#: conf/global_settings.py:84
msgid "Norwegian"
msgstr "Norvégien"
#: conf/global_settings.py:84
#: conf/global_settings.py:85
msgid "Norwegian Bokmal"
msgstr "Norvégien Bokmal"
#: conf/global_settings.py:85
#: conf/global_settings.py:86
msgid "Norwegian Nynorsk"
msgstr "Norvégien Nynorsk"
#: conf/global_settings.py:86
#: conf/global_settings.py:87
msgid "Polish"
msgstr "Polonais"
#: conf/global_settings.py:87
#: conf/global_settings.py:88
msgid "Portuguese"
msgstr "Portugais"
#: conf/global_settings.py:88
#: conf/global_settings.py:89
msgid "Brazilian Portuguese"
msgstr "Portugais brésilien"
#: conf/global_settings.py:89
#: conf/global_settings.py:90
msgid "Romanian"
msgstr "Roumain"
#: conf/global_settings.py:90
#: conf/global_settings.py:91
msgid "Russian"
msgstr "Russe"
#: conf/global_settings.py:91
#: conf/global_settings.py:92
msgid "Slovak"
msgstr "Slovaque"
#: conf/global_settings.py:92
#: conf/global_settings.py:93
msgid "Slovenian"
msgstr "Slovène"
#: conf/global_settings.py:93
#: conf/global_settings.py:94
msgid "Albanian"
msgstr "Albanais"
#: conf/global_settings.py:94
#: conf/global_settings.py:95
msgid "Serbian"
msgstr "Serbe"
#: conf/global_settings.py:95
#: conf/global_settings.py:96
msgid "Serbian Latin"
msgstr "Serbe latin"
#: conf/global_settings.py:96
#: conf/global_settings.py:97
msgid "Swedish"
msgstr "Suédois"
#: conf/global_settings.py:97
#: conf/global_settings.py:98
msgid "Tamil"
msgstr "Tamoul"
#: conf/global_settings.py:98
#: conf/global_settings.py:99
msgid "Telugu"
msgstr "Télougou"
#: conf/global_settings.py:99
#: conf/global_settings.py:100
msgid "Thai"
msgstr "Thaï"
#: conf/global_settings.py:100
#: conf/global_settings.py:101
msgid "Turkish"
msgstr "Turc"
#: conf/global_settings.py:101
#: conf/global_settings.py:102
msgid "Ukrainian"
msgstr "Ukrainien"
#: conf/global_settings.py:102
#: conf/global_settings.py:103
msgid "Vietnamese"
msgstr "Vietnamien"
#: conf/global_settings.py:103
#: conf/global_settings.py:104
msgid "Simplified Chinese"
msgstr "Chinois simplifié"
#: conf/global_settings.py:104
#: conf/global_settings.py:105
msgid "Traditional Chinese"
msgstr "Chinois traditionnel"
@ -311,15 +315,15 @@ msgstr "Ce mois-ci"
msgid "This year"
msgstr "Cette année"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes"
msgstr "Oui"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No"
msgstr "Non"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown"
msgstr "Inconnu"
@ -697,7 +701,7 @@ msgid "Filter"
msgstr "Filtre"
#: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete"
msgstr "Supprimer"
@ -796,7 +800,7 @@ msgstr ""
#: contrib/admin/templates/admin/login.html:19
msgid "Username:"
msgstr "Nom d'utilisateur :"
msgstr "Nom d'utilisateur :"
#: contrib/admin/templates/admin/login.html:22
msgid "Password:"
@ -859,7 +863,7 @@ msgstr "Enregistrer et ajouter un nouveau"
msgid "Save and continue editing"
msgstr "Enregistrer et continuer les modifications"
#: contrib/admin/templates/admin/auth/user/add_form.html:5
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
@ -867,6 +871,10 @@ msgstr ""
"Saisissez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez "
"ensuite modifier plus d'options."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Saisissez un nom d'utilisateur et un mot de passe."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1441,8 +1449,8 @@ msgstr "message"
msgid "Logged out"
msgstr "Déconnecté"
#: contrib/auth/management/commands/createsuperuser.py:23
#: core/validators.py:120 forms/fields.py:428
#: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address."
msgstr "Entrez une adresse de courriel valide."
@ -1511,7 +1519,7 @@ msgid "Email address"
msgstr "Adresse électronique"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1112
msgid "URL"
msgstr "URL"
@ -1563,7 +1571,7 @@ msgstr "commentaire"
msgid "date/time submitted"
msgstr "date et heure soumises"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896
#: contrib/comments/models.py:60 db/models/fields/__init__.py:907
msgid "IP address"
msgstr "adresse IP"
@ -4513,26 +4521,26 @@ msgstr "sites"
msgid "Enter a valid value."
msgstr "Saisissez une valeur valide."
#: core/validators.py:87 forms/fields.py:529
#: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL."
msgstr "Saisissez une URL valide."
#: core/validators.py:89 forms/fields.py:530
#: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link."
msgstr "Cette URL semble être cassée."
#: core/validators.py:123 forms/fields.py:873
#: core/validators.py:123 forms/fields.py:877
msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr ""
"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et "
"des traits d'union."
#: core/validators.py:126 forms/fields.py:866
#: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address."
msgstr "Saisissez une adresse IPv4 valide."
#: core/validators.py:129 db/models/fields/__init__.py:572
#: core/validators.py:129 db/models/fields/__init__.py:575
msgid "Enter only digits separated by commas."
msgstr "Saisissez uniquement des chiffres séparés par des virgules."
@ -4543,13 +4551,13 @@ msgstr ""
"Assurez-vous que cette valeur est %(limit_value)s (actuellement %(show_value)"
"s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257
#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr ""
"Assurez-vous que cette valeur est inférieure ou égale à %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258
#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr ""
@ -4602,134 +4610,134 @@ msgstr "Ce champ ne peut pas être vide."
msgid "Field of type: %(field_type)s"
msgstr "Champ de type : %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
#: db/models/fields/__init__.py:999
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:863
#: db/models/fields/__init__.py:972 db/models/fields/__init__.py:983
#: db/models/fields/__init__.py:1010
msgid "Integer"
msgstr "Entier"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:861
msgid "This value must be an integer."
msgstr "Cette valeur doit être un entier."
#: db/models/fields/__init__.py:490
#: db/models/fields/__init__.py:493
msgid "This value must be either True or False."
msgstr "Cette valeur doit être soit vraie (True) soit fausse (False)."
#: db/models/fields/__init__.py:492
#: db/models/fields/__init__.py:495
msgid "Boolean (Either True or False)"
msgstr "Booléen (soit vrai ou faux)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982
#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:993
#, python-format
msgid "String (up to %(max_length)s)"
msgstr "Chaîne de caractère (jusqu'à %(max_length)s)"
#: db/models/fields/__init__.py:567
#: db/models/fields/__init__.py:570
msgid "Comma-separated integers"
msgstr "Des entiers séparés par une virgule"
#: db/models/fields/__init__.py:581
#: db/models/fields/__init__.py:584
msgid "Date (without time)"
msgstr "Date (sans l'heure)"
#: db/models/fields/__init__.py:585
#: db/models/fields/__init__.py:588
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Saisissez une date valide au format AAAA-MM-JJ."
#: db/models/fields/__init__.py:586
#: db/models/fields/__init__.py:589
#, python-format
msgid "Invalid date: %s"
msgstr "Date non valide : %s"
#: db/models/fields/__init__.py:667
#: db/models/fields/__init__.py:670
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
msgstr ""
"Saisissez une date et une heure valides au format AAAA-MM-JJ HH:MM[:ss[."
"uuuuuu]]."
#: db/models/fields/__init__.py:669
#: db/models/fields/__init__.py:672
msgid "Date (with time)"
msgstr "Date (avec l'heure)"
#: db/models/fields/__init__.py:735
#: db/models/fields/__init__.py:738
msgid "This value must be a decimal number."
msgstr "Cette valeur doit être un nombre décimal."
#: db/models/fields/__init__.py:737
#: db/models/fields/__init__.py:740
msgid "Decimal number"
msgstr "Nombre décimal"
#: db/models/fields/__init__.py:792
#: db/models/fields/__init__.py:795
msgid "E-mail address"
msgstr "Adresse électronique"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220
#: db/models/fields/__init__.py:810 db/models/fields/files.py:220
#: db/models/fields/files.py:331
msgid "File path"
msgstr "Chemin vers le fichier"
#: db/models/fields/__init__.py:822
#: db/models/fields/__init__.py:833
msgid "This value must be a float."
msgstr "Cette valeur doit être un nombre réel."
#: db/models/fields/__init__.py:824
#: db/models/fields/__init__.py:835
msgid "Floating point number"
msgstr "Nombre à virgule flottante"
#: db/models/fields/__init__.py:883
#: db/models/fields/__init__.py:894
msgid "Big (8 byte) integer"
msgstr "Grand entier (8 octets)"
#: db/models/fields/__init__.py:912
#: db/models/fields/__init__.py:923
msgid "This value must be either None, True or False."
msgstr "Cette valeur doit être nulle (None), vraie (True) ou fausse (False)."
#: db/models/fields/__init__.py:914
#: db/models/fields/__init__.py:925
msgid "Boolean (Either True, False or None)"
msgstr "Booléen (soit vrai, faux ou nul)"
#: db/models/fields/__init__.py:1005
#: db/models/fields/__init__.py:1016
msgid "Text"
msgstr "Texte"
#: db/models/fields/__init__.py:1021
#: db/models/fields/__init__.py:1032
msgid "Time"
msgstr "Heure"
#: db/models/fields/__init__.py:1025
#: db/models/fields/__init__.py:1036
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Saisissez une heure valide au format HH:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:1109
#: db/models/fields/__init__.py:1128
msgid "XML text"
msgstr "Texte XML"
#: db/models/fields/related.py:799
#: db/models/fields/related.py:801
#, python-format
msgid "Model %(model)s with pk %(pk)r does not exist."
msgstr "Le modèle %(model)s avec la clef primaire %(pk)r n'existe pas."
#: db/models/fields/related.py:801
#: db/models/fields/related.py:803
msgid "Foreign Key (type determined by related field)"
msgstr "Clé étrangère (type défini par le champ lié)"
#: db/models/fields/related.py:918
#: db/models/fields/related.py:921
msgid "One-to-one relationship"
msgstr "Relation un à un"
#: db/models/fields/related.py:980
#: db/models/fields/related.py:983
msgid "Many-to-many relationship"
msgstr "Relation plusieurs à plusieurs"
#: db/models/fields/related.py:1000
#: db/models/fields/related.py:1003
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en "
"sélectionner plusieurs."
#: db/models/fields/related.py:1061
#: db/models/fields/related.py:1064
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@ -4743,55 +4751,55 @@ msgstr[1] ""
msgid "This field is required."
msgstr "Ce champ est obligatoire."
#: forms/fields.py:204
#: forms/fields.py:203
msgid "Enter a whole number."
msgstr "Saisissez un nombre entier."
#: forms/fields.py:235 forms/fields.py:256
#: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number."
msgstr "Saisissez un nombre."
#: forms/fields.py:259
#: forms/fields.py:258
#, python-format
msgid "Ensure that there are no more than %s digits in total."
msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres au total."
#: forms/fields.py:260
#: forms/fields.py:259
#, python-format
msgid "Ensure that there are no more than %s decimal places."
msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres après la virgule."
#: forms/fields.py:261
#: forms/fields.py:260
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres avant la virgule."
#: forms/fields.py:323 forms/fields.py:838
#: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date."
msgstr "Saisissez une date valide."
#: forms/fields.py:351 forms/fields.py:839
#: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time."
msgstr "Saisissez une heure valide."
#: forms/fields.py:377
#: forms/fields.py:376
msgid "Enter a valid date/time."
msgstr "Saisissez une date et une heure valides."
#: forms/fields.py:435
#: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"Aucun fichier n'a été soumis. Vérifiez le type d'encodage du formulaire."
#: forms/fields.py:436
#: forms/fields.py:435
msgid "No file was submitted."
msgstr "Aucun fichier n'a été soumis."
#: forms/fields.py:437
#: forms/fields.py:436
msgid "The submitted file is empty."
msgstr "Le fichier soumis est vide."
#: forms/fields.py:438
#: forms/fields.py:437
#, python-format
msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
@ -4799,7 +4807,7 @@ msgstr ""
"Assurez-vous que ce nom de fichier ne contient pas plus de %(max)d "
"caractères (actuellement %(length)d caractères)."
#: forms/fields.py:473
#: forms/fields.py:472
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@ -4807,17 +4815,17 @@ msgstr ""
"Téléversez une image valide. Le fichier que vous avez transféré n'est pas "
"une image ou bien est corrompu."
#: forms/fields.py:596 forms/fields.py:671
#: forms/fields.py:595 forms/fields.py:670
#, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "Sélectionnez un choix valide. %(value)s n'en fait pas partie."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002
#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values."
msgstr "Saisissez une liste de valeurs."
# Si « : » est requis, créer un ticket
#: forms/formsets.py:298 forms/formsets.py:300
#: forms/formsets.py:296 forms/formsets.py:298
msgid "Order"
msgstr "Ordre"
@ -4868,28 +4876,28 @@ msgstr "Sélectionnez un choix valide ; %s n'en fait pas partie."
msgid "\"%s\" is not a valid value for a primary key."
msgstr "« %s » n'est pas une valeur correcte pour une clé primaire."
#: template/defaultfilters.py:776
#: template/defaultfilters.py:780
msgid "yes,no,maybe"
msgstr "oui, non, peut-être"
#: template/defaultfilters.py:807
#: template/defaultfilters.py:811
#, python-format
msgid "%(size)d byte"
msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d octet"
msgstr[1] "%(size)d octets"
#: template/defaultfilters.py:809
#: template/defaultfilters.py:813
#, python-format
msgid "%.1f KB"
msgstr "%.1f Ko"
#: template/defaultfilters.py:811
#: template/defaultfilters.py:815
#, python-format
msgid "%.1f MB"
msgstr "%.1f Mo"
#: template/defaultfilters.py:812
#: template/defaultfilters.py:816
#, python-format
msgid "%.1f GB"
msgstr "%.1f Go"
@ -5100,7 +5108,7 @@ msgstr "nov."
msgid "Dec."
msgstr "déc."
#: utils/text.py:130
#: utils/text.py:136
msgid "or"
msgstr "ou"

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

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

View File

View File

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

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-16 22:39+0200\n"
"POT-Creation-Date: 2010-08-07 21:14+0200\n"
"PO-Revision-Date: 2010-03-04 12:13+0200\n"
"Last-Translator: Håvard Grimelid\n"
"Language-Team: Norsk nynorsk <nn@li.org>\n"
@ -67,7 +67,7 @@ msgid "Spanish"
msgstr "Spansk"
#: conf/global_settings.py:57
msgid "Argentinean Spanish"
msgid "Argentinian Spanish"
msgstr "Argentinsk spansk"
#: conf/global_settings.py:58
@ -163,98 +163,102 @@ msgid "Macedonian"
msgstr "Makedonsk"
#: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayalam"
#: conf/global_settings.py:82
msgid "Mongolian"
msgstr "Mongolsk"
#: conf/global_settings.py:82
#: conf/global_settings.py:83
msgid "Dutch"
msgstr "Nederlandsk"
#: conf/global_settings.py:83
#: conf/global_settings.py:84
msgid "Norwegian"
msgstr "Norsk"
#: conf/global_settings.py:84
#: conf/global_settings.py:85
msgid "Norwegian Bokmal"
msgstr "Norsk (bokmål)"
#: conf/global_settings.py:85
#: conf/global_settings.py:86
msgid "Norwegian Nynorsk"
msgstr "Norsk (nynorsk)"
#: conf/global_settings.py:86
#: conf/global_settings.py:87
msgid "Polish"
msgstr "Polsk"
#: conf/global_settings.py:87
#: conf/global_settings.py:88
msgid "Portuguese"
msgstr "Portugisisk"
#: conf/global_settings.py:88
#: conf/global_settings.py:89
msgid "Brazilian Portuguese"
msgstr "Brasiliansk portugisisk"
#: conf/global_settings.py:89
#: conf/global_settings.py:90
msgid "Romanian"
msgstr "Rumensk"
#: conf/global_settings.py:90
#: conf/global_settings.py:91
msgid "Russian"
msgstr "Russisk"
#: conf/global_settings.py:91
#: conf/global_settings.py:92
msgid "Slovak"
msgstr "Slovakisk"
#: conf/global_settings.py:92
#: conf/global_settings.py:93
msgid "Slovenian"
msgstr "Slovensk"
#: conf/global_settings.py:93
#: conf/global_settings.py:94
msgid "Albanian"
msgstr "Albansk"
#: conf/global_settings.py:94
#: conf/global_settings.py:95
msgid "Serbian"
msgstr "Serbisk"
#: conf/global_settings.py:95
#: conf/global_settings.py:96
msgid "Serbian Latin"
msgstr "Serbisk latin"
#: conf/global_settings.py:96
#: conf/global_settings.py:97
msgid "Swedish"
msgstr "Svensk"
#: conf/global_settings.py:97
#: conf/global_settings.py:98
msgid "Tamil"
msgstr "Tamil"
#: conf/global_settings.py:98
#: conf/global_settings.py:99
msgid "Telugu"
msgstr "Telugu"
#: conf/global_settings.py:99
#: conf/global_settings.py:100
msgid "Thai"
msgstr "Thai"
#: conf/global_settings.py:100
#: conf/global_settings.py:101
msgid "Turkish"
msgstr "Tyrkisk"
#: conf/global_settings.py:101
#: conf/global_settings.py:102
msgid "Ukrainian"
msgstr "Ukrainsk"
#: conf/global_settings.py:102
#: conf/global_settings.py:103
msgid "Vietnamese"
msgstr "Vietnamesisk"
#: conf/global_settings.py:103
#: conf/global_settings.py:104
msgid "Simplified Chinese"
msgstr "Simplifisert kinesisk"
#: conf/global_settings.py:104
#: conf/global_settings.py:105
msgid "Traditional Chinese"
msgstr "Tradisjonell kinesisk"
@ -306,15 +310,15 @@ msgstr "Denne månaden"
msgid "This year"
msgstr "I år"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes"
msgstr "Ja"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No"
msgstr "Nei"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown"
msgstr "Ukjend"
@ -451,8 +455,8 @@ msgstr[1] "%(count)s %(name)s vart endra."
#, python-format
msgid "%(total_count)s selected"
msgid_plural "All %(total_count)s selected"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%(total_count)s valde"
msgstr[1] "Alle %(total_count)s valde"
#: contrib/admin/options.py:1071
#, python-format
@ -684,7 +688,7 @@ msgid "Filter"
msgstr "Filtrering"
#: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete"
msgstr "Slett"
@ -843,7 +847,7 @@ msgstr "Lagre og opprett ny"
msgid "Save and continue editing"
msgstr "Lagre og hald fram å redigere"
#: contrib/admin/templates/admin/auth/user/add_form.html:5
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
@ -851,6 +855,10 @@ msgstr ""
"Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre "
"fleire brukarinnstillingar."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Skriv inn nytt brukarnamn og passord."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1407,8 +1415,8 @@ msgstr "melding"
msgid "Logged out"
msgstr "Logga ut"
#: contrib/auth/management/commands/createsuperuser.py:23
#: core/validators.py:120 forms/fields.py:428
#: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address."
msgstr "Oppgje ei gyldig e-postadresse."
@ -1476,7 +1484,7 @@ msgid "Email address"
msgstr "E-postadresse"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1112
msgid "URL"
msgstr "Nettadresse"
@ -1526,7 +1534,7 @@ msgstr "kommentar"
msgid "date/time submitted"
msgstr "dato/tid for innsending"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896
#: contrib/comments/models.py:60 db/models/fields/__init__.py:907
msgid "IP address"
msgstr "IP-adresse"
@ -4453,26 +4461,26 @@ msgstr "nettstader"
msgid "Enter a valid value."
msgstr "Oppgje ein gyldig verdi."
#: core/validators.py:87 forms/fields.py:529
#: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL."
msgstr "Oppgje ei gyldig nettadresse."
#: core/validators.py:89 forms/fields.py:530
#: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link."
msgstr "Nettadressa fører til ei side som ikkje eksisterar."
#: core/validators.py:123 forms/fields.py:873
#: core/validators.py:123 forms/fields.py:877
msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr ""
"Oppgje ein gyldig 'slug' som består av bokstavar, nummer, understrekar eller "
"bindestrekar."
#: core/validators.py:126 forms/fields.py:866
#: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address."
msgstr "Oppgje ei gyldig IPv4-adresse."
#: core/validators.py:129 db/models/fields/__init__.py:572
#: core/validators.py:129 db/models/fields/__init__.py:575
msgid "Enter only digits separated by commas."
msgstr "Oppgje berre tall skild med komma."
@ -4481,12 +4489,12 @@ msgstr "Oppgje berre tall skild med komma."
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "Verdien må minimum ha %(limit_value)s teikn (den er %(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257
#: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Verdien må vere mindre enn eller lik %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258
#: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Verdien må vere større enn eller lik %(limit_value)s."
@ -4534,132 +4542,132 @@ msgstr "Feltet kan ikkje vere tomt."
msgid "Field of type: %(field_type)s"
msgstr "Felt av typen: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
#: db/models/fields/__init__.py:999
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:863
#: db/models/fields/__init__.py:972 db/models/fields/__init__.py:983
#: db/models/fields/__init__.py:1010
msgid "Integer"
msgstr "Heiltal"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:861
msgid "This value must be an integer."
msgstr "Verdien må vere eit heltall."
#: db/models/fields/__init__.py:490
#: db/models/fields/__init__.py:493
msgid "This value must be either True or False."
msgstr "Verdien må vere True eller False."
#: db/models/fields/__init__.py:492
#: db/models/fields/__init__.py:495
msgid "Boolean (Either True or False)"
msgstr "Boolsk (True eller False)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982
#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:993
#, python-format
msgid "String (up to %(max_length)s)"
msgstr "Tekst (opp til %(max_length)s teikn)"
#: db/models/fields/__init__.py:567
#: db/models/fields/__init__.py:570
msgid "Comma-separated integers"
msgstr "Heiltal skild med komma"
#: db/models/fields/__init__.py:581
#: db/models/fields/__init__.py:584
msgid "Date (without time)"
msgstr "Dato (utan tid)"
#: db/models/fields/__init__.py:585
#: db/models/fields/__init__.py:588
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Oppgje ein gyldig dato på forma ÅÅÅÅ-MM-DD."
#: db/models/fields/__init__.py:586
#: db/models/fields/__init__.py:589
#, python-format
msgid "Invalid date: %s"
msgstr "Ugyldig dato: %s"
#: db/models/fields/__init__.py:667
#: db/models/fields/__init__.py:670
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
msgstr "Oppgje dato og tid på forma ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:669
#: db/models/fields/__init__.py:672
msgid "Date (with time)"
msgstr "Dato (med tid)"
#: db/models/fields/__init__.py:735
#: db/models/fields/__init__.py:738
msgid "This value must be a decimal number."
msgstr "Verdien må vere eit desimaltall."
#: db/models/fields/__init__.py:737
#: db/models/fields/__init__.py:740
msgid "Decimal number"
msgstr "Desimaltall"
#: db/models/fields/__init__.py:792
#: db/models/fields/__init__.py:795
msgid "E-mail address"
msgstr "E-postadresse"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220
#: db/models/fields/__init__.py:810 db/models/fields/files.py:220
#: db/models/fields/files.py:331
msgid "File path"
msgstr "Filsti"
#: db/models/fields/__init__.py:822
#: db/models/fields/__init__.py:833
msgid "This value must be a float."
msgstr "Verdien må vere eit flyttall."
#: db/models/fields/__init__.py:824
#: db/models/fields/__init__.py:835
msgid "Floating point number"
msgstr "Flyttall"
#: db/models/fields/__init__.py:883
#: db/models/fields/__init__.py:894
msgid "Big (8 byte) integer"
msgstr ""
#: db/models/fields/__init__.py:912
#: db/models/fields/__init__.py:923
msgid "This value must be either None, True or False."
msgstr "Verdien må vere None, True eller False."
#: db/models/fields/__init__.py:914
#: db/models/fields/__init__.py:925
msgid "Boolean (Either True, False or None)"
msgstr "Boolsk (True, False eller None)"
#: db/models/fields/__init__.py:1005
#: db/models/fields/__init__.py:1016
msgid "Text"
msgstr "Tekst"
#: db/models/fields/__init__.py:1021
#: db/models/fields/__init__.py:1032
msgid "Time"
msgstr "Tid"
#: db/models/fields/__init__.py:1025
#: db/models/fields/__init__.py:1036
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Oppgje tida på forma TT:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:1109
#: db/models/fields/__init__.py:1128
msgid "XML text"
msgstr "XML-tekst"
#: db/models/fields/related.py:799
#: db/models/fields/related.py:801
#, python-format
msgid "Model %(model)s with pk %(pk)r does not exist."
msgstr "Modellen %(model)s med primærnøkkelen %(pk)r eksisterer ikkje."
#: db/models/fields/related.py:801
#: db/models/fields/related.py:803
msgid "Foreign Key (type determined by related field)"
msgstr "Primærnøkkel (type bestemt av relatert felt)"
#: db/models/fields/related.py:918
#: db/models/fields/related.py:921
msgid "One-to-one relationship"
msgstr "Ein-til-ein-forhold"
#: db/models/fields/related.py:980
#: db/models/fields/related.py:983
msgid "Many-to-many relationship"
msgstr "Mange-til-mange-forhold"
#: db/models/fields/related.py:1000
#: db/models/fields/related.py:1003
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Hald nede \"Control\", eller \"Command\" på ein Mac, for å velge meir enn "
"éin."
#: db/models/fields/related.py:1061
#: db/models/fields/related.py:1064
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@ -4671,60 +4679,60 @@ msgstr[1] "Oppgje gyldige %(self)s-ID-ar. Verdiane %(value)r er ugyldige."
msgid "This field is required."
msgstr "Feltet er påkravd."
#: forms/fields.py:204
#: forms/fields.py:203
msgid "Enter a whole number."
msgstr "Oppgje eit heiltall."
#: forms/fields.py:235 forms/fields.py:256
#: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number."
msgstr "Oppgje eit tall."
#: forms/fields.py:259
#: forms/fields.py:258
#, python-format
msgid "Ensure that there are no more than %s digits in total."
msgstr "Verdien kan ikkje ha meir enn %s siffer totalt."
#: forms/fields.py:260
#: forms/fields.py:259
#, python-format
msgid "Ensure that there are no more than %s decimal places."
msgstr "Verdien kan ikkie ha meir enn %s desimalar."
#: forms/fields.py:261
#: forms/fields.py:260
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Verdien kan ikkje ha meir enn %s siffer framfor komma."
#: forms/fields.py:323 forms/fields.py:838
#: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date."
msgstr "Oppgje ein gyldig dato."
#: forms/fields.py:351 forms/fields.py:839
#: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time."
msgstr "Oppgje eit gyldig tidspunkt."
#: forms/fields.py:377
#: forms/fields.py:376
msgid "Enter a valid date/time."
msgstr "Oppgje gyldig dato og tidspunkt."
#: forms/fields.py:435
#: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form."
msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet."
#: forms/fields.py:436
#: forms/fields.py:435
msgid "No file was submitted."
msgstr "Inga fil vart sendt."
#: forms/fields.py:437
#: forms/fields.py:436
msgid "The submitted file is empty."
msgstr "Fila er tom."
#: forms/fields.py:438
#: forms/fields.py:437
#, python-format
msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr "Filnamnet kan maksimalt ha %(max)d teikn (det har %(length)d)."
#: forms/fields.py:473
#: forms/fields.py:472
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@ -4732,17 +4740,17 @@ msgstr ""
"Last opp eit gyldig bilete. Fila du lasta opp var ødelagt eller ikkje eit "
"bilete."
#: forms/fields.py:596 forms/fields.py:671
#: forms/fields.py:595 forms/fields.py:670
#, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr ""
"Velg eit gyldig valg. %(value)s er ikkje eit av dei tilgjengelege valga."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002
#: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values."
msgstr "Oppgje ei liste med verdiar."
#: forms/formsets.py:298 forms/formsets.py:300
#: forms/formsets.py:296 forms/formsets.py:298
msgid "Order"
msgstr "Rekkefølge"
@ -4788,28 +4796,28 @@ msgstr "Velg eit gyldig valg. %s er ikkje eit av dei tilgjengelege valga."
msgid "\"%s\" is not a valid value for a primary key."
msgstr "\"%s\" er ikkje ein gyldig verdi for ein primærnøkkel."
#: template/defaultfilters.py:776
#: template/defaultfilters.py:780
msgid "yes,no,maybe"
msgstr "ja,nei,kanskje"
#: template/defaultfilters.py:807
#: template/defaultfilters.py:811
#, python-format
msgid "%(size)d byte"
msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d byte"
msgstr[1] "%(size)d bytes"
#: template/defaultfilters.py:809
#: template/defaultfilters.py:813
#, python-format
msgid "%.1f KB"
msgstr "%.1f KB"
#: template/defaultfilters.py:811
#: template/defaultfilters.py:815
#, python-format
msgid "%.1f MB"
msgstr "%.1f MB"
#: template/defaultfilters.py:812
#: template/defaultfilters.py:816
#, python-format
msgid "%.1f GB"
msgstr "%.1f GB"
@ -4880,7 +4888,7 @@ msgstr "ons"
#: utils/dates.py:10
msgid "Thu"
msgstr "tors"
msgstr "tor"
#: utils/dates.py:10
msgid "Fri"
@ -4888,7 +4896,7 @@ msgstr "fre"
#: utils/dates.py:11
msgid "Sat"
msgstr "laur"
msgstr "lau"
#: utils/dates.py:11
msgid "Sun"
@ -5018,7 +5026,7 @@ msgstr "nov."
msgid "Dec."
msgstr "des."
#: utils/text.py:130
#: utils/text.py:136
msgid "or"
msgstr "eller"

View File

@ -28,5 +28,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25'
)
DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.'
THOUSAND_SEPARATOR = ' '
NUMBER_GROUPING = 3

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -91,4 +91,6 @@ INSTALLED_APPS = (
'django.contrib.messages',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)

View File

@ -8,8 +8,7 @@ urlpatterns = patterns('',
# Example:
# (r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# Uncomment the admin/doc line below to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:

View File

@ -445,6 +445,14 @@ ul.messagelist li {
background: #ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat;
}
ul.messagelist li.warning{
background-image: url(../img/admin/icon_alert.gif);
}
ul.messagelist li.error{
background-image: url(../img/admin/icon_error.gif);
}
.errornote {
font-size: 12px !important;
display: block;
@ -470,6 +478,11 @@ ul.errorlist {
background: red url(../img/admin/icon_alert.gif) 5px .3em no-repeat;
}
.errorlist li a {
color: white;
text-decoration: underline;
}
td ul.errorlist {
margin: 0 !important;
padding: 0 !important;

View File

@ -9,6 +9,8 @@
width: 100%;
}
.change-list .hiddenfields { display:none; }
.change-list .filtered table {
border-right: 1px solid #ddd;
}
@ -21,7 +23,7 @@
background: white url(../img/admin/changelist-bg.gif) top right repeat-y !important;
}
.change-list .filtered table, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
margin-right: 160px !important;
width: auto !important;
}

View File

@ -100,8 +100,9 @@ var dateParsePatterns = [
{ re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i,
handler: function(bits) {
var d = new Date();
d.setDate(parseInt(bits[1], 10));
d.setDate(1);
d.setMonth(parseMonth(bits[2]));
d.setDate(parseInt(bits[1], 10));
return d;
}
},
@ -109,9 +110,10 @@ var dateParsePatterns = [
{ re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
handler: function(bits) {
var d = new Date();
d.setDate(parseInt(bits[1], 10));
d.setMonth(parseMonth(bits[2]));
d.setDate(1);
d.setYear(bits[3]);
d.setMonth(parseMonth(bits[2]));
d.setDate(parseInt(bits[1], 10));
return d;
}
},
@ -119,8 +121,9 @@ var dateParsePatterns = [
{ re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i,
handler: function(bits) {
var d = new Date();
d.setDate(parseInt(bits[2], 10));
d.setDate(1);
d.setMonth(parseMonth(bits[1]));
d.setDate(parseInt(bits[2], 10));
return d;
}
},
@ -128,9 +131,10 @@ var dateParsePatterns = [
{ re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i,
handler: function(bits) {
var d = new Date();
d.setDate(parseInt(bits[2], 10));
d.setMonth(parseMonth(bits[1]));
d.setDate(1);
d.setYear(bits[3]);
d.setMonth(parseMonth(bits[1]));
d.setDate(parseInt(bits[2], 10));
return d;
}
},
@ -158,9 +162,10 @@ var dateParsePatterns = [
{ re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
handler: function(bits) {
var d = new Date();
d.setDate(1);
d.setYear(bits[3]);
d.setDate(parseInt(bits[2], 10));
d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
d.setDate(parseInt(bits[2], 10));
return d;
}
},
@ -168,6 +173,7 @@ var dateParsePatterns = [
{ re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
handler: function(bits) {
var d = new Date();
d.setDate(1);
d.setYear(parseInt(bits[1]));
d.setMonth(parseInt(bits[2], 10) - 1);
d.setDate(parseInt(bits[3], 10));

View File

@ -108,7 +108,13 @@ class BaseModelAdmin(object):
# rendered output. formfield can be None if it came from a
# OneToOneField with parent_link=True or a M2M intermediary.
if formfield and db_field.name not in self.raw_id_fields:
formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site)
related_modeladmin = self.admin_site._registry.get(
db_field.rel.to)
can_add_related = bool(related_modeladmin and
related_modeladmin.has_add_permission(request))
formfield.widget = widgets.RelatedFieldWidgetWrapper(
formfield.widget, db_field.rel, self.admin_site,
can_add_related=can_add_related)
return formfield
@ -502,7 +508,7 @@ class ModelAdmin(BaseModelAdmin):
# Convert the actions into a SortedDict keyed by name
# and sorted by description.
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower()))
actions.sort(key=lambda k: k[2].lower())
actions = SortedDict([
(name, (func, name, desc))
for func, name, desc in actions
@ -755,7 +761,7 @@ class ModelAdmin(BaseModelAdmin):
if isinstance(response, HttpResponse):
return response
else:
return HttpResponseRedirect(".")
return HttpResponseRedirect(request.get_full_path())
else:
msg = _("No action selected.")
self.message_user(request, msg)

View File

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

View File

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

View File

@ -56,7 +56,9 @@
{% endif %}
{% if messages %}
<ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
<ul class="messagelist">{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}</ul>
{% endif %}
<!-- Content -->

View File

@ -1,4 +1,10 @@
{% if result_hidden_fields %}
<div class="hiddenfields"> {# DIV for HTML validation #}
{% for item in result_hidden_fields %}{{ item }}{% endfor %}
</div>
{% endif %}
{% if results %}
<div class="results">
<table cellspacing="0" id="result_list">
<thead>
<tr>
@ -14,4 +20,5 @@
{% endfor %}
</tbody>
</table>
</div>
{% endif %}

View File

@ -189,7 +189,7 @@ def items_for_result(cl, result, form):
else:
result_repr = conditional_escape(result_repr)
yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr))
if form:
if form and not form[cl.model._meta.pk.name].is_hidden:
yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def results(cl):
@ -200,11 +200,18 @@ def results(cl):
for res in cl.result_list:
yield list(items_for_result(cl, res, None))
def result_hidden_fields(cl):
if cl.formset:
for res, form in zip(cl.result_list, cl.formset.forms):
if form[cl.model._meta.pk.name].is_hidden:
yield mark_safe(force_unicode(form[cl.model._meta.pk.name]))
def result_list(cl):
"""
Displays the headers and data list together
"""
return {'cl': cl,
'result_hidden_fields': list(result_hidden_fields(cl)),
'result_headers': list(result_headers(cl)),
'results': list(results(cl))}
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)

View File

@ -154,9 +154,9 @@ class ForeignKeyRawIdWidget(forms.TextInput):
key = self.rel.get_related_field().name
try:
obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
except self.rel.to.DoesNotExist:
return ''
return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
except (ValueError, self.rel.to.DoesNotExist):
return ''
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
"""
@ -169,7 +169,7 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
def render(self, name, value, attrs=None):
attrs['class'] = 'vManyToManyRawIdAdminField'
if value:
value = ','.join([str(v) for v in value])
value = ','.join([force_unicode(v) for v in value])
else:
value = ''
return super(ManyToManyRawIdWidget, self).render(name, value, attrs)
@ -205,13 +205,18 @@ class RelatedFieldWidgetWrapper(forms.Widget):
This class is a wrapper to a given widget to add the add icon for the
admin interface.
"""
def __init__(self, widget, rel, admin_site):
def __init__(self, widget, rel, admin_site, can_add_related=None):
self.is_hidden = widget.is_hidden
self.needs_multipart_form = widget.needs_multipart_form
self.attrs = widget.attrs
self.choices = widget.choices
self.widget = widget
self.rel = rel
# Backwards compatible check for whether a user can add related
# objects.
if can_add_related is None:
can_add_related = rel_to in self.admin_site._registry
self.can_add_related = can_add_related
# so we can check if the related object is registered with this AdminSite
self.admin_site = admin_site
@ -236,7 +241,7 @@ class RelatedFieldWidgetWrapper(forms.Widget):
related_url = '%s%s/%s/add/' % info
self.widget.choices = self.choices
output = [self.widget.render(name, value, *args, **kwargs)]
if rel_to in self.admin_site._registry: # If the related object has an admin interface:
if self.can_add_related:
# TODO: "id_" is hard-coded here. This should instead use the correct
# API to determine the ID dynamically.
output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \

View File

@ -15,7 +15,7 @@
<h2>{% firstof library.grouper "Built-in filters" %}</h2>
{% if library.grouper %}<p class="small quiet">To use these filters, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the filter.</p><hr />{% endif %}
{% for filter in library.list|dictsort:"name" %}
<h3 id="{{ filter.name }}">{{ filter.name }}</h3>
<h3 id="{{ library.grouper|default_if_none:"built_in" }}-{{ filter.name }}">{{ filter.name }}</h3>
<p>{{ filter.title }}</p>
<p>{{ filter.body }}</p>
{% if not forloop.last %}<hr />{% endif %}
@ -36,7 +36,7 @@
<h2>{% firstof library.grouper "Built-in filters" %}</h2>
<ul>
{% for filter in library.list|dictsort:"name" %}
<li><a href="#{{ filter.name }}">{{ filter.name }}</a></li>
<li><a href="#{{ library.grouper|default_if_none:"built_in" }}-{{ filter.name }}">{{ filter.name }}</a></li>
{% endfor %}
</ul>
</div>

View File

@ -15,7 +15,7 @@
<h2>{% firstof library.grouper "Built-in tags" %}</h2>
{% if library.grouper %}<p class="small quiet">To use these tags, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the tag.</p><hr />{% endif %}
{% for tag in library.list|dictsort:"name" %}
<h3 id="{{ tag.name }}">{{ tag.name }}</h3>
<h3 id="{{ library.grouper|default_if_none:"built_in" }}-{{ tag.name }}">{{ tag.name }}</h3>
<h4>{{ tag.title }}</h4>
<p>{{ tag.body }}</p>
{% if not forloop.last %}<hr />{% endif %}
@ -36,7 +36,7 @@
<h2>{% firstof library.grouper "Built-in tags" %}</h2>
<ul>
{% for tag in library.list|dictsort:"name" %}
<li><a href="#{{ tag.name }}">{{ tag.name }}</a></li>
<li><a href="#{{ library.grouper|default_if_none:"built_in" }}-{{ tag.name }}">{{ tag.name }}</a></li>
{% endfor %}
</ul>
</div>

View File

@ -54,7 +54,9 @@ def template_tag_index(request):
load_all_installed_template_libraries()
tags = []
for module_name, library in template.libraries.items():
app_libs = template.libraries.items()
builtin_libs = [(None, lib) for lib in template.builtins]
for module_name, library in builtin_libs + app_libs:
for tag_name, tag_func in library.tags.items():
title, body, metadata = utils.parse_docstring(tag_func.__doc__)
if title:
@ -87,7 +89,9 @@ def template_filter_index(request):
load_all_installed_template_libraries()
filters = []
for module_name, library in template.libraries.items():
app_libs = template.libraries.items()
builtin_libs = [(None, lib) for lib in template.builtins]
for module_name, library in builtin_libs + app_libs:
for filter_name, filter_func in library.filters.items():
title, body, metadata = utils.parse_docstring(filter_func.__doc__)
if title:

View File

@ -30,13 +30,14 @@ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIE
return decorator
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME):
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
"""
Decorator for views that checks that the user is logged in, redirecting
to the log-in page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.is_authenticated(),
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:

View File

@ -52,6 +52,12 @@ class UserChangeForm(forms.ModelForm):
class Meta:
model = User
def __init__(self, *args, **kwargs):
super(UserChangeForm, self).__init__(*args, **kwargs)
f = self.fields.get('user_permissions', None)
if f is not None:
f.queryset = f.queryset.select_related('content_type')
class AuthenticationForm(forms.Form):
"""
Base class for authenticating users. Extend this to get a form that accepts
@ -111,7 +117,7 @@ class PasswordResetForm(forms.Form):
return email
def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
use_https=False, token_generator=default_token_generator):
use_https=False, token_generator=default_token_generator, from_email=None):
"""
Generates a one-use only link for resetting password and sends to the user
"""
@ -134,7 +140,7 @@ class PasswordResetForm(forms.Form):
'protocol': use_https and 'https' or 'http',
}
send_mail(_("Password reset on %s") % site_name,
t.render(Context(c)), None, [user.email])
t.render(Context(c)), from_email, [user.email])
class SetPasswordForm(forms.Form):
"""

View File

@ -1,7 +1,7 @@
from django.contrib.auth.tests.auth_backends import BackendTest, RowlevelBackendTest, AnonymousUserBackendTest, NoAnonymousUserBackendTest
from django.contrib.auth.tests.basic import BASIC_TESTS
from django.contrib.auth.tests.decorators import LoginRequiredTestCase
from django.contrib.auth.tests.forms import FORM_TESTS
from django.contrib.auth.tests.forms import UserCreationFormTest, AuthenticationFormTest, SetPasswordFormTest, PasswordChangeFormTest, UserChangeFormTest, PasswordResetFormTest
from django.contrib.auth.tests.remote_user \
import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest
from django.contrib.auth.tests.models import ProfileTestCase
@ -13,6 +13,5 @@ from django.contrib.auth.tests.views \
__test__ = {
'BASIC_TESTS': BASIC_TESTS,
'FORM_TESTS': FORM_TESTS,
'TOKEN_GENERATOR_TESTS': TOKEN_GENERATOR_TESTS,
}

View File

@ -1,12 +1,12 @@
from unittest import TestCase
from django.contrib.auth.decorators import login_required
from django.contrib.auth.tests.views import AuthViewsTestCase
class LoginRequiredTestCase(TestCase):
class LoginRequiredTestCase(AuthViewsTestCase):
"""
Tests the login_required decorators
"""
urls = 'django.contrib.auth.tests.urls'
def testCallable(self):
"""
Check that login_required is assignable to callable objects.
@ -23,3 +23,23 @@ class LoginRequiredTestCase(TestCase):
def normal_view(request):
pass
login_required(normal_view)
def testLoginRequired(self, view_url='/login_required/', login_url='/login/'):
"""
Check that login_required works on a simple view wrapped in a
login_required decorator.
"""
response = self.client.get(view_url)
self.assertEqual(response.status_code, 302)
self.assert_(login_url in response['Location'])
self.login()
response = self.client.get(view_url)
self.assertEqual(response.status_code, 200)
def testLoginRequiredNextUrl(self):
"""
Check that login_required works on a simple view wrapped in a
login_required decorator with a login_url set.
"""
self.testLoginRequired(view_url='/login_required_login_url/',
login_url='/somewhere/')

View File

@ -1,231 +1,252 @@
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordChangeForm, SetPasswordForm, UserChangeForm, PasswordResetForm
from django.test import TestCase
FORM_TESTS = """
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
>>> from django.contrib.auth.forms import PasswordChangeForm, SetPasswordForm
# The user already exists.
class UserCreationFormTest(TestCase):
>>> user = User.objects.create_user("jsmith", "jsmith@example.com", "test123")
>>> data = {
... 'username': 'jsmith',
... 'password1': 'test123',
... 'password2': 'test123',
... }
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form["username"].errors
[u'A user with that username already exists.']
fixtures = ['authtestdata.json']
# The username contains invalid data.
def test_user_already_exists(self):
data = {
'username': 'testclient',
'password1': 'test123',
'password2': 'test123',
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form["username"].errors,
[u'A user with that username already exists.'])
>>> data = {
... 'username': 'jsmith!',
... 'password1': 'test123',
... 'password2': 'test123',
... }
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form["username"].errors
[u'This value may contain only letters, numbers and @/./+/-/_ characters.']
def test_invalid_data(self):
data = {
'username': 'jsmith!',
'password1': 'test123',
'password2': 'test123',
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form["username"].errors,
[u'This value may contain only letters, numbers and @/./+/-/_ characters.'])
def test_password_verification(self):
# The verification password is incorrect.
data = {
'username': 'jsmith',
'password1': 'test123',
'password2': 'test',
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form["password2"].errors,
[u"The two password fields didn't match."])
>>> data = {
... 'username': 'jsmith2',
... 'password1': 'test123',
... 'password2': 'test',
... }
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form["password2"].errors
[u"The two password fields didn't match."]
def test_both_passwords(self):
# One (or both) passwords weren't given
data = {'username': 'jsmith'}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form['password1'].errors,
[u'This field is required.'])
self.assertEqual(form['password2'].errors,
[u'This field is required.'])
>>> data = {'username': 'jsmith2'}
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form['password1'].errors
[u'This field is required.']
>>> form['password2'].errors
[u'This field is required.']
>>> data['password2'] = 'test123'
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form['password1'].errors
[u'This field is required.']
data['password2'] = 'test123'
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form['password1'].errors,
[u'This field is required.'])
def test_success(self):
# The success case.
>>> data = {
... 'username': 'jsmith2@example.com',
... 'password1': 'test123',
... 'password2': 'test123',
... }
>>> form = UserCreationForm(data)
>>> form.is_valid()
True
>>> form.save()
<User: jsmith2@example.com>
data = {
'username': 'jsmith@example.com',
'password1': 'test123',
'password2': 'test123',
}
form = UserCreationForm(data)
self.assertTrue(form.is_valid())
u = form.save()
self.assertEqual(repr(u), '<User: jsmith@example.com>')
class AuthenticationFormTest(TestCase):
fixtures = ['authtestdata.json']
def test_invalid_username(self):
# The user submits an invalid username.
>>> data = {
... 'username': 'jsmith_does_not_exist',
... 'password': 'test123',
... }
>>> form = AuthenticationForm(None, data)
>>> form.is_valid()
False
>>> form.non_field_errors()
[u'Please enter a correct username and password. Note that both fields are case-sensitive.']
data = {
'username': 'jsmith_does_not_exist',
'password': 'test123',
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
self.assertEqual(form.non_field_errors(),
[u'Please enter a correct username and password. Note that both fields are case-sensitive.'])
def test_inactive_user(self):
# The user is inactive.
data = {
'username': 'inactive',
'password': 'password',
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
self.assertEqual(form.non_field_errors(),
[u'This account is inactive.'])
>>> data = {
... 'username': 'jsmith',
... 'password': 'test123',
... }
>>> user.is_active = False
>>> user.save()
>>> form = AuthenticationForm(None, data)
>>> form.is_valid()
False
>>> form.non_field_errors()
[u'This account is inactive.']
>>> user.is_active = True
>>> user.save()
def test_success(self):
# The success case
data = {
'username': 'testclient',
'password': 'password',
}
form = AuthenticationForm(None, data)
self.assertTrue(form.is_valid())
self.assertEqual(form.non_field_errors(), [])
>>> form = AuthenticationForm(None, data)
>>> form.is_valid()
True
>>> form.non_field_errors()
[]
### SetPasswordForm:
class SetPasswordFormTest(TestCase):
fixtures = ['authtestdata.json']
def test_password_verification(self):
# The two new passwords do not match.
user = User.objects.get(username='testclient')
data = {
'new_password1': 'abc123',
'new_password2': 'abc',
}
form = SetPasswordForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(form["new_password2"].errors,
[u"The two password fields didn't match."])
>>> data = {
... 'new_password1': 'abc123',
... 'new_password2': 'abc',
... }
>>> form = SetPasswordForm(user, data)
>>> form.is_valid()
False
>>> form["new_password2"].errors
[u"The two password fields didn't match."]
def test_success(self):
user = User.objects.get(username='testclient')
data = {
'new_password1': 'abc123',
'new_password2': 'abc123',
}
form = SetPasswordForm(user, data)
self.assertTrue(form.is_valid())
# The success case.
>>> data = {
... 'new_password1': 'abc123',
... 'new_password2': 'abc123',
... }
>>> form = SetPasswordForm(user, data)
>>> form.is_valid()
True
class PasswordChangeFormTest(TestCase):
### PasswordChangeForm:
fixtures = ['authtestdata.json']
The old password is incorrect.
def test_incorrect_password(self):
user = User.objects.get(username='testclient')
data = {
'old_password': 'test',
'new_password1': 'abc123',
'new_password2': 'abc123',
}
form = PasswordChangeForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(form["old_password"].errors,
[u'Your old password was entered incorrectly. Please enter it again.'])
>>> data = {
... 'old_password': 'test',
... 'new_password1': 'abc123',
... 'new_password2': 'abc123',
... }
>>> form = PasswordChangeForm(user, data)
>>> form.is_valid()
False
>>> form["old_password"].errors
[u'Your old password was entered incorrectly. Please enter it again.']
def test_password_verification(self):
# The two new passwords do not match.
user = User.objects.get(username='testclient')
data = {
'old_password': 'password',
'new_password1': 'abc123',
'new_password2': 'abc',
}
form = PasswordChangeForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(form["new_password2"].errors,
[u"The two password fields didn't match."])
>>> data = {
... 'old_password': 'test123',
... 'new_password1': 'abc123',
... 'new_password2': 'abc',
... }
>>> form = PasswordChangeForm(user, data)
>>> form.is_valid()
False
>>> form["new_password2"].errors
[u"The two password fields didn't match."]
def test_success(self):
# The success case.
user = User.objects.get(username='testclient')
data = {
'old_password': 'password',
'new_password1': 'abc123',
'new_password2': 'abc123',
}
form = PasswordChangeForm(user, data)
self.assertTrue(form.is_valid())
>>> data = {
... 'old_password': 'test123',
... 'new_password1': 'abc123',
... 'new_password2': 'abc123',
... }
>>> form = PasswordChangeForm(user, data)
>>> form.is_valid()
True
def test_field_order(self):
# Regression test - check the order of fields:
user = User.objects.get(username='testclient')
self.assertEqual(PasswordChangeForm(user, {}).fields.keys(),
['old_password', 'new_password1', 'new_password2'])
>>> PasswordChangeForm(user, {}).fields.keys()
['old_password', 'new_password1', 'new_password2']
class UserChangeFormTest(TestCase):
### UserChangeForm
fixtures = ['authtestdata.json']
>>> from django.contrib.auth.forms import UserChangeForm
>>> data = {'username': 'not valid'}
>>> form = UserChangeForm(data, instance=user)
>>> form.is_valid()
False
>>> form['username'].errors
[u'This value may contain only letters, numbers and @/./+/-/_ characters.']
def test_username_validity(self):
user = User.objects.get(username='testclient')
data = {'username': 'not valid'}
form = UserChangeForm(data, instance=user)
self.assertFalse(form.is_valid())
self.assertEqual(form['username'].errors,
[u'This value may contain only letters, numbers and @/./+/-/_ characters.'])
def test_bug_14242(self):
# A regression test, introduce by adding an optimization for the
# UserChangeForm.
class MyUserForm(UserChangeForm):
def __init__(self, *args, **kwargs):
super(MyUserForm, self).__init__(*args, **kwargs)
self.fields['groups'].help_text = 'These groups give users different permissions'
class Meta(UserChangeForm.Meta):
fields = ('groups',)
# Just check we can create it
form = MyUserForm({})
### PasswordResetForm
class PasswordResetFormTest(TestCase):
>>> from django.contrib.auth.forms import PasswordResetForm
>>> data = {'email':'not valid'}
>>> form = PasswordResetForm(data)
>>> form.is_valid()
False
>>> form['email'].errors
[u'Enter a valid e-mail address.']
fixtures = ['authtestdata.json']
def test_invalid_email(self):
data = {'email':'not valid'}
form = PasswordResetForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form['email'].errors,
[u'Enter a valid e-mail address.'])
def test_nonexistant_email(self):
# Test nonexistant email address
>>> data = {'email':'foo@bar.com'}
>>> form = PasswordResetForm(data)
>>> form.is_valid()
False
>>> form.errors
{'email': [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]}
data = {'email':'foo@bar.com'}
form = PasswordResetForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form.errors,
{'email': [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]})
# Test cleaned_data bug fix
>>> user = User.objects.create_user("jsmith3", "jsmith3@example.com", "test123")
>>> data = {'email':'jsmith3@example.com'}
>>> form = PasswordResetForm(data)
>>> form.is_valid()
True
>>> form.cleaned_data['email']
u'jsmith3@example.com'
def test_cleaned_data(self):
# Regression test
user = User.objects.create_user("jsmith3", "jsmith3@example.com", "test123")
data = {'email':'jsmith3@example.com'}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
self.assertEqual(form.cleaned_data['email'], u'jsmith3@example.com')
# bug #5605, preserve the case of the user name (before the @ in the email address)
# when creating a user.
>>> user = User.objects.create_user('forms_test2', 'tesT@EXAMple.com', 'test')
>>> user.email
'tesT@example.com'
>>> user = User.objects.create_user('forms_test3', 'tesT', 'test')
>>> user.email
'tesT'
"""
def test_bug_5605(self):
# bug #5605, preserve the case of the user name (before the @ in the
# email address) when creating a user.
user = User.objects.create_user('forms_test2', 'tesT@EXAMple.com', 'test')
self.assertEqual(user.email, 'tesT@example.com')
user = User.objects.create_user('forms_test3', 'tesT', 'test')
self.assertEqual(user.email, 'tesT')

View File

@ -1,5 +1,7 @@
from django.conf.urls.defaults import patterns
from django.contrib.auth.urls import urlpatterns
from django.contrib.auth.views import password_reset
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.template import Template, RequestContext
@ -14,5 +16,8 @@ urlpatterns += patterns('',
(r'^logout/custom_query/$', 'django.contrib.auth.views.logout', dict(redirect_field_name='follow')),
(r'^logout/next_page/$', 'django.contrib.auth.views.logout', dict(next_page='/somewhere/')),
(r'^remote_user/$', remote_user_auth_view),
(r'^password_reset_from_email/$', 'django.contrib.auth.views.password_reset', dict(from_email='staffmember@example.com')),
(r'^login_required/$', login_required(password_reset)),
(r'^login_required_login_url/$', login_required(password_reset, login_url='/somewhere/')),
)

View File

@ -36,6 +36,16 @@ class AuthViewsTestCase(TestCase):
settings.LANGUAGE_CODE = self.old_LANGUAGE_CODE
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
'password': password
}
)
self.assertEquals(response.status_code, 302)
self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
self.assert_(SESSION_KEY in self.client.session)
class PasswordResetTest(AuthViewsTestCase):
def test_email_not_found(self):
@ -52,6 +62,14 @@ class PasswordResetTest(AuthViewsTestCase):
self.assertEquals(response.status_code, 302)
self.assertEquals(len(mail.outbox), 1)
self.assert_("http://" in mail.outbox[0].body)
self.assertEquals(settings.DEFAULT_FROM_EMAIL, mail.outbox[0].from_email)
def test_email_found_custom_from(self):
"Email is sent if a valid email address is provided for password reset when a custom from_email is provided."
response = self.client.post('/password_reset_from_email/', {'email': 'staffmember@example.com'})
self.assertEquals(response.status_code, 302)
self.assertEquals(len(mail.outbox), 1)
self.assertEquals("staffmember@example.com", mail.outbox[0].from_email)
def _test_confirm_start(self):
# Start by creating the email
@ -118,15 +136,6 @@ class PasswordResetTest(AuthViewsTestCase):
class ChangePasswordTest(AuthViewsTestCase):
def login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
'password': password
}
)
self.assertEquals(response.status_code, 302)
self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
def fail_login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
@ -228,16 +237,6 @@ class LoginTest(AuthViewsTestCase):
class LogoutTest(AuthViewsTestCase):
urls = 'django.contrib.auth.tests.urls'
def login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
'password': password
}
)
self.assertEquals(response.status_code, 302)
self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
self.assert_(SESSION_KEY in self.client.session)
def confirm_logged_out(self):
self.assert_(SESSION_KEY not in self.client.session)

View File

@ -105,7 +105,7 @@ def redirect_to_login(next, login_url=None, redirect_field_name=REDIRECT_FIELD_N
def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html',
email_template_name='registration/password_reset_email.html',
password_reset_form=PasswordResetForm, token_generator=default_token_generator,
post_reset_redirect=None):
post_reset_redirect=None, from_email=None):
if post_reset_redirect is None:
post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done')
if request.method == "POST":
@ -114,6 +114,7 @@ def password_reset(request, is_admin_site=False, template_name='registration/pas
opts = {}
opts['use_https'] = request.is_secure()
opts['token_generator'] = token_generator
opts['from_email'] = from_email
if is_admin_site:
opts['domain_override'] = request.META['HTTP_HOST']
else:

View File

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

View File

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

View File

@ -5,11 +5,11 @@ from django.utils.translation import ugettext_lazy as _
class FlatpageForm(forms.ModelForm):
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/]+$',
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$',
help_text = _("Example: '/about/contact/'. Make sure to have leading"
" and trailing slashes."),
error_message = _("This value must contain only letters, numbers,"
" underscores, dashes or slashes."))
" dots, underscores, dashes, slashes or tildes."))
class Meta:
model = FlatPage

View File

@ -0,0 +1,63 @@
[
{
"pk": 1,
"model": "flatpages.flatpage",
"fields": {
"registration_required": false,
"title": "A Flatpage",
"url": "/flatpage/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it flat!",
"enable_comments": false
}
},
{
"pk": 2,
"model": "flatpages.flatpage",
"fields": {
"registration_required": false,
"title": "A Nested Flatpage",
"url": "/location/flatpage/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it flat and deep!",
"enable_comments": false
}
},
{
"pk": 101,
"model": "flatpages.flatpage",
"fields": {
"registration_required": true,
"title": "Sekrit Flatpage",
"url": "/sekrit/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it sekrit!",
"enable_comments": false
}
},
{
"pk": 102,
"model": "flatpages.flatpage",
"fields": {
"registration_required": true,
"title": "Sekrit Nested Flatpage",
"url": "/location/sekrit/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it sekrit and deep!",
"enable_comments": false
}
}
]

View File

@ -0,0 +1,99 @@
from django import template
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import ugettext as _
from django.conf import settings
register = template.Library()
class FlatpageNode(template.Node):
def __init__(self, context_name, starts_with=None, user=None):
self.context_name = context_name
if starts_with:
self.starts_with = template.Variable(starts_with)
else:
self.starts_with = None
if user:
self.user = template.Variable(user)
else:
self.user = None
def render(self, context):
flatpages = FlatPage.objects.filter(sites__id=settings.SITE_ID)
# If a prefix was specified, add a filter
if self.starts_with:
flatpages = flatpages.filter(
url__startswith=self.starts_with.resolve(context))
# If the provided user is not authenticated, or no user
# was provided, filter the list to only public flatpages.
if self.user:
user = self.user.resolve(context)
if not user.is_authenticated():
flatpages = flatpages.filter(registration_required=False)
else:
flatpages = flatpages.filter(registration_required=False)
context[self.context_name] = flatpages
return ''
def get_flatpages(parser, token):
"""
Retrieves all flatpage objects available for the current site and
visible to the specific user (or visible to all users if no user is
specified). Populates the template context with them in a variable
whose name is defined by the ``as`` clause.
An optional ``for`` clause can be used to control the user whose
permissions are to be used in determining which flatpages are visible.
An optional argument, ``starts_with``, can be applied to limit the
returned flatpages to those beginning with a particular base URL.
This argument can be passed as a variable or a string, as it resolves
from the template context.
Syntax::
{% get_flatpages ['url_starts_with'] [for user] as context_name %}
Example usage::
{% get_flatpages as flatpages %}
{% get_flatpages for someuser as flatpages %}
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}
"""
bits = token.split_contents()
syntax_message = _("%(tag_name)s expects a syntax of %(tag_name)s "
"['url_starts_with'] [for user] as context_name" %
dict(tag_name=bits[0]))
# Must have at 3-6 bits in the tag
if len(bits) >= 3 and len(bits) <= 6:
# If there's an even number of bits, there's no prefix
if len(bits) % 2 == 0:
prefix = bits[1]
else:
prefix = None
# The very last bit must be the context name
if bits[-2] != 'as':
raise template.TemplateSyntaxError(syntax_message)
context_name = bits[-1]
# If there are 5 or 6 bits, there is a user defined
if len(bits) >= 5:
if bits[-4] != 'for':
raise template.TemplateSyntaxError(syntax_message)
user = bits[-3]
else:
user = None
return FlatpageNode(context_name, starts_with=prefix, user=user)
else:
raise template.TemplateSyntaxError(syntax_message)
register.tag('get_flatpages', get_flatpages)

View File

@ -0,0 +1,5 @@
from django.contrib.flatpages.tests.csrf import *
from django.contrib.flatpages.tests.forms import *
from django.contrib.flatpages.tests.middleware import *
from django.contrib.flatpages.tests.templatetags import *
from django.contrib.flatpages.tests.views import *

View File

@ -0,0 +1,76 @@
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.test import TestCase, Client
class FlatpageCSRFTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.client = Client(enforce_csrf_checks=True)
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
csrf_middleware_class = 'django.middleware.csrf.CsrfViewMiddleware'
if csrf_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (csrf_middleware_class,)
if flatpage_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (flatpage_middleware_class,)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_view_flatpage(self):
"A flatpage can be served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_view_non_existent_flatpage(self):
"A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_authenticated_flatpage(self):
"A flatpage served through a view can require authentication"
response = self.client.get('/flatpage_root/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/flatpage_root/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")
def test_fallback_flatpage(self):
"A flatpage can be served by the fallback middlware"
response = self.client.get('/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_fallback_non_existent_flatpage(self):
"A non-existent flatpage raises a 404 when served by the fallback middlware"
response = self.client.get('/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_post_view_flatpage(self):
"POSTing to a flatpage served through a view will raise a CSRF error if no token is provided (Refs #14156)"
response = self.client.post('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 403)
def test_post_fallback_flatpage(self):
"POSTing to a flatpage served by the middleware will raise a CSRF error if no token is provided (Refs #14156)"
response = self.client.post('/flatpage/')
self.assertEquals(response.status_code, 403)
def test_post_unknown_page(self):
"POSTing to an unknown page isn't caught as a 403 CSRF error"
response = self.client.post('/no_such_page/')
self.assertEquals(response.status_code, 404)

View File

@ -0,0 +1,22 @@
from django.contrib.flatpages.admin import FlatpageForm
from django.test import TestCase
class FlatpageAdminFormTests(TestCase):
def setUp(self):
self.form_data = {
'title': "A test page",
'content': "This is a test",
'sites': [1],
}
def test_flatpage_admin_form_url_validation(self):
"The flatpage admin form validates correctly validates urls"
self.assertTrue(FlatpageForm(data=dict(url='/new_flatpage/', **self.form_data)).is_valid())
self.assertTrue(FlatpageForm(data=dict(url='/some.special~chars/', **self.form_data)).is_valid())
self.assertTrue(FlatpageForm(data=dict(url='/some.very_special~chars-here/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a space/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a % char/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a ! char/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a & char/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a ? char/', **self.form_data)).is_valid())

View File

@ -0,0 +1,67 @@
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.test import TestCase
class FlatpageMiddlewareTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
if flatpage_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (flatpage_middleware_class,)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_view_flatpage(self):
"A flatpage can be served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_view_non_existent_flatpage(self):
"A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_authenticated_flatpage(self):
"A flatpage served through a view can require authentication"
response = self.client.get('/flatpage_root/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/flatpage_root/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")
def test_fallback_flatpage(self):
"A flatpage can be served by the fallback middlware"
response = self.client.get('/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_fallback_non_existent_flatpage(self):
"A non-existent flatpage raises a 404 when served by the fallback middlware"
response = self.client.get('/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_fallback_authenticated_flatpage(self):
"A flatpage served by the middleware can require authentication"
response = self.client.get('/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")

View File

@ -0,0 +1 @@
<h1>Oh Noes!</h1>

View File

@ -0,0 +1,10 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
<p>{{ flatpage.content }}</p>
</body>
</html>

View File

@ -0,0 +1,134 @@
import os
from django.conf import settings
from django.contrib.auth.models import AnonymousUser, User
from django.template import Template, Context, TemplateSyntaxError
from django.test import TestCase
class FlatpageTemplateTagTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
if flatpage_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (flatpage_middleware_class,)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
self.me = User.objects.create_user('testuser', 'test@example.com', 's3krit')
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_get_flatpages_tag(self):
"The flatpage template tag retrives unregistered prefixed flatpages by default"
out = Template(
"{% load flatpages %}"
"{% get_flatpages as flatpages %}"
"{% for page in flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context())
self.assertEquals(out, "A Flatpage,A Nested Flatpage,")
def test_get_flatpages_tag_for_anon_user(self):
"The flatpage template tag retrives unregistered flatpages for an anonymous user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages for anonuser as flatpages %}"
"{% for page in flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'anonuser': AnonymousUser()
}))
self.assertEquals(out, "A Flatpage,A Nested Flatpage,")
def test_get_flatpages_tag_for_user(self):
"The flatpage template tag retrives all flatpages for an authenticated user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages for me as flatpages %}"
"{% for page in flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'me': self.me
}))
self.assertEquals(out, "A Flatpage,A Nested Flatpage,Sekrit Nested Flatpage,Sekrit Flatpage,")
def test_get_flatpages_with_prefix(self):
"The flatpage template tag retrives unregistered prefixed flatpages by default"
out = Template(
"{% load flatpages %}"
"{% get_flatpages '/location/' as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context())
self.assertEquals(out, "A Nested Flatpage,")
def test_get_flatpages_with_prefix_for_anon_user(self):
"The flatpage template tag retrives unregistered prefixed flatpages for an anonymous user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages '/location/' for anonuser as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'anonuser': AnonymousUser()
}))
self.assertEquals(out, "A Nested Flatpage,")
def test_get_flatpages_with_prefix_for_user(self):
"The flatpage template tag retrive prefixed flatpages for an authenticated user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages '/location/' for me as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'me': self.me
}))
self.assertEquals(out, "A Nested Flatpage,Sekrit Nested Flatpage,")
def test_get_flatpages_with_variable_prefix(self):
"The prefix for the flatpage template tag can be a template variable"
out = Template(
"{% load flatpages %}"
"{% get_flatpages location_prefix as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'location_prefix': '/location/'
}))
self.assertEquals(out, "A Nested Flatpage,")
def test_parsing_errors(self):
"There are various ways that the flatpages template tag won't parse"
render = lambda t: Template(t).render(Context())
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages as %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages cheesecake flatpages %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages as flatpages asdf%}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages cheesecake user as flatpages %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages for user as flatpages asdf%}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages prefix for user as flatpages asdf%}")

View File

@ -0,0 +1,8 @@
from django.conf.urls.defaults import *
# special urls for flatpage test cases
urlpatterns = patterns('',
(r'^flatpage_root', include('django.contrib.flatpages.urls')),
(r'^accounts/', include('django.contrib.auth.urls')),
)

View File

@ -0,0 +1,72 @@
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.flatpages.models import FlatPage
from django.test import TestCase
class FlatpageViewTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
if flatpage_middleware_class in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES = tuple(m for m in settings.MIDDLEWARE_CLASSES if m != flatpage_middleware_class)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_view_flatpage(self):
"A flatpage can be served through a view"
response = self.client.get('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_view_non_existent_flatpage(self):
"A non-existent flatpage raises 404 when served through a view"
response = self.client.get('/flatpage_root/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_authenticated_flatpage(self):
"A flatpage served through a view can require authentication"
response = self.client.get('/flatpage_root/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/flatpage_root/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")
def test_fallback_flatpage(self):
"A fallback flatpage won't be served if the middleware is disabled"
response = self.client.get('/flatpage/')
self.assertEquals(response.status_code, 404)
def test_fallback_non_existent_flatpage(self):
"A non-existent flatpage won't be served if the fallback middlware is disabled"
response = self.client.get('/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_flatpage_special_chars(self):
"A flatpage with special chars in the URL can be served through a view"
fp = FlatPage.objects.create(
url="/some.very_special~chars-here/",
title="A very special page",
content="Isn't it special!",
enable_comments=False,
registration_required=False,
)
fp.sites.add(1)
response = self.client.get('/flatpage_root/some.very_special~chars-here/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it special!</p>")

View File

@ -13,10 +13,13 @@ DEFAULT_TEMPLATE = 'flatpages/default.html'
# when a 404 is raised, which often means CsrfViewMiddleware.process_view
# has not been called even if CsrfViewMiddleware is installed. So we need
# to use @csrf_protect, in case the template needs {% csrf_token %}.
@csrf_protect
# However, we can't just wrap this view; if no matching flatpage exists,
# or a redirect is required for authentication, the 404 needs to be returned
# without any CSRF checks. Therefore, we only
# CSRF protect the internal implementation.
def flatpage(request, url):
"""
Flat page view.
Public interface to the flat page view.
Models: `flatpages.flatpages`
Templates: Uses the template defined by the ``template_name`` field,
@ -30,6 +33,13 @@ def flatpage(request, url):
if not url.startswith('/'):
url = "/" + url
f = get_object_or_404(FlatPage, url__exact=url, sites__id__exact=settings.SITE_ID)
return render_flatpage(request, f)
@csrf_protect
def render_flatpage(request, f):
"""
Internal interface to the flat page view.
"""
# If registration is required for accessing this page, and the user isn't
# logged in, redirect to the login page.
if f.registration_required and not request.user.is_authenticated():

View File

@ -48,7 +48,7 @@ class FormWizard(object):
def num_steps(self):
"Helper method that returns the number of steps."
# You might think we should just set "self.form_list = len(form_list)"
# You might think we should just set "self.num_steps = len(form_list)"
# in __init__(), but this calculation needs to be dynamic, because some
# hook methods might alter self.form_list.
return len(self.form_list)

View File

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

View File

@ -233,8 +233,6 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
})
self.geography_operators = {
'bboverlaps' : PostGISOperator('&&'),
'exact' : PostGISOperator('~='),
'same_as' : PostGISOperator('~='),
}
# Creating a dictionary lookup of all GIS terms for PostGIS.

View File

@ -51,7 +51,7 @@ class DatabaseWrapper(SqliteDatabaseWrapper):
self.connection.create_function("django_extract", 2, _sqlite_extract)
self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
self.connection.create_function("regexp", 2, _sqlite_regexp)
connection_created.send(sender=self.__class__)
connection_created.send(sender=self.__class__, connection=self)
## From here on, customized for GeoDjango ##

View File

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

View File

@ -14,10 +14,10 @@ if lib_path:
lib_names = None
elif os.name == 'nt':
# Windows NT shared library
lib_names = ['gdal16', 'gdal15']
lib_names = ['gdal17', 'gdal16', 'gdal15']
elif os.name == 'posix':
# *NIX library names.
lib_names = ['gdal', 'GDAL', 'gdal1.6.0', 'gdal1.5.0', 'gdal1.4.0']
lib_names = ['gdal', 'GDAL', 'gdal1.7.0', 'gdal1.6.0', 'gdal1.5.0', 'gdal1.4.0']
else:
raise OGRException('Unsupported OS "%s"' % os.name)

View File

@ -1,115 +1,108 @@
import sys
import unittest
from django.conf import settings
from django.db.models import get_app
from django.test.simple import build_suite, DjangoTestSuiteRunner
def run_tests(*args, **kwargs):
from django.test.simple import run_tests as base_run_tests
return base_run_tests(*args, **kwargs)
def geo_suite():
"""
Builds a test suite for the GIS package. This is not named
`suite` so it will not interfere with the Django test suite (since
spatial database tables are required to execute these tests on
some backends).
"""
from django.conf import settings
def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, extra_tests=None):
import warnings
warnings.warn(
'The run_gis_tests() test runner has been deprecated in favor of GeoDjangoTestSuiteRunner.',
PendingDeprecationWarning
)
test_runner = GeoDjangoTestSuiteRunner(verbosity=verbosity, interactive=interactive, failfast=failfast)
return test_runner.run_tests(test_labels, extra_tests=extra_tests)
class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
def setup_test_environment(self, **kwargs):
super(GeoDjangoTestSuiteRunner, self).setup_test_environment(**kwargs)
from django.db import connection
from django.contrib.gis.geos import GEOS_PREPARE
from django.contrib.gis.gdal import HAS_GDAL
from django.contrib.gis.utils import HAS_GEOIP
from django.contrib.gis.tests.utils import postgis, mysql
from django.db import connection
from django.utils.importlib import import_module
gis_tests = []
# Adding the GEOS tests.
from django.contrib.gis.geos import tests as geos_tests
gis_tests.append(geos_tests.suite())
# Getting and storing the original values of INSTALLED_APPS and
# the ROOT_URLCONF.
self.old_installed = settings.INSTALLED_APPS
self.old_root_urlconf = settings.ROOT_URLCONF
# Tests that require use of a spatial database (e.g., creation of models)
test_apps = ['geoapp', 'relatedapp']
if postgis and connection.ops.geography:
self.geo_apps = ['geoapp', 'relatedapp']
if connection.ops.postgis and connection.ops.geography:
# Test geography support with PostGIS 1.5+.
test_apps.append('geogapp')
# Tests that do not require setting up and tearing down a spatial database.
test_suite_names = [
'test_measure',
]
self.geo_apps.append('geogapp')
if HAS_GDAL:
# These tests require GDAL.
if not mysql:
test_apps.append('distapp')
# The following GeoDjango test apps depend on GDAL support.
if not connection.ops.mysql:
self.geo_apps.append('distapp')
# Only PostGIS using GEOS 3.1+ can support 3D so far.
if postgis and GEOS_PREPARE:
test_apps.append('geo3d')
# 3D apps use LayerMapping, which uses GDAL.
if connection.ops.postgis and GEOS_PREPARE:
self.geo_apps.append('geo3d')
test_suite_names.extend(['test_spatialrefsys', 'test_geoforms'])
test_apps.append('layermap')
self.geo_apps.append('layermap')
# Adding the GDAL tests.
from django.contrib.gis.gdal import tests as gdal_tests
gis_tests.append(gdal_tests.suite())
else:
print >>sys.stderr, "GDAL not available - no tests requiring GDAL will be run."
if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
test_suite_names.append('test_geoip')
# Adding the rest of the suites from the modules specified
# in the `test_suite_names`.
for suite_name in test_suite_names:
tsuite = import_module('django.contrib.gis.tests.' + suite_name)
gis_tests.append(tsuite.suite())
return gis_tests, test_apps
def run_gis_tests(test_labels, **kwargs):
"""
Use this routine as the TEST_RUNNER in your settings in order to run the
GeoDjango test suite. This must be done as a database superuser for
PostGIS, so read the docstring in `run_test()` below for more details.
"""
from django.conf import settings
from django.db.models import loading
from django.contrib.gis.tests.utils import mysql
# Getting initial values.
old_installed = settings.INSTALLED_APPS
old_root_urlconf = settings.ROOT_URLCONF
# Overridding the INSTALLED_APPS with only what we need,
# to prevent unnecessary database table creation.
# Constructing the new INSTALLED_APPS, and including applications
# within the GeoDjango test namespace (`self.geo_apps`).
new_installed = ['django.contrib.sites',
'django.contrib.sitemaps',
'django.contrib.gis',
]
new_installed.extend(['django.contrib.gis.tests.%s' % app
for app in self.geo_apps])
settings.INSTALLED_APPS = new_installed
# Setting the URLs.
settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
# Creating the test suite, adding the test models to INSTALLED_APPS
# so they will be tested.
gis_tests, test_apps = geo_suite()
for test_model in test_apps:
module_name = 'django.contrib.gis.tests.%s' % test_model
new_installed.append(module_name)
def teardown_test_environment(self, **kwargs):
super(GeoDjangoTestSuiteRunner, self).teardown_test_environment(**kwargs)
settings.INSTALLED_APPS = self.old_installed
settings.ROOT_URLCONF = self.old_root_urlconf
# Resetting the loaded flag to take into account what we appended to
# the INSTALLED_APPS (since this routine is invoked through
# django/core/management, it caches the apps; this ensures that syncdb
# will see our appended models)
settings.INSTALLED_APPS = new_installed
loading.cache.loaded = False
def build_suite(self, test_labels, extra_tests=None, **kwargs):
"""
This method is overridden to construct a suite consisting only of tests
for GeoDjango.
"""
suite = unittest.TestSuite()
kwargs['extra_tests'] = gis_tests
# Adding the GEOS tests.
from django.contrib.gis.geos import tests as geos_tests
suite.addTest(geos_tests.suite())
# Running the tests using the GIS test runner.
result = run_tests(test_labels, **kwargs)
# Adding the measurment tests.
from django.contrib.gis.tests import test_measure
suite.addTest(test_measure.suite())
# Restoring modified settings.
settings.INSTALLED_APPS = old_installed
settings.ROOT_URLCONF = old_root_urlconf
# Adding GDAL tests, and any test suite that depends on GDAL, to the
# suite if GDAL is available.
from django.contrib.gis.gdal import HAS_GDAL
if HAS_GDAL:
from django.contrib.gis.gdal import tests as gdal_tests
suite.addTest(gdal_tests.suite())
return result
from django.contrib.gis.tests import test_spatialrefsys, test_geoforms
suite.addTest(test_spatialrefsys.suite())
suite.addTest(test_geoforms.suite())
else:
sys.stderr.write('GDAL not available - no tests requiring GDAL will be run.\n')
# Add GeoIP tests to the suite, if the library and data is available.
from django.contrib.gis.utils import HAS_GEOIP
if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
from django.contrib.gis.tests import test_geoip
suite.addTest(test_geoip.suite())
# Finally, adding the suites for each of the GeoDjango test apps.
for app_name in self.geo_apps:
suite.addTest(build_suite(get_app(app_name)))
return suite

View File

@ -44,6 +44,10 @@ class GeographyTest(TestCase):
# `@` operator not available.
self.assertRaises(ValueError, City.objects.filter(point__contained=z.poly).count)
# Regression test for #14060, `~=` was never really implemented for PostGIS.
htown = City.objects.get(name='Houston')
self.assertRaises(ValueError, City.objects.get, point__exact=htown.point)
def test05_geography_layermapping(self):
"Testing LayerMapping support on models with geography fields."
# There is a similar test in `layermap` that uses the same data set,

View File

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

View File

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

View File

@ -7,43 +7,43 @@ when explicitly needed.
"""
STATE_CHOICES = (
'KA', 'Karnataka',
'AP', 'Andhra Pradesh',
'KL', 'Kerala',
'TN', 'Tamil Nadu',
'MH', 'Maharashtra',
'UP', 'Uttar Pradesh',
'GA', 'Goa',
'GJ', 'Gujarat',
'RJ', 'Rajasthan',
'HP', 'Himachal Pradesh',
'JK', 'Jammu and Kashmir',
'AR', 'Arunachal Pradesh',
'AS', 'Assam',
'BR', 'Bihar',
'CG', 'Chattisgarh',
'HR', 'Haryana',
'JH', 'Jharkhand',
'MP', 'Madhya Pradesh',
'MN', 'Manipur',
'ML', 'Meghalaya',
'MZ', 'Mizoram',
'NL', 'Nagaland',
'OR', 'Orissa',
'PB', 'Punjab',
'SK', 'Sikkim',
'TR', 'Tripura',
'UA', 'Uttarakhand',
'WB', 'West Bengal',
('KA', 'Karnataka'),
('AP', 'Andhra Pradesh'),
('KL', 'Kerala'),
('TN', 'Tamil Nadu'),
('MH', 'Maharashtra'),
('UP', 'Uttar Pradesh'),
('GA', 'Goa'),
('GJ', 'Gujarat'),
('RJ', 'Rajasthan'),
('HP', 'Himachal Pradesh'),
('JK', 'Jammu and Kashmir'),
('AR', 'Arunachal Pradesh'),
('AS', 'Assam'),
('BR', 'Bihar'),
('CG', 'Chattisgarh'),
('HR', 'Haryana'),
('JH', 'Jharkhand'),
('MP', 'Madhya Pradesh'),
('MN', 'Manipur'),
('ML', 'Meghalaya'),
('MZ', 'Mizoram'),
('NL', 'Nagaland'),
('OR', 'Orissa'),
('PB', 'Punjab'),
('SK', 'Sikkim'),
('TR', 'Tripura'),
('UA', 'Uttarakhand'),
('WB', 'West Bengal'),
# Union Territories
'AN', 'Andaman and Nicobar',
'CH', 'Chandigarh',
'DN', 'Dadra and Nagar Haveli',
'DD', 'Daman and Diu',
'DL', 'Delhi',
'LD', 'Lakshadweep',
'PY', 'Pondicherry',
('AN', 'Andaman and Nicobar'),
('CH', 'Chandigarh'),
('DN', 'Dadra and Nagar Haveli'),
('DD', 'Daman and Diu'),
('DL', 'Delhi'),
('LD', 'Lakshadweep'),
('PY', 'Pondicherry'),
)
STATES_NORMALIZED = {

View File

@ -22,7 +22,7 @@ Paragraph 2 with "quotes" and @code@"""
t = Template("{{ textile_content|textile }}")
rendered = t.render(Context(locals())).strip()
if textile:
self.assertEqual(rendered, """<p>Paragraph 1</p>
self.assertEqual(rendered.replace('\t', ''), """<p>Paragraph 1</p>
<p>Paragraph 2 with &#8220;quotes&#8221; and <code>code</code></p>""")
else:

View File

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

View File

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

View File

@ -65,11 +65,12 @@ class Sitemap(object):
urls = []
for item in self.paginator.page(page).object_list:
loc = "http://%s%s" % (current_site.domain, self.__get('location', item))
priority = self.__get('priority', item, None)
url_info = {
'location': loc,
'lastmod': self.__get('lastmod', item, None),
'changefreq': self.__get('changefreq', item, None),
'priority': self.__get('priority', item, None)
'priority': str(priority is not None and priority or '')
}
urls.append(url_info)
return urls
@ -78,7 +79,7 @@ class FlatPageSitemap(Sitemap):
def items(self):
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
return current_site.flatpage_set.all()
return current_site.flatpage_set.filter(registration_required=False)
class GenericSitemap(Sitemap):
priority = None

View File

@ -0,0 +1 @@
# This file intentionally left blank

View File

@ -0,0 +1 @@
from django.contrib.sitemaps.tests.basic import *

View File

@ -0,0 +1,77 @@
from datetime import date
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.flatpages.models import FlatPage
from django.test import TestCase
from django.utils.formats import localize
from django.utils.translation import activate
class SitemapTests(TestCase):
urls = 'django.contrib.sitemaps.tests.urls'
def setUp(self):
self.old_USE_L10N = settings.USE_L10N
# Create a user that will double as sitemap content
User.objects.create_user('testuser', 'test@example.com', 's3krit')
def tearDown(self):
settings.USE_L10N = self.old_USE_L10N
def test_simple_sitemap(self):
"A simple sitemap can be rendered"
# Retrieve the sitemap.
response = self.client.get('/simple/sitemap.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://example.com/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
</urlset>
""" % date.today().strftime('%Y-%m-%d'))
def test_localized_priority(self):
"The priority value should not be localized (Refs #14164)"
# Localization should be active
settings.USE_L10N = True
activate('fr')
self.assertEqual(u'0,3', localize(0.3))
# Retrieve the sitemap. Check that priorities
# haven't been rendered in localized format
response = self.client.get('/simple/sitemap.xml')
self.assertContains(response, '<priority>0.5</priority>')
self.assertContains(response, '<lastmod>%s</lastmod>' % date.today().strftime('%Y-%m-%d'))
def test_generic_sitemap(self):
"A minimal generic sitemap can be rendered"
# Retrieve the sitemap.
response = self.client.get('/generic/sitemap.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://example.com/users/testuser/</loc></url>
</urlset>
""")
def test_flatpage_sitemap(self):
"Basic FlatPage sitemap test"
public = FlatPage.objects.create(
url=u'/public/',
title=u'Public Page',
enable_comments=True,
registration_required=False,
)
public.sites.add(settings.SITE_ID)
private = FlatPage.objects.create(
url=u'/private/',
title=u'Public Page',
enable_comments=True,
registration_required=True
)
private.sites.add(settings.SITE_ID)
response = self.client.get('/flatpages/sitemap.xml')
# Public flatpage should be in the sitemap
self.assertContains(response, '<loc>http://example.com%s</loc>' % public.url)
# Private flatpage should not be in the sitemap
self.assertNotContains(response, '<loc>http://example.com%s</loc>' % private.url)

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